From 4f3d3596b24b5bd86a4fd92801d0ffb68711d06a Mon Sep 17 00:00:00 2001 From: euronion Date: Tue, 1 Jul 2025 11:40:25 +0200 Subject: [PATCH 01/81] dev: Use cases, design and context --- docs/class-diagram.puml | 232 +++++++++++++++++++++++++ docs/copilot-context.md | 22 +++ docs/design.md | 374 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 628 insertions(+) create mode 100644 docs/class-diagram.puml create mode 100644 docs/copilot-context.md create mode 100644 docs/design.md diff --git a/docs/class-diagram.puml b/docs/class-diagram.puml new file mode 100644 index 00000000..0bbdbdf1 --- /dev/null +++ b/docs/class-diagram.puml @@ -0,0 +1,232 @@ +@startuml Class Diagram +class UnitValue { + - value: float + - unit: str +} + +note left of UnitValue::unit + Unit should be able to accomodate any unit of measurement, + currencies+years, LHVs and different energy carriers. + e.g. EUR_2020, kWh_electricity, kWh_hydrogen_LHV +end note + +class Source { + - name: str + - authors: str + - url: str + - url_archive: str + - urldate: str + - urldate_archive: str + + + store_in_wayback() + + retrieve_from_wayback() +} + +note right of Source::store_in_wayback + Stores the source in the Internet Archive's Wayback Machine, + to keep it accessible in the future. +end note + +note right of Source::retrieve_from_wayback + Retrieves the archive of the source, e.g., from a URL. +end note + +class Parameter { + - quantity: UnitValue + - provenance: str + - note: str + - sources: SourceContainer +} + +Parameter --> UnitValue : quantity + +note right of Parameter + Encapsulates a value, its unit (via UnitValue, as quantity), + data provenance (via sources). +end note + +class Technology { + - region: str + - case: str + - year: int + - technology: str + - detailed_technology: str + - capacity: Parameter + - investment: Parameter + - specific_investment: Parameter + - lifetime: Parameter + - wacc: Parameter + // Parameters are examples + // The user should be able to freely add more parameters + - ...: Parameter + // To distinguish different inputs/outputs, use prefixes like + - input-hydrogen: Parameter + - input-electricity: Parameter + - ... + - output-hydrogen: Parameter + - output-electricity: Parameter + + + adjust_currency(): Technology // or inplace + + adjust_region(): Technology // or inplace + + adjust_scale(): Technology // or inplace + + calculate_EAC(): Parameter // or inplace + + calculate_efficiency(): Parameter // or inplace + + calculate_specific_investment(): Parameter // or inplace +} + +note right of Technology::inputs + A technology generally represents a conversion between + an input and an output. These are all the inputs, e.g. + quantity of water and electricity. +end note + +note right of Technology::outputs + A technology generally represents a conversion between + an input and an output. These are all the outputs, e.g. + quantity hydrogen, oxygen and heat. +end note + +note right of Technology::adjust_currency + Changes the currency used by all attributes using currencies. +end note + +note right of Technology::adjust_region + Based on yet-to-be-determined logic and inputs, change the + attributes of the Technology to match a different region. +end note + +note right of Technology::adjust_scale + Scales some members values (e.g., capacity, investment) to a + different capacity based on a scaling factor. +end note + +note right of Technology::calculate_EAC + The `calculate_XXX` methods use attributes from the + Technology object to calculate the values of missing attributes + (or potentially calculate and then compare with current values + to check for consistency). +end note + +class Container { + - schema_name: str + - schema_path: Path + + get(**criteria): object | Container | None + + to_csv() + + to_excel() + + to_dataframe() +} + +note top of Container + Consider 'Container' as abstract base class for all containers + for unifying the common export and schema-related functionality + required by all data-holding classes. +end note + +note left of Container::schema_name + The name of the schema used for this container, e.g. currently "technologies" or "sources". + This is used to identify the type of data contained in the container. +end note + +note left of Container::get + Provides a generic get(**criteria) + method to retrieve contained objects matching selection criteria: + - If exactly one object matches, returns that object or a Container with this one object. + - If multiple objects match, returns a Container of the same type with the matches. + - If no matches, returns None or an empty Container. +end note + +note left of Container::to_csv + Export the data to a csv file for sharing / usage in e.g. Excel, ... . + Aligned with datapackage schema. + e.g. all {technology} or {source} objects. + Like the current Technologies(...).to_csv() method. +end note + +note left of Container::to_excel + Export all the data to a excel file for usage in Excel and similar tools, ... . + Aligned with datapackage schema. +end note + +note left of Container::to_dataframe + Flatten the Container and its members into a pandas DataFrame, that can be manipulated. + Dataframe should be compatible with the datapackage schema, such that it can be used for e.g. the to_csv() method. +end note + + +class TechnologyContainer { + - technologies: Iterable + + get(**criteria): Technology | TechnologyContainer | None + + create_projection(): TechnologyContainer + ' TODO: Think about more methods here +} + +note right of TechnologyContainer::get + Implements the generic get method from "Container" for "TechnologyContainer". + Filters contained Technology objects by the attributes and returns matches: + region, case, year, technology, detailed_technology. + - If exactly one Technology matches, returns that Technology. + - If multiple Technologies match, returns a TechnologyContainer with the matches. + - If no matches, returns None or an empty TechnologyContainer. +end note + +note right of TechnologyContainer::create_projection + e.g. learning curve, interpolation, extrapolation; + based on the Technology objects in the container. + Either returns a new TechnologyContainer or adds the + Technology objects to the current container. +end note + +class SourceContainer { + - sources: Iterable + + retrieve_all_archives() +} + +note left of SourceContainer::retrieve_all_archives + Triggers the retrieve_from_wayback method for all sources + and stores the files locally. +end note + +class Datapackage { + - name: str + - path: Path + - technologies: TechnologyContainer + - sources: SourceContainer + - // potentially other Containers in the future + + to_datapackage() +} + +note top of Datapackage + Represents a datapackage, which is a collection of data files + and metadata that describes the data. + Our package includes pre-packaged data in this format and allows + enables to read and write data in this standardised way. + Currently implemented through frictionless with .csv and schema.json files. +end note + +note right of Datapackage::name + Currently we use "source" as a reference to pre-packaged data and for a column in "technologies.csv". + The Datapackage.name would substitute for referencing to pre-packaged data, e.g. "example01" would be + a packaged data included with `technologydata`. +end note + +note right of Datapackage::technologies + Derived from the TechnologyContainer. +end note + +note right of Datapackage::sources + Derived from all Source objects that are related to the TechnologyContainer (i.e., all sources referenced by technologies and their parameters). +end note + +note right of Datapackage::to_datapackage + Exports all member Source and TechnologyContainer to a folder following the datapackage + specification, including the schema .json files and the .csv files. +end note + +Container <|-- TechnologyContainer +Container <|-- SourceContainer +Parameter --> SourceContainer : sources +Technology --> "*" Parameter : uses for its members +TechnologyContainer --> "*" Technology : consists of +SourceContainer --> "*" Source : consists of +Datapackage --> "1" TechnologyContainer : contains +@enduml \ No newline at end of file diff --git a/docs/copilot-context.md b/docs/copilot-context.md new file mode 100644 index 00000000..48efa9d9 --- /dev/null +++ b/docs/copilot-context.md @@ -0,0 +1,22 @@ +## General + +* Description of use cases in `docs/design.md` +* Class diagramm in `docs/class-diagram.puml` + +## Tools + +* `ruff` for formatting and linting +* `uv` for package management with `pyproject.toml` for configuration and package metadata +* `pytest` for testing all classes and methods + * a `tests/conftest.py` for all the fixtures + * a `tests//input` and `tests//output` for input and output files +* `mypy` for type checking +* `pre-commit` for setting up linting, formatting and checking hooks, configured via `.pre-commit-config.yaml` +* `pydantic` for data validation +* `mkdocs` for documentation generation, configured via `docs/mkdocs.yaml` + +## Packages to depend on + +* `pydeflate` for currency conversions and inflation adjustments +* `pint` for unit conversions +* `savepagenow` for archiving web pages using the Wayback Machine \ No newline at end of file diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 00000000..31064d38 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,374 @@ +# Design + +1. [Design](#design) + 1. [Target audience](#target-audience) + 2. [Use Cases](#use-cases) + 1. [🧾 UC-001: Screen techno-economic inputs for validity and completeness](#uc-001-screen-techno-economic-inputs-for-validity-and-completeness) + 2. [🧾 UC-002: Harmonize multiple input datasets](#uc-002-harmonize-multiple-input-datasets) + 3. [🧾 UC-003: Transform assumptions into model-ready formats](#uc-003-transform-assumptions-into-model-ready-formats) + 4. [🧾 UC-004: Compare techno-economic indicators across datasets](#uc-004-compare-techno-economic-indicators-across-datasets) + 5. [🧾 UC-005: Audit data provenance and transformation trace](#uc-005-audit-data-provenance-and-transformation-trace) + + +`technologydata` is designed for energy system modellers in mind. +It intendeds to serve common use cases encountered during the design, development and execution of energy system model experiments, such as: + +* Screening techno-economic inputs for energy systems +* Comparing techno-economics indicators +* Harmonizing inputs +* Modelling of input assumptions for gap filling +* Transformation of assumptions into model-ready input formats + +The project was started for PyPSA-Eur and has since then been expanded to serve more models and purposes. +As such it has been leaning towards serving the purposes of PyPSA-Eur and related models. +We hope to expand it to serve the wider energy system modeling community and a such welcome suggestions and contributions. + +## Target audience + +The users we target are Energy System Modellers and Analysts. +We assume they are all: + +* Familiar with the concept of techno-economics on how to describe technical and economic parameters of technologies for energy system models +* Familiar with the methodology of transforming techno-economic parameters for alignment and harmonization + +The users differ in their experience in these fields, but are generally aware of the methodological background behind +the transformations that we make available, like inflation adjustments, currency conversions or unit conversions. + +* They prefer simplicity and robustness in use over being able to customize the transformations. +* They would like to be offered a range of options to choose from, but not too many. +* They would like to be able to use the package without having to read too much documentation, but require clear documentation on the transformations that are applied. +* Data provenance and reproducibility are important to them, so they need to be able to trace data back to its source and understand all individual steps that were applied in the transformation process to the data. + +The users differ in their experience with Python and programming in general, we aim to serve three main user types: + +1. Programmers and Data Engineers: + * Well familiar with using Python and object-oriented programming languages, data processing and exchange formats. + * Interacts with the package through Python scripts, Python modules and Jupyter notebooks. +2. Energy System Modeller: + * Only basic Python programming skills. + * Interacts with the package through a Jupyter notebook or a Python script; may want to simply access and inspect the data without writing and executing code. +3. Energy Analyst: + * No programming skills or only very basic Python skills like using pandas or DataFrames. + * Interacts with the package either through a Jupyter notebook or wants to be able to use csv / Spreadsheet files for inspection and use of the data. + +## Use Cases + +Below follow central use cases that we want to serve with `technologydata`. + +### 🧾 UC-001: Screen techno-economic inputs for validity and completeness + +#### πŸ§‘β€πŸ’» Actor(s) +- **Primary**: Energy System Modeller, Programmer +- **Secondary**: Energy Analyst (if reviewing pre-screened data) + +#### 🎯 Goal +Detect and correct inconsistencies or omissions in techno-economic input data, ensuring it adheres to the package's schema and parameter constraints. + +#### πŸ“š Pre-conditions +- Python environment with `technologydata` installed +- Input data provided as: + - JSON (conforming to data schema) + - package-provided JSON files (conforming to schema) + - user-provided e.g. through the `technologydata` class-interface or through a special pandas DataFrame +- Users are familiar with the structure of `Technology`, `Parameter`, and `Source` classes + +#### 🚦 Trigger +- Instantiation of one or more `Technology` object with user-provided or pre-compiled data +- Manual invocation of validation or consistency-check method + +#### 🧡 Main Flow + +1. User gets/loads or defines technology input (via JSON, DataFrame, or the packaged data). +2. `Technology` object is instantiated, triggering automatic validation. +3. Schema checks enforce: + - Presence of required fields (e.g., name, parameter value, unit, source) + - Consistency between parameters (e.g., energy unit alignment) +4. User manually runs `.check_consistency()` or similar method to detect conflicting or incomplete parameters. +5. User manually runs `.calculate_parameters()` to derive + - specific missing parameters based on known rules (e.g., specific investment, EAC), or + - all missing parameters that can be derived from the existing parameters +6. The User can manually update parameters, either overwriting existing or adding missing ones. +7. Validated and completed `Technology` object is now ready for transformation or analysis. + +#### πŸ” Alternate Flows + +- **Invalid schema**: + - System raises a validation exception and rejects the data. +- **Inconsistent parameters**: + - Warnings are logged; object remains instantiable but marked as incomplete. +- **Partial data**: + - User is able to complete missing fields to the `Technology` object + +#### βœ… Post-conditions +- One or more `Technology` objects validated and completed with all parameters that can be derived, or +- Errors on schema-violations and Warning about inconsistencies are logged. + +#### πŸ§ͺ Sample Input/Output + +```python +from technologydata import DataPackage, Parameter, Technology, Source +dp = DataPackage.from_json("path/to/data_package") # triggers validation +techs = dp.technologies # Access the TechnologyContainer + +techs.check_consistency() # Checks all technologies for consistency +techs = techs.calculate_parameters(parameters=["specific-investment", "eac"]) + +tech = techs[0] # Access a specific Technology object + +tech.check_consistency() # Check consistency of a single Technology object +tech = tech.calculate_parameters(parameters="") # Calculate missing parameters + +# Manually created Technology object +src = Source(name="A source", url="http://example.com/source") +src2 = Source(name="Another source", url="http://example.com/source2") +tech = Technology( + name="Example Technology", + parameters={ + "specific-investment": Parameter(value=1000, unit="EUR_2020/kW", sources=src), + "investment": Parameter(value=9000, unit="EUR_2020", sources=src2), + "lifetime": Parameter(value=20, unit="years", sources=[src,src2]) + }, +) + +print(tech["lifetime"]) # Access and show a specific parameter (value, unit, sources) +tech["lifetime"].value = 50 # Update a parameter value +``` + +#### πŸ“Š Importance & Frequency + +* Importance: High +* Usage Frequency: Frequent, core workflow entry point + +#### πŸ“Œ Notes + +* Consistency logic includes checks for units, and dependency constraints between parameters (e.g. one parameter may be derived from one or more other parameters). +* Schema-based validation is extensible to new parameter types and sources. + +### 🧾 UC-002: Harmonize multiple input datasets + +#### πŸ§‘β€πŸ’» Actor(s) +- **Primary**: Energy System Modeller, Energy Analyst +- **Secondary**: Data Engineer + +#### 🎯 Goal +Enable the user to bring multiple techno-economic datasets to a common basis (currency, year, units) using explicit, user-invoked transformation methods, so that they can be compared or combined. + +#### πŸ“š Pre-conditions +- Python environment with `technologydata` installed +- One or more Technology objects loaded as `DataPackage` or `TechnologyContainer` objects +- User is familiar with available transformation methods (e.g., `adjust_currency`, `adjust_scale`, `adjust_region`) + +#### 🚦 Trigger +- User loads multiple datasets and wishes to harmonize them for comparison or integration + +#### 🧡 Main Flow + +1. User loads datasets (e.g., from JSON, CSV, or DataFrame) into separate `DataPackage` or `TechnologyContainer` objects or creates them programmatically through the package's class interface. +2. User inspects the datasets to identify differences in currency, year, units, or other conventions. +3. User applies transformation methods as needed: + - `.adjust_currency(target_currency)` + - `.adjust_scale(target_capacity, scaling_exponent)` + - `.adjust_region(target_region)` + - Unit conversions per parameter via Technology or TechnologyContainer level methods +4. User repeats or chains transformations as required or desired for each dataset. +5. User verifies harmonization by inspecting key parameters and units. +6. Harmonized datasets are now ready for comparison, merging, or further analysis. + +#### πŸ” Alternate Flows + +- **Unsupported transformation**: System raises an error if a requested transformation is not supported due to missing parameters in one or more of the Technology objects. +- **Partial harmonization**: User can harmonize only a subset of parameters. + +#### βœ… Post-conditions +- All datasets are harmonized to the user-specified conventions, e.g. currency, currency year, units. + +#### πŸ§ͺ Sample Input/Output + +```python +from technologydata import DataPackage + +dp1 = DataPackage.from_json("dataset1.json") +dp2 = DataPackage.from_json("dataset2.json") + +dp1.technologies = dp1.technologies.adjust_currency(to_currency="EUR_2020") +dp2.technologies = dp2.technologies.adjust_currency(to_currency="EUR_2020") +dp1.technologies = dp1.technologies.adjust_scale(to_capacity=100, scaling_exponent=0.5) +dp2.technologies = dp2.technologies.adjust_scale(to_capacity=100, scaling_exponent=0.5) + +dp1.technologies = dp1.technologies.adjust_region(to_region="EUR") +dp2.technologies = dp2.technologies.adjust_region(to_region="EUR") + +dp1.technologies = dp1.technologies.adjust_units(parameter="specific-investment", to_unit="EUR/kW") +# ... further harmonization as needed +``` + +#### πŸ“Š Importance & Frequency + +* Importance: High +* Usage Frequency: Frequent, especially when integrating or comparing datasets + +#### πŸ“Œ Notes + +* All harmonization steps are explicit and user-driven; no automatic harmonization is performed. +* The user is responsible for the order and combination of transformations. +* Optionally, each transformation could be logged as data provenance, allowing users to trace back the steps taken and record them in e.g. a output file for documentation. + +### 🧾 UC-003: Transform assumptions into model-ready formats + +#### πŸ§‘β€πŸ’» Actor(s) +- **Primary**: Energy System Modeller, Programmer + +#### 🎯 Goal +Allow the user to derive and access all model-relevant parameters (e.g., EAC, specific investment) from harmonized data, ready for direct use in energy system models such as PyPSA-Eur. + +#### πŸ“š Pre-conditions +- One `Technology` object or multiple in a `TechnologyContainer` or `DataPackage` available +- User knows which parameters are required for the target model + +#### 🚦 Trigger +- User wants to prepare data for model input, e.g., for PyPSA-Eur + +#### 🧡 Main Flow + +1. User ensures all required base parameters (e.g., WACC, lifetime, investment) are present and harmonized. +2. User invokes calculation methods to derive model-ready parameters: + - `.calculate_parameters(parameters="EAC")` + - `.calculate_parameters(parameters="specific-investment")` +3. System computes and adds the derived parameters to the relevant `Technology` objects. +4. User accesses the parameters directly from the `Technology` objects for export or further use. + +#### πŸ” Alternate Flows + +- **Missing base parameters**: System raises an error if parameters required for the calculation are missing. +- **Calculation error**: System logs the error and aborts the calculation. + +#### βœ… Post-conditions +- All required model parameters are present and accessible in the `Technology` objects, ready for export or direct use. + +#### πŸ§ͺ Sample Input/Output + +```python +techs = dp.technologies +techs = techs.calculate_parameters(parameters=["specific-investment"]) + +tech = techs[0] # Access a specific Technology object +tech.calculate_parameters(parameters="EAC") +tech["EAC"].value # Access the calculated EAC parameter value +``` + +#### πŸ“Š Importance & Frequency + +* Importance: High +* Usage Frequency: Frequent, especially before running model scenarios + +#### πŸ“Œ Notes + +- + +### 🧾 UC-004: Compare techno-economic indicators across datasets + +#### πŸ§‘β€πŸ’» Actor(s) +- **Primary**: Energy Analyst, Energy System Modeller + +#### 🎯 Goal +Enable the user to systematically compare key techno-economic parameters (e.g., CAPEX, OPEX, efficiency) across multiple harmonized datasets in a tabular format. + +#### πŸ“š Pre-conditions +- Two or more `Technology` objects available as `TechnologyContainer` or `DataPackage` objects +- User knows which parameters and technologies to compare + +#### 🚦 Trigger +- User wants to compare indicators across datasets for quality control, reporting, or analysis + +#### 🧡 Main Flow + +1. User selects datasets for comparison and technologies based on similar features, e.g. the same technology name. +2. User aligns datasets on specified parameters. +3. User generates a comparison table (e.g., pandas DataFrame) showing values from each dataset side by side. +4. User reviews the DataFrame, exports it for further analysis and optionally creates visualizations using external tools. + +#### πŸ” Alternate Flows + +- **Manually created comparison**: User can manually create a comparison table by selecting specific parameters and technologies individually through their `.values` attributes. + +#### βœ… Post-conditions +- Tabular comparison of selected parameters across datasets is available for review and export. + +#### πŸ§ͺ Sample Input/Output + +```python +from technologydata import DataPackage + +dp = DataPackage([dp1, dp2]) + +techs = dp.technologies + +techs = techs.get(technology="Solar PV", region="EUR") +comparison_df.to_dataframe() + +techs["lifetime"].values # Access lifetime values across technologies +``` + +#### πŸ“Š Importance & Frequency + +* Importance: Medium +* Usage Frequency: Regular, especially for data quality checks and exploring values to be included into a model + +#### πŸ“Œ Notes + +* Tabular comparison is the core feature; visualizations can be build on top of the DataFrame by the user themselves. +* Optional: Outlier detection and summary statistics could be a nice feature, but are also part of `pandas` already, so we can put this into the documentation as a suggestion for the user to explore themselves. + +### 🧾 UC-005: Audit data provenance and transformation trace + +#### πŸ§‘β€πŸ’» Actor(s) +- **Primary**: Energy System Modeller +- **Secondary**: Energy Analyst + +#### 🎯 Goal +Allow the user to trace the origin and transformation history of each data point, enabling transparency and reproducibility. + +#### πŸ“š Pre-conditions +- Data loaded and/or transformed using `technologydata` + +#### 🚦 Trigger +- User requests provenance or transformation history for a specific parameter, object or Container. + +#### 🧡 Main Flow + +1. User selects a `parameter` of a `Technology` object. +2. The user requests the provenance information for that parameter. +3. System provides the information about: + - Original source(s) of the data (from `Source` and `SourceContainer`) of the parameter + - All transformations applied by our package (e.g., currency adjustment, scaling, calculations, including the values that were used for these transformations) +4. User can export or document the provenance trace for reporting or documentation. + +#### πŸ” Alternate Flows + +- **Manually changed information**: If the user made manual changes at some point, then the system only notifies and provides trace over what was done by the package; User changes are not tracked. +- **Requesting provenance for a Technology or TechnologyContainer**: The user can access the provenance information for all parameters of a Technology or TechnologyContainer by exporting it to a DataFrame or JSON. + +#### βœ… Post-conditions +- User has access to a detailed provenance and transformation trace for any data point. +- Reports or logs can be exported for documentation. + +#### πŸ§ͺ Sample Input/Output + +```python +print(tech["EAC].provenance) + +techs = dp.technologies +techs.to_dataframe() # Includes provenance information in the DataFrame as a dedicated column + +dp.to_json("") # Includes provenance information in the JSON output +``` + +#### πŸ“Š Importance & Frequency + +* Importance: Medium (for transparency and reproducibility) +* Usage Frequency: Occasional, but critical for future-us, report writing and rapport + +#### πŸ“Œ Notes + +* Only transformations performed by the package are tracked; user-made changes must be recorded manually. +* Provenance tracking should be automatic and cover all package-driven transformations. From b099964e63c66263f882d022b5cf05798fea39a2 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:02:46 +0200 Subject: [PATCH 02/81] code: initial new package structure (#13) * code: initial new package structure * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: add licensing with reuse * code: update .gitignore * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: changes to datapackage.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update class diagram * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: implementation * code: new additions * code: modify puml file * code: add test_commons.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: new changes * new changes to source * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: add test_source.py * code: implement SourceCollection * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: source_collection * update puml * code: doc changes * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * pre-commit * doc: update design.md * code: modify example in parameter.py * doc: remove Collection class * code: export json schema * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * doc: remove Collection * pre-commit changes * doc: Container -> Collection * code: expand Source Collection * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update .github/workflows/ci.yaml remove pydeflate from CI Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update .gitignore remove pydeflate from .gitignore Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update .pre-commit-config.yaml quarterly updates Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update REUSE.toml remove pydeflate from REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update technologydata/technology.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * new changes * Update technologydata/unit_value.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: update __init__.py description * Update REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update pyproject.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: remove params check in conftest.py * Update pyproject.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * add author * Update technologydata/parameter.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update technologydata/datapackage.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update technologydata/source_collection.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: rework imports * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: fix imports * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update technologydata/source_collection.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: modify method name * Update technologydata/source_collection.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: update source_collection * code: kwargs source_collection * code: update to_json * code: modify from_json * code: add get method for SourceCollection * code: unit test get method for source_collection * Update technologydata/source_collection.py --------- Co-authored-by: Fabrizio Finozzi Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- .codespell.ignore | 3 + .github/workflows/ci.yaml | 41 + .gitignore | 74 + .pre-commit-config.yaml | 68 + LICENSES/CC-BY-4.0.txt | 156 + LICENSES/MIT.txt | 18 + REUSE.toml | 15 + docs/{copilot-context.md => CLAUDE.md} | 8 +- docs/class-diagram.puml | 127 +- docs/design.md | 49 +- pyproject.toml | 127 + technologydata/__init__.py | 24 + technologydata/datapackage.py | 86 + technologydata/parameter.py | 84 + technologydata/source.py | 375 +++ technologydata/source_collection.py | 199 ++ technologydata/technology.py | 182 ++ technologydata/unit_value.py | 71 + technologydata/utils/__init__.py | 13 + technologydata/utils/commons.py | 269 ++ test/conftest.py | 97 + test/test_commons.py | 141 + .../sources.json | 20 + .../technologies.json | 276 ++ .../technologies.json | 166 ++ test/test_source.py | 124 + test/test_source_collection.py | 219 ++ uv.lock | 2583 +++++++++++++++++ 28 files changed, 5516 insertions(+), 99 deletions(-) create mode 100644 .codespell.ignore create mode 100644 .github/workflows/ci.yaml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 LICENSES/CC-BY-4.0.txt create mode 100644 LICENSES/MIT.txt create mode 100644 REUSE.toml rename docs/{copilot-context.md => CLAUDE.md} (85%) create mode 100644 pyproject.toml create mode 100644 technologydata/__init__.py create mode 100644 technologydata/datapackage.py create mode 100644 technologydata/parameter.py create mode 100644 technologydata/source.py create mode 100644 technologydata/source_collection.py create mode 100644 technologydata/technology.py create mode 100644 technologydata/unit_value.py create mode 100644 technologydata/utils/__init__.py create mode 100644 technologydata/utils/commons.py create mode 100644 test/conftest.py create mode 100644 test/test_commons.py create mode 100644 test/test_data/solar_photovoltaics_example_03/sources.json create mode 100644 test/test_data/solar_photovoltaics_example_03/technologies.json create mode 100644 test/test_data/solar_photovoltaics_example_04/technologies.json create mode 100644 test/test_source.py create mode 100644 test/test_source_collection.py create mode 100644 uv.lock diff --git a/.codespell.ignore b/.codespell.ignore new file mode 100644 index 00000000..cf2749ba --- /dev/null +++ b/.codespell.ignore @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..e5c703bb --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT +name: Technologydata prototype CI + +on: + push: + branches: [prototype] + pull_request: + branches: [prototype] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Cache Python dependencies + uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/uv.lock') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install package and dependencies + run: | + python -m pip install uv + uv lock + uv sync + + - name: Run unit tests + run: | + uv run pytest diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3ce78b52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +# Byte-compiled / optimized / DLL files +*__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +.env/ +.venv/ +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# PyCharm +.idea/ + +# VS Code +.vscode/ + +# macOS +.DS_Store + +# Jupyter Notebook +.ipynb_checkpoints/ + +# mypy +.mypy_cache/ +.dmypy.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..60665819 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +ci: + autoupdate_schedule: quarterly + +repos: + # Basic pre-commit hooks for whitespace, merge conflicts, etc. +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-merge-conflict + - id: check-added-large-files + args: ['--maxkb=1000'] + - id: trailing-whitespace + - id: end-of-file-fixer + + # Ruff: Python linter and formatter +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.8 + hooks: + - id: ruff + args: [--fix] + - id: ruff-format + + # Codespell: Checks for common misspellings +- repo: https://github.com/codespell-project/codespell + rev: v2.4.1 + hooks: + - id: codespell + args: ['--ignore-regex="(\b[A-Z]+\b)"', '--ignore-words=.codespell.ignore'] + types_or: [python, rst, markdown] + + # Jupyter notebook cleanup +- repo: https://github.com/aflc/pre-commit-jupyter + rev: v1.2.1 + hooks: + - id: jupyter-notebook-cleanup + args: ['--remove-kernel-metadata'] + + # Pretty-format-yaml: YAML formatter +- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks + rev: v2.14.0 + hooks: + - id: pretty-format-yaml + args: [--autofix, --indent, '2', --preserve-quotes] + + # Mypy: Static type checker for Python +- repo: https://github.com/pre-commit/mirrors-mypy + rev: 'v1.15.0' + hooks: + - id: mypy + args: [--strict, --ignore-missing-imports, --config-file=pyproject.toml] + additional_dependencies: [tokenize-rt==3.2.0] + + # Pyupgrade: Automatically upgrades Python syntax +- repo: https://github.com/asottile/pyupgrade + rev: v3.16.0 + hooks: + - id: pyupgrade + args: ["--py311-plus"] + + # REUSE: Checks for REUSE license compliance +- repo: https://github.com/fsfe/reuse-tool + rev: v5.0.2 + hooks: + - id: reuse diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt new file mode 100644 index 00000000..13ca539f --- /dev/null +++ b/LICENSES/CC-BY-4.0.txt @@ -0,0 +1,156 @@ +Creative Commons Attribution 4.0 International + + Creative Commons Corporation (β€œCreative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an β€œas-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the β€œLicensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark β€œCreative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 00000000..d817195d --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 00000000..a6ee5e76 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,15 @@ +version = 1 +SPDX-PackageName = "technologydata" +SPDX-PackageSupplier = "The technology-data authors" +SPDX-PackageDownloadLocation = "https://github.com/pypsa/technology-data" + +[[annotations]] +path = ["uv.lock"] +SPDX-FileCopyrightText = "The technology-data authors" +SPDX-License-Identifier = "MIT" + + +[[annotations]] +path = ["test/test_data/*/*"] +SPDX-FileCopyrightText = "The technology-data authors" +SPDX-License-Identifier = "CC-BY-4.0" diff --git a/docs/copilot-context.md b/docs/CLAUDE.md similarity index 85% rename from docs/copilot-context.md rename to docs/CLAUDE.md index 48efa9d9..1713f9f3 100644 --- a/docs/copilot-context.md +++ b/docs/CLAUDE.md @@ -1,7 +1,11 @@ + ## General * Description of use cases in `docs/design.md` -* Class diagramm in `docs/class-diagram.puml` +* Class diagram in `docs/class-diagram.puml` ## Tools @@ -19,4 +23,4 @@ * `pydeflate` for currency conversions and inflation adjustments * `pint` for unit conversions -* `savepagenow` for archiving web pages using the Wayback Machine \ No newline at end of file +* `savepagenow` for archiving web pages using the Wayback Machine diff --git a/docs/class-diagram.puml b/docs/class-diagram.puml index 0bbdbdf1..15db0fff 100644 --- a/docs/class-diagram.puml +++ b/docs/class-diagram.puml @@ -1,3 +1,8 @@ +/' +SPDX-FileCopyrightText: The technology-data authors +SPDX-License-Identifier: MIT +'/ + @startuml Class Diagram class UnitValue { - value: float @@ -18,6 +23,7 @@ class Source { - urldate: str - urldate_archive: str + + ensure_in_wayback() + store_in_wayback() + retrieve_from_wayback() } @@ -35,7 +41,7 @@ class Parameter { - quantity: UnitValue - provenance: str - note: str - - sources: SourceContainer + - sources: SourceCollection } Parameter --> UnitValue : quantity @@ -107,92 +113,64 @@ note right of Technology::calculate_EAC to check for consistency). end note -class Container { - - schema_name: str - - schema_path: Path - + get(**criteria): object | Container | None - + to_csv() - + to_excel() - + to_dataframe() -} - -note top of Container - Consider 'Container' as abstract base class for all containers - for unifying the common export and schema-related functionality - required by all data-holding classes. -end note - -note left of Container::schema_name - The name of the schema used for this container, e.g. currently "technologies" or "sources". - This is used to identify the type of data contained in the container. -end note - -note left of Container::get - Provides a generic get(**criteria) - method to retrieve contained objects matching selection criteria: - - If exactly one object matches, returns that object or a Container with this one object. - - If multiple objects match, returns a Container of the same type with the matches. - - If no matches, returns None or an empty Container. -end note - -note left of Container::to_csv - Export the data to a csv file for sharing / usage in e.g. Excel, ... . - Aligned with datapackage schema. - e.g. all {technology} or {source} objects. - Like the current Technologies(...).to_csv() method. -end note - -note left of Container::to_excel - Export all the data to a excel file for usage in Excel and similar tools, ... . - Aligned with datapackage schema. -end note - -note left of Container::to_dataframe - Flatten the Container and its members into a pandas DataFrame, that can be manipulated. - Dataframe should be compatible with the datapackage schema, such that it can be used for e.g. the to_csv() method. -end note - - -class TechnologyContainer { +class TechnologyCollection { - technologies: Iterable - + get(**criteria): Technology | TechnologyContainer | None - + create_projection(): TechnologyContainer + + get(**criteria): Technology | TechnologyCollection | None + + create_projection(): TechnologyCollection ' TODO: Think about more methods here } -note right of TechnologyContainer::get - Implements the generic get method from "Container" for "TechnologyContainer". +note right of TechnologyCollection::get Filters contained Technology objects by the attributes and returns matches: region, case, year, technology, detailed_technology. - If exactly one Technology matches, returns that Technology. - - If multiple Technologies match, returns a TechnologyContainer with the matches. - - If no matches, returns None or an empty TechnologyContainer. + - If multiple Technologies match, returns a TechnologyCollection with the matches. + - If no matches, returns None or an empty TechnologyCollection. end note -note right of TechnologyContainer::create_projection +note right of TechnologyCollection::create_projection e.g. learning curve, interpolation, extrapolation; - based on the Technology objects in the container. - Either returns a new TechnologyContainer or adds the - Technology objects to the current container. + based on the Technology objects in the collection. + Either returns a new TechnologyCollection or adds the + Technology objects to the current collection. end note -class SourceContainer { +class SourceCollection { - sources: Iterable - + retrieve_all_archives() + + retrieve_all_from_wayback() + + to_json() + + to_csv() + + to_dataframe() + + from_json() } -note left of SourceContainer::retrieve_all_archives +note left of SourceCollection::retrieve_all_from_wayback Triggers the retrieve_from_wayback method for all sources and stores the files locally. end note +note left of SourceCollection::to_csv + Export the source collection into a csv file. +end note + +note left of SourceCollection::to_json + Export the source collection into a json file. +end note + +note left of SourceCollection::to_dataframe + Export the source collection into a Pandas dataframe. +end note + class Datapackage { - name: str - path: Path - - technologies: TechnologyContainer - - sources: SourceContainer - - // potentially other Containers in the future + - technologies: TechnologyCollection + - sources: SourceCollection + - // potentially other Collections in the future + to_datapackage() + + from_json() + + to_json() + + get_source_collection() } note top of Datapackage @@ -201,32 +179,31 @@ note top of Datapackage Our package includes pre-packaged data in this format and allows enables to read and write data in this standardised way. Currently implemented through frictionless with .csv and schema.json files. + Please note that the "sources" field is built in the background from "technologies" end note note right of Datapackage::name Currently we use "source" as a reference to pre-packaged data and for a column in "technologies.csv". The Datapackage.name would substitute for referencing to pre-packaged data, e.g. "example01" would be - a packaged data included with `technologydata`. + a packaged data included with `technologydata`. It is meant to be independent of the "TechnologyCollection" or its members. end note note right of Datapackage::technologies - Derived from the TechnologyContainer. + Derived from the TechnologyCollection. end note note right of Datapackage::sources - Derived from all Source objects that are related to the TechnologyContainer (i.e., all sources referenced by technologies and their parameters). + Built in the background with the get_source_collection() method, which derives it from all Source objects that are related to the TechnologyCollection (i.e., all sources referenced by technologies and their parameters). end note note right of Datapackage::to_datapackage - Exports all member Source and TechnologyContainer to a folder following the datapackage + Exports all member Source and TechnologyCollection to a folder following the datapackage specification, including the schema .json files and the .csv files. end note -Container <|-- TechnologyContainer -Container <|-- SourceContainer -Parameter --> SourceContainer : sources +Parameter --> SourceCollection : sources Technology --> "*" Parameter : uses for its members -TechnologyContainer --> "*" Technology : consists of -SourceContainer --> "*" Source : consists of -Datapackage --> "1" TechnologyContainer : contains -@enduml \ No newline at end of file +TechnologyCollection --> "*" Technology : consists of +SourceCollection --> "*" Source : consists of +Datapackage --> "1" TechnologyCollection : contains +@enduml diff --git a/docs/design.md b/docs/design.md index 31064d38..ffcc09fd 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1,3 +1,7 @@ + # Design 1. [Design](#design) @@ -108,7 +112,7 @@ Detect and correct inconsistencies or omissions in techno-economic input data, e ```python from technologydata import DataPackage, Parameter, Technology, Source dp = DataPackage.from_json("path/to/data_package") # triggers validation -techs = dp.technologies # Access the TechnologyContainer +techs = dp.technologies # Access the TechnologyCollection techs.check_consistency() # Checks all technologies for consistency techs = techs.calculate_parameters(parameters=["specific-investment", "eac"]) @@ -119,19 +123,20 @@ tech.check_consistency() # Check consistency of a single Technology object tech = tech.calculate_parameters(parameters="") # Calculate missing parameters # Manually created Technology object -src = Source(name="A source", url="http://example.com/source") -src2 = Source(name="Another source", url="http://example.com/source2") +src = Source(title="A source", authors="example authors", url="http://example.com/source") +src2 = Source(title="Another source", authors="example authors", url="http://example.com/source2") +params: dict[str, Parameter] = { + "efficiency": Parameter(value=0.85, unit="fraction"), + "cost": Parameter(value=1500.0, unit="USD/kW"), +} tech = Technology( - name="Example Technology", - parameters={ - "specific-investment": Parameter(value=1000, unit="EUR_2020/kW", sources=src), - "investment": Parameter(value=9000, unit="EUR_2020", sources=src2), - "lifetime": Parameter(value=20, unit="years", sources=[src,src2]) - }, + name="Solar Photovoltaic", + region="North America", + year=2023, + parameters=params, + case="Best Case", + detailed_technology="Monocrystalline Solar Panels" ) - -print(tech["lifetime"]) # Access and show a specific parameter (value, unit, sources) -tech["lifetime"].value = 50 # Update a parameter value ``` #### πŸ“Š Importance & Frequency @@ -144,7 +149,7 @@ tech["lifetime"].value = 50 # Update a parameter value * Consistency logic includes checks for units, and dependency constraints between parameters (e.g. one parameter may be derived from one or more other parameters). * Schema-based validation is extensible to new parameter types and sources. -### 🧾 UC-002: Harmonize multiple input datasets +### 🧾 UC-002: Harmonize multiple input datasets #### πŸ§‘β€πŸ’» Actor(s) - **Primary**: Energy System Modeller, Energy Analyst @@ -155,7 +160,7 @@ Enable the user to bring multiple techno-economic datasets to a common basis (cu #### πŸ“š Pre-conditions - Python environment with `technologydata` installed -- One or more Technology objects loaded as `DataPackage` or `TechnologyContainer` objects +- One or more Technology objects loaded as `DataPackage` or `TechnologyCollection` objects - User is familiar with available transformation methods (e.g., `adjust_currency`, `adjust_scale`, `adjust_region`) #### 🚦 Trigger @@ -163,13 +168,13 @@ Enable the user to bring multiple techno-economic datasets to a common basis (cu #### 🧡 Main Flow -1. User loads datasets (e.g., from JSON, CSV, or DataFrame) into separate `DataPackage` or `TechnologyContainer` objects or creates them programmatically through the package's class interface. +1. User loads datasets (e.g., from JSON, CSV, or DataFrame) into separate `DataPackage` or `TechnologyCollection` objects or creates them programmatically through the package's class interface. 2. User inspects the datasets to identify differences in currency, year, units, or other conventions. 3. User applies transformation methods as needed: - `.adjust_currency(target_currency)` - `.adjust_scale(target_capacity, scaling_exponent)` - `.adjust_region(target_region)` - - Unit conversions per parameter via Technology or TechnologyContainer level methods + - Unit conversions per parameter via Technology or TechnologyCollection level methods 4. User repeats or chains transformations as required or desired for each dataset. 5. User verifies harmonization by inspecting key parameters and units. 6. Harmonized datasets are now ready for comparison, merging, or further analysis. @@ -222,7 +227,7 @@ dp1.technologies = dp1.technologies.adjust_units(parameter="specific-investment" Allow the user to derive and access all model-relevant parameters (e.g., EAC, specific investment) from harmonized data, ready for direct use in energy system models such as PyPSA-Eur. #### πŸ“š Pre-conditions -- One `Technology` object or multiple in a `TechnologyContainer` or `DataPackage` available +- One `Technology` object or multiple in a `TechnologyCollection` or `DataPackage` available - User knows which parameters are required for the target model #### 🚦 Trigger @@ -274,7 +279,7 @@ tech["EAC"].value # Access the calculated EAC parameter value Enable the user to systematically compare key techno-economic parameters (e.g., CAPEX, OPEX, efficiency) across multiple harmonized datasets in a tabular format. #### πŸ“š Pre-conditions -- Two or more `Technology` objects available as `TechnologyContainer` or `DataPackage` objects +- Two or more `Technology` objects available as `TechnologyCollection` or `DataPackage` objects - User knows which parameters and technologies to compare #### 🚦 Trigger @@ -332,21 +337,21 @@ Allow the user to trace the origin and transformation history of each data point - Data loaded and/or transformed using `technologydata` #### 🚦 Trigger -- User requests provenance or transformation history for a specific parameter, object or Container. +- User requests provenance or transformation history for a specific parameter, object or Collection. #### 🧡 Main Flow 1. User selects a `parameter` of a `Technology` object. 2. The user requests the provenance information for that parameter. 3. System provides the information about: - - Original source(s) of the data (from `Source` and `SourceContainer`) of the parameter + - Original source(s) of the data (from `Source` and `SourceCollection`) of the parameter - All transformations applied by our package (e.g., currency adjustment, scaling, calculations, including the values that were used for these transformations) 4. User can export or document the provenance trace for reporting or documentation. #### πŸ” Alternate Flows - **Manually changed information**: If the user made manual changes at some point, then the system only notifies and provides trace over what was done by the package; User changes are not tracked. -- **Requesting provenance for a Technology or TechnologyContainer**: The user can access the provenance information for all parameters of a Technology or TechnologyContainer by exporting it to a DataFrame or JSON. +- **Requesting provenance for a Technology or TechnologyCollection**: The user can access the provenance information for all parameters of a Technology or TechnologyCollection by exporting it to a DataFrame or JSON. #### βœ… Post-conditions - User has access to a detailed provenance and transformation trace for any data point. @@ -355,7 +360,7 @@ Allow the user to trace the origin and transformation history of each data point #### πŸ§ͺ Sample Input/Output ```python -print(tech["EAC].provenance) +print(tech["EAC"].provenance) techs = dp.technologies techs.to_dataframe() # Includes provenance information in the DataFrame as a dedicated column diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..535a6247 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,127 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +[build-system] +requires = ["setuptools>=64", "setuptools_scm>=8"] +build-backend = "setuptools.build_meta" + +[project] +name = "technologydata" +dynamic = ["version"] +keywords = ["energy", "modelling", "techno-economics", "macroeconomics"] # TODO update +description = "Package for providing common data assumptions for energy system modelling on techno-economics and macro-economics." +readme = "README.md" +authors = [ + { name = "Contributors to technologydata", email = "johannes.hampp@openenergytransition.org" }, + { name = "Contributors to technologydata", email = "fabrizio.finozzi.business@gmail.com" }, +] +classifiers=[ + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Development Status :: 3 - Alpha", + "Environment :: Console", + "Intended Audience :: Science/Research", + "Natural Language :: English", + "Operating System :: OS Independent", +] +requires-python = ">=3.12" +dependencies = [ + "ipykernel>=6.29.5", # this one can go into optional as "dev" + "mypy>=1.15.0", + "pandas>=2.2.3", + "pre-commit>=4.2.0", # this one can go into optional as "dev" + "pytest>=8.3.5", # this one can go into optional as "dev" + "requests>=2.32.3", + "savepagenow>=1.3.0", +] + +[project.urls] +Homepage = "https://github.com/PyPSA/technology-data" +Source = "https://github.com/PyPSA/technology-data" +BugTracker = "https://github.com/PyPSA/technology-data/issues" +Changelog = "https://github.com/PyPSA/technology-data/releases" + +[project.optional-dependencies] +docs = [ + "mkdocs-autolinks-plugin>=0.7.1", + "mkdocs-git-revision-date-localized-plugin>=1.4.7", + "mkdocs-material>=9.6.14", + "mkdocs-minify-plugin>=0.8.0", + "mkdocs-open-in-new-tab>=1.0.8", + "mkdocstrings>=0.29.1", + "mkdocstrings-python>=1.16.11", +] + + +# Setuptools_scm settings + +[tool.uv] +package = true + +[tool.setuptools_scm] +version_scheme = "no-guess-dev" + +[tool.setuptools.packages.find] +include = ["technologydata"] + +# Static type checker settings + +[tool.mypy] +exclude = ['dev/*', 'examples/*', 'doc/*', 'test/*'] +ignore_missing_imports = true +no_implicit_optional = true +warn_unused_ignores = true +show_error_code_links = true +disallow_any_generics = true +warn_return_any = true + +[[tool.mypy.overrides]] +module = "technologydata" +disallow_untyped_defs = true +check_untyped_defs = true + +[[tool.mypy.overrides]] +module = "requests" +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = "dateutil" +ignore_missing_imports = true + +# Formatter and linter settings + +[tool.ruff] +extend-include = ['*.ipynb'] + +[tool.ruff.lint] +select = [ + 'F', # pyflakes + 'E', # pycodestyle: Error + 'W', # pycodestyle: Warning + 'I', # isort + 'D', # pydocstyle + 'UP', # pyupgrade + 'ANN', # flake-8 annotations + 'TID', # flake8-tidy-imports + 'NPY', # numpy + 'PD', # pandas + 'RUF013', # ruff +] + +ignore = [ + 'ANN401', # Dynamically typed expressions are forbidden + 'E501', # line too long + 'D203', # 1 blank line required before class docstring + 'D212', # Multi-line docstring summary should start at the second line + ] + + +[tool.ruff.lint.per-file-ignores] +"{test}/**"=[ + 'ANN' # flake8-annotations +] + +[tool.ruff.lint.flake8-tidy-imports] +# Disallow all relative imports. +ban-relative-imports = "all" diff --git a/technologydata/__init__.py b/technologydata/__init__.py new file mode 100644 index 00000000..d3380162 --- /dev/null +++ b/technologydata/__init__.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: The technology-data authors +# SPDX-License-Identifier: MIT + +"""technologydata: A package for managing and analyzing technology data used for energy system models.""" + +from technologydata.datapackage import DataPackage +from technologydata.parameter import Parameter +from technologydata.source import Source +from technologydata.source_collection import SourceCollection +from technologydata.technology import Technology +from technologydata.unit_value import UnitValue +from technologydata.utils.commons import Commons, DateFormatEnum, FileExtensionEnum + +__all__ = [ + "Commons", + "DateFormatEnum", + "FileExtensionEnum", + "UnitValue", + "Technology", + "Parameter", + "Source", + "SourceCollection", + "DataPackage", +] diff --git a/technologydata/datapackage.py b/technologydata/datapackage.py new file mode 100644 index 00000000..27ed5182 --- /dev/null +++ b/technologydata/datapackage.py @@ -0,0 +1,86 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +""" +DataPackage class for managing collections of Technology objects and batch operations. + +Examples +-------- +>>> dp = DataPackage.from_json("path/to/data_package.json") + +""" + +import pathlib + +import pydantic + +from technologydata.source_collection import SourceCollection + +# from technologydata.technology_collection import TechnologyCollection + + +# TODO complete class +class DataPackage(pydantic.BaseModel): # type: ignore + """ + Container for a collection of Technology objects and/or Source objects, with batch operations and loading utilities. + + Parameters + ---------- + name : str + The short-name code of the source + technologies : List[Technology] + List of Technology objects. + + Attributes + ---------- + technologies : List[Technology] + List of Technology objects. + + """ + + name: str + path: pathlib.Path + # technologies: TechnologyCollection + sources: SourceCollection + + # @classmethod + # def from_json(cls, path: pathlib.Path) -> technologydata.DataPackage: + # """ + # Load a DataPackage from a JSON file. + # + # Parameters + # ---------- + # path : Path + # Path to the JSON file. + # + # Returns + # ------- + # DataPackage + # The loaded DataPackage instance. + # + # """ + # with open(path) as f: + # data = json.load(f) + # techs = technologydata.TechnologyCollection( + # [technologydata.Technology(**t) for t in data.get("technologies", [])] + # ) + # # TODO: redo this part once an example JSON is available + # techs = technologydata.TechnologyCollection( + # [technologydata.Technology(**t) for t in data.get("technologies", [])] + # ) + # # You should also handle 'name', 'sources', etc. as needed + # return cls( + # name=data.get("name", ""), + # path=path, + # technologies=techs, + # sources=technologydata.SourceCollection(data.get("sources", [])), + # ) + # + # @classmethod + # def to_json(cls, path: pathlib.Path) -> None: + # pass + # + # @classmethod + # def to_datapackage(cls, path: pathlib.Path) -> None: + # pass diff --git a/technologydata/parameter.py b/technologydata/parameter.py new file mode 100644 index 00000000..10f94bc6 --- /dev/null +++ b/technologydata/parameter.py @@ -0,0 +1,84 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +""" +Parameter class for encapsulating a value, its unit, provenance, notes, and sources. + +Examples +-------- +>>> from technologydata.unit_value import UnitValue +>>> from technologydata.source import Source +>>> uv = UnitValue(value=1000, unit="EUR_2020/kW") +>>> src = Source(name="Example Source", authors="some authors", url="http://example.com") +>>> param = Parameter(quantity=uv, provenance="literature", note="Estimated", sources=[src]) + +""" + +import pydantic + +from technologydata.source_collection import SourceCollection +from technologydata.unit_value import UnitValue + + +# TODO rework class logic +class Parameter(pydantic.BaseModel): # type: ignore + """ + Encapsulate a value with its unit, provenance, notes, and sources. + + Parameters + ---------- + quantity : UnitValue + The value and its unit. + provenance : Optional[str] + Description of the data's provenance. + note : Optional[str] + Additional notes about the parameter. + sources : SourceCollection + One or more sources for the parameter. + + Attributes + ---------- + quantity : UnitValue + The value and its unit. + provenance : Optional[str] + Description of the data's provenance. + note : Optional[str] + Additional notes about the parameter. + sources : SourceCollection + List of sources for the parameter. + + """ + + quantity: UnitValue = pydantic.Field(..., description="The value and its unit.") + provenance: str | None = pydantic.Field(None, description="Data provenance.") + note: str | None = pydantic.Field(None, description="Additional notes.") + sources: SourceCollection = pydantic.Field( + ..., description="Collection of Sources." + ) + + @property + def value(self) -> float: + """ + The numerical value of the parameter. + + Returns + ------- + float + The value. + + """ + return self.quantity.value + + @property + def unit(self) -> str: + """ + The unit of the parameter. + + Returns + ------- + str + The unit. + + """ + return self.quantity.unit diff --git a/technologydata/source.py b/technologydata/source.py new file mode 100644 index 00000000..3b1fd1f7 --- /dev/null +++ b/technologydata/source.py @@ -0,0 +1,375 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +""" +Source class for representing bibliographic and web sources, with archiving support. + +Examples +-------- +>>> src = Source(title="Example Source", authors="The Authors") +>>> src.store_in_wayback() +>>> src.retrieve_from_wayback() + +""" + +import logging +import pathlib +import typing + +import pydantic +import requests +import savepagenow + +import technologydata + +logger = logging.getLogger(__name__) + + +class Source(pydantic.BaseModel): # type: ignore + """ + Represent a data source, including bibliographic and web information. + + Parameters + ---------- + title : str + Title of the source. + authors : str + Authors of the source. + url : Optional[str] + URL of the source. + url_archive : Optional[str] + Archived URL (e.g., from the Wayback Machine). + url_date : Optional[str] + Date the URL was accessed. + url_date_archive : Optional[str] + Date the URL was archived. + + Attributes + ---------- + title : str + Title of the source. + authors : str + Authors of the source. + url : Optional[str] + URL of the source. + url_archive : Optional[str] + Archived URL. + url_date : Optional[str] + Date the URL was accessed. + url_date_archive : Optional[str] + Date the URL was archived. + + """ + + title: str = pydantic.Field(..., description="Title of the source.") + authors: str = pydantic.Field(..., description="Authors of the source.") + url: str | None = pydantic.Field(None, description="URL of the source.") + url_archive: str | None = pydantic.Field(None, description="Archived URL.") + url_date: str | None = pydantic.Field( + None, description="Date the URL was accessed." + ) + url_date_archive: str | None = pydantic.Field( + None, description="Date the URL was archived." + ) + + def ensure_in_wayback(self) -> None: + """ + Ensure that the source URL is archived in the Wayback Machine. + + This method checks if the source's `url` attribute is set and whether + an archived URL or archive date is already present. If neither is available, it attempts to archive the + URL using the Wayback Machine and updates the corresponding attributes. + + Parameters + ---------- + None + + Returns + ------- + None + This method updates the Source object's `url_archive` and `url_date_archive` attributes in place. + + Raises + ------ + ValueError + If the `url` attribute is not set (None or NaN). + + Examples + -------- + >>> from technologydata import Source + >>> source = Source(url="http://example.com", title="Example Site", authors="The Authors") + >>> source.ensure_in_wayback() + A new snapshot has been stored for the url http://example.com with timestamp 2023-10-01T12:00:00Z and Archive.org url http://web.archive.org/web/20231001120000/http://example.com. + >>> source.url_archive + 'http://web.archive.org/web/20231001120000/http://example.com' + >>> source.url_date_archive + '2023-10-01T12:00:00Z' + + """ + if self.url is None: + raise ValueError( + f"The url attribute of the source {self.title} is not set or contains a NaN value." + ) + + if self.url_archive is None and self.url_date_archive is None: + archived_info = self.store_in_wayback(self.url) + if archived_info is not None: + archived_url, new_capture_flag, timestamp = archived_info + if new_capture_flag: + logger.info( + f"A new snapshot has been stored for the url {self.url} with timestamp {timestamp} and Archive.org url {archived_url}." + ) + else: + logger.info( + f"There is already a snapshot for the url {self.url} with timestamp {timestamp} and Archive.org url {archived_url}." + ) + self.url_date_archive = timestamp + self.url_archive = archived_url + + @staticmethod + def store_in_wayback( + url_to_archive: str, + ) -> tuple[typing.Any, bool | None, str | None] | None: + """ + Store a snapshot of the given URL on the Wayback Machine and extract the timestamp. + + The method captures the specified URL using the Wayback Machine and retrieves the + corresponding archive URL along with a formatted timestamp. The timestamp is extracted + from the archive URL and converted to a more readable format. + + Parameters + ---------- + url_to_archive : str + The URL that you want to archive on the Wayback Machine. + + Returns + ------- + tuple[str, bool, str] | None + A tuple containing the archive URL, a boolean indicating if a new capture was conducted (if the boolean is + True, archive.org conducted a new capture. If it is False, archive.org has returned a recently cached capture + instead, likely taken in the previous minutes) and the formatted timestamp (with format YYYY-MM-DD hh:mm:ss) + if the operation is successful. Returns None if the timestamp cannot be extracted due to a ValueError (e.g., + if the expected substrings are not found in the archive URL). + + Examples + -------- + >>> from technologydata import Source + >>> some_url = "some_url" + >>> archived_info = Source.store_in_wayback(some_url) + + """ + archive_url = savepagenow.capture_or_cache(url_to_archive) + try: + # The timestamp is between "web/" and the next "/" afterward + # Find the starting index of "web/" + start_index = archive_url[0].index("web/") + len("web/") + # Find the ending index of the timestamp by locating the next "/" after the start_index + end_index = archive_url[0].index("/", start_index) + # Extract the timestamp substring + timestamp = archive_url[0][start_index:end_index] + output_timestamp = technologydata.Commons.change_datetime_format( + timestamp, + technologydata.DateFormatEnum.SOURCES_CSV, + ) + return archive_url[0], archive_url[1], output_timestamp + except ValueError: + # If "web/" or next "/" not found, return empty string + return None + + def retrieve_from_wayback( + self, download_directory: pathlib.Path + ) -> pathlib.Path | None: + """ + Download a file from the Wayback Machine and save it to a specified path. + + The method retrieves an archived file from the Wayback Machine using the URL + from the url_archive attribute of the instance. The file is saved in the + specified format based on its Content-Type field in the Response Header or the extension + that can be extracted from the URL. + + Parameters + ---------- + download_directory : pathlib.Path + The base path where the file will be saved. + + + Returns + ------- + pathlib.Path | None + The specified path where the file is stored, or None if an error occurs. + + Raises + ------ + requests.exceptions.RequestException + If there is an issue with the HTTP request. + + Notes + ----- + - The attribute "url_archived" should contain a valid URL. + + Examples + -------- + >>> from technologydata import Source + >>> source = Source(title="example01", authors="The Authors") + >>> output_path = source.retrieve_from_wayback(pathlib.Path("base_path")) + + """ + if self.url_archive is None: + logger.error( + f"The url_archive attribute of source {self.title} is not set." + ) + return None + if download_directory is None: + logger.error(f"The base path of the source {self.title} is not set.") + return None + + source_title = technologydata.Commons.replace_special_characters(self.title) + save_path = self._get_save_path( + self.url_archive, download_directory, source_title + ) + + if save_path is None: + logger.warning( + f"It was not possible to determine a file path for the source {source_title}." + ) + return None + + if save_path.is_file(): + logger.warning( + f"There is already a file stored at the path {save_path}. Not downloading or overwriting this file." + ) + return None + + storage_path = self._download_file(self.url_archive, save_path) + return storage_path + + @staticmethod + def _get_save_path( + url_archived: str, source_path: pathlib.Path, source_title: str + ) -> pathlib.Path | None: + """ + Determine the save path based on the content type or archived URL. + + The method retrieves the content type of the archived URL and determines the appropriate + file extension based on the content type or based on the archived URL. It constructs the full save path using + the provided source path and source title. + + Parameters + ---------- + url_archived : str + The URL of the archived file from which the content type will be determined. + source_path : pathlib.Path + The base path where the file will be saved. + source_title : str + The title of the given source from sources.csv, used as the filename. + + Returns + ------- + pathlib.Path | None + The full path where the file should be saved, including the appropriate file extension, + or None if the content type is unsupported or an error occurs. + + Raises + ------ + ValueError + If the extension is not among the supported ones. + + """ + content_type = Source._get_content_type(url_archived) + if content_type is None: + return None + + extension = technologydata.FileExtensionEnum.get_extension( + content_type + ) or technologydata.FileExtensionEnum.search_file_extension_in_url(url_archived) + if extension is None: + raise ValueError( + f"Unable to infer file extension from content type: {content_type} or URL: {url_archived}" + ) + + if source_path is not None and source_title is not None: + return pathlib.Path(source_path, source_title + extension) + else: + return None + + @staticmethod + def _get_content_type(url_archived: str) -> typing.Any: + """ + Fetch the content type of the archived URL. + + The method sends a HEAD request to the specified archived URL to retrieve the + Content-Type from the response headers. It returns the content type as a string + if the request is successful; otherwise, it logs an error and returns None. + + Parameters + ---------- + url_archived : str + The URL of the archived resource for which the content type is to be fetched. + + Returns + ------- + str | None + The Content-Type of the archived URL if the request is successful, or None + if an error occurs during the request. + + Raises + ------ + requests.exceptions.RequestException + If there is an issue with the HTTP request, an error is logged, and None is returned. + + """ + try: + response = requests.head(url_archived) + response.raise_for_status() + return response.headers.get("Content-Type") + except requests.exceptions.RequestException as e: + raise requests.exceptions.RequestException( + f"Failed to retrieve content type: {e}" + ) + + @staticmethod + def _download_file( + url_archived: str, save_path: pathlib.Path + ) -> pathlib.Path | None: + """ + Download the file and save it to the specified path. + + The method retrieves the content from the specified archived URL and saves it + to the provided file path. It handles HTTP errors and logs appropriate messages + based on the outcome of the download operation. + + Parameters + ---------- + url_archived : str + The URL of the archived file to be downloaded. + + save_path : pathlib.Path + The path where the downloaded file will be saved, including the file name. + + Returns + ------- + pathlib.Path | None + The path where the file has been saved if the download is successful, or None + if an error occurs during the download process. + + Raises + ------ + requests.exceptions.RequestException + If there is an issue with the HTTP request, an error is logged, and None is returned. + + """ + try: + response = requests.get(url_archived) + response.raise_for_status() # Check for HTTP errors + + with open(save_path, "wb") as file: + file.write(response.content) + + logger.info(f"File downloaded successfully and saved to {save_path}") + return save_path + except requests.exceptions.RequestException as e: + requests.exceptions.RequestException( + f"An error occurred during file download: {e}" + ) + return None diff --git a/technologydata/source_collection.py b/technologydata/source_collection.py new file mode 100644 index 00000000..8dfd1714 --- /dev/null +++ b/technologydata/source_collection.py @@ -0,0 +1,199 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""SourceCollection class for representing an iterable of Source Objects.""" + +import csv +import json +import pathlib +import re + +import pandas +import pydantic + +from technologydata.source import Source + + +class SourceCollection(pydantic.BaseModel): # type: ignore + """ + Represent a collection of sources. + + Parameters + ---------- + sources : List[Source] + List of Source objects. + + Attributes + ---------- + sources : List[Source] + List of Source objects. + + """ + + sources: list[Source] = pydantic.Field(..., description="List of Source objects.") + + def get(self, title: str, authors: str) -> "SourceCollection": + """ + Filter sources based on regex patterns for non-optional attributes. + + Parameters + ---------- + title : str + Regex pattern to filter titles. + authors : str + Regex pattern to filter authors. + + Returns + ------- + SourceCollection + A new SourceCollection with filtered sources. + + """ + filtered_sources = self.sources + + if title is not None: + pattern_title = re.compile(title, re.IGNORECASE) + filtered_sources = [ + s for s in filtered_sources if pattern_title.search(s.title) + ] + + if authors is not None: + pattern_authors = re.compile(authors, re.IGNORECASE) + filtered_sources = [ + s for s in filtered_sources if pattern_authors.search(s.authors) + ] + + return SourceCollection(sources=filtered_sources) + + def __len__(self) -> int: + """ + Return the number of sources in this collection. + + Returns + ------- + int + The number of Source objects in the sources list. + + """ + return len(self.sources) + + def retrieve_all_from_wayback( + self, download_directory: pathlib.Path + ) -> list[pathlib.Path | None]: + """ + Download archived files for all sources in the collection using retrieve_from_wayback. + + Parameters + ---------- + download_directory : pathlib.Path + The base directory where all files will be saved. + + Returns + ------- + list[pathlib.Path | None] + List of paths where each file was stored, or None if download failed for a source. + + """ + return [ + source.retrieve_from_wayback(download_directory) for source in self.sources + ] + + def to_dataframe(self) -> pandas.DataFrame: + """ + Convert the SourceCollection to a pandas DataFrame. + + Returns + ------- + pd.DataFrame + A DataFrame containing the source data. + + """ + return pandas.DataFrame([source.model_dump() for source in self.sources]) + + def to_csv(self, **kwargs: pathlib.Path | str | bool) -> None: + """ + Export the SourceCollection to a CSV file. + + Parameters + ---------- + **kwargs : dict + Additional keyword arguments passed to pandas.DataFrame.to_csv(). + Common options include: + - path_or_buf : str or pathlib.Path or file-like object, optional + File path or object, if None, the result is returned as a string. + Default is None. + - sep : str + String of length 1. Field delimiter for the output file. + Default is ','. + - index : bool + Write row names (index). Default is True. + - encoding : str + String representing the encoding to use in the output file. + Default is 'utf-8'. + + Notes + ----- + The method converts the collection to a pandas DataFrame using + `self.to_dataframe()` and then writes it to a CSV file using the provided + kwargs. + + """ + default_kwargs = { + "sep": ",", + "index": False, + "encoding": "utf-8", + "quoting": csv.QUOTE_ALL, + } + + # Merge default_kwargs with user-provided kwargs, giving precedence to user kwargs + merged_kwargs = {**default_kwargs, **kwargs} + output_dataframe = self.to_dataframe() + output_dataframe.to_csv(**merged_kwargs) + + def to_json( + self, file_path: pathlib.Path, schema_path: pathlib.Path | None = None + ) -> None: + """ + Export the SourceCollection to a JSON file, together with a data schema. + + Parameters + ---------- + file_path : pathlib.Path + The path to the JSON file to be created. + schema_path : pathlib.Path + The path to the JSON schema file to be created. By default created with a `schema` suffix next to `file_path`. + + """ + if schema_path is None: + schema_path = file_path.with_suffix(".schema.json") + + # Export the model's schema with descriptions to a dict + schema = self.model_json_schema() + + # Save the schema (which includes descriptions) to a JSON file + with open(schema_path, "w") as f: + json.dump(schema, f, indent=4) + + with open(file_path, mode="w", encoding="utf-8") as jsonfile: + json_data = self.model_dump_json(indent=4) # Convert to JSON string + jsonfile.write(json_data) + + @classmethod + def from_json(cls, file_path: pathlib.Path | str) -> "SourceCollection": + """ + Import the SourceCollection from a JSON file. + + Parameters + ---------- + file_path : pathlib.Path + The path to the JSON file to be imported. + + """ + if isinstance(file_path, pathlib.Path | str): + file_path = pathlib.Path(file_path) + else: + raise TypeError("file_path must be a pathlib.Path or str") + with open(file_path, encoding="utf-8") as jsonfile: + json_data = json.load(jsonfile) + return cls(**json_data) diff --git a/technologydata/technology.py b/technologydata/technology.py new file mode 100644 index 00000000..ca09967e --- /dev/null +++ b/technologydata/technology.py @@ -0,0 +1,182 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + + +# TODO replaceholder + +"""Technology class for representing a technology with parameters and transformation methods.""" + +import typing + +import pydantic + +import technologydata + + +class Technology(pydantic.BaseModel): # type: ignore + """ + Represent a technology with region, year, and a flexible set of parameters. + + Parameters + ---------- + name : str + Name of the technology. + region : str + Region identifier. + year : Optional[int] + Year of the data. + parameters : Dict[str, Parameter] + Dictionary of parameter names to Parameter objects. + case : Optional[str] + Case or scenario identifier. + detailed_technology : Optional[str] + More detailed technology name. + + Attributes + ---------- + name : str + Name of the technology. + region : str + Region identifier. + year : Optional[int] + Year of the data. + parameters : Dict[str, Parameter] + Dictionary of parameter names to Parameter objects. + case : Optional[str] + Case or scenario identifier. + detailed_technology : Optional[str] + More detailed technology name. + + """ + + name: str = pydantic.Field(..., description="Name of the technology.") + region: str = pydantic.Field(..., description="Region identifier.") + year: int | None = pydantic.Field(None, description="Year of the data.") + parameters: dict[str, technologydata.Parameter] = pydantic.Field( + default_factory=dict, description="Parameters." + ) + case: str | None = pydantic.Field(None, description="Case or scenario identifier.") + detailed_technology: str | None = pydantic.Field( + None, description="Detailed technology name." + ) + + def __getitem__(self, key: str) -> technologydata.Parameter: + """ + Access a parameter by name. + + Parameters + ---------- + key : str + Parameter name. + + Returns + ------- + Parameter + The requested parameter. + + """ + return self.parameters[key] + + def __setitem__(self, key: str, value: technologydata.Parameter) -> None: + """ + Set a parameter by name. + + Parameters + ---------- + key : str + Parameter name. + value : Parameter + The parameter to set. + + """ + self.parameters[key] = value + + def check_consistency(self) -> bool: + """ + Check for consistency and completeness of parameters. + + Returns + ------- + bool + True if consistent, False otherwise. + + """ + # Example: check required parameters + required = ["specific_investment", "investment", "lifetime"] + missing = [p for p in required if p not in self.parameters] + return len(missing) == 0 + + def calculate_parameters( + self, parameters: typing.Any | None = None + ) -> "Technology": + """ + Calculate missing or derived parameters. + + Parameters + ---------- + parameters : Optional[Any] + List of parameter names to calculate, or "" for all missing. + + Returns + ------- + Technology + A new Technology object with calculated parameters. + + """ + # Placeholder: implement calculation logic as needed + return self + + def adjust_currency(self, target_currency: str) -> "Technology": + """ + Adjust all currency parameters to a target currency. + + Parameters + ---------- + target_currency : str + The target currency (e.g., 'EUR_2020'). + + Returns + ------- + Technology + A new Technology object with adjusted currency. + + """ + # Placeholder: implement currency adjustment logic + return self + + def adjust_region(self, target_region: str) -> "Technology": + """ + Adjust technology parameters to match a different region. + + Parameters + ---------- + target_region : str + The target region. + + Returns + ------- + Technology + A new Technology object with adjusted region. + + """ + # Placeholder: implement region adjustment logic + return self + + def adjust_scale(self, scaling_factor: float) -> "Technology": + """ + Scale parameter values by a scaling factor. + + Parameters + ---------- + scaling_factor : float + The scaling factor to apply. + + Returns + ------- + Technology + A new Technology object with scaled parameters. + + """ + # Placeholder: implement scaling logic + return self diff --git a/technologydata/unit_value.py b/technologydata/unit_value.py new file mode 100644 index 00000000..0b42cddb --- /dev/null +++ b/technologydata/unit_value.py @@ -0,0 +1,71 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT +# TODO implement (Johannes) +""" +UnitValue class for representing a value with an associated unit. + +This class is designed to support flexible units, including energy carriers, currencies with years, and more. + +Examples +-------- +>>> uv = UnitValue(value=100, unit="EUR_2020") +>>> uv.value +100 +>>> uv.unit +"EUR_2020" + +""" + +import pint +import pydantic + +ureg = pint.UnitRegistry() + + +class UnitValue(pydantic.BaseModel): # type: ignore + """ + Represent a numerical value with an associated unit of measurement. + + Parameters + ---------- + value : float + The numerical value. + unit : str + The unit of measurement (e.g., 'EUR_2020', 'kWh_electricity', 'kWh_hydrogen_LHV'). + + Attributes + ---------- + value : float + The numerical value. + unit : str + The unit of measurement. + + """ + + value: float = pydantic.Field(..., description="The numerical value.") + unit: str = pydantic.Field(..., description="The unit of measurement.") + + def to(self, new_unit: str) -> "UnitValue": + """ + Convert the value to a new unit using pint. + + Parameters + ---------- + new_unit : str + The unit to convert to. + + Returns + ------- + UnitValue + A new UnitValue instance with the converted value and unit. + + Raises + ------ + pint.errors.DimensionalityError + If the units are not compatible. + + """ + q = self.value * ureg(self.unit) + q_converted = q.to(new_unit) + return UnitValue(value=q_converted.magnitude, unit=str(q_converted.units)) diff --git a/technologydata/utils/__init__.py b/technologydata/utils/__init__.py new file mode 100644 index 00000000..d7f45354 --- /dev/null +++ b/technologydata/utils/__init__.py @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Provide classes and utilities for handling techno-economic data for energy system modeling.""" + +from technologydata.utils.commons import Commons, DateFormatEnum, FileExtensionEnum + +__all__ = [ + "Commons", + "DateFormatEnum", + "FileExtensionEnum", +] diff --git a/technologydata/utils/commons.py b/technologydata/utils/commons.py new file mode 100644 index 00000000..cb9b2cf1 --- /dev/null +++ b/technologydata/utils/commons.py @@ -0,0 +1,269 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Classes for Commons methods.""" + +import enum +import logging +import re +import typing + +import dateutil + +logger = logging.getLogger(__name__) + + +class DateFormatEnum(str, enum.Enum): + """ + Enum for date formats used in different sources. + + Attributes + ---------- + SOURCES_CSV : str + Date format for CSV sources, e.g., "2023-10-01 12:00:00". + WAYBACK : str + Date format for Wayback Machine, e.g., "20231001120000". + NONE : str + Represents an empty date format. + + """ + + SOURCES_CSV = "%Y-%m-%d %H:%M:%S" + WAYBACK = "%Y%m%d%H%M%S" + NONE = "" + + +class FileExtensionEnum(enum.Enum): + """ + An enumeration that maps various file extensions to their corresponding MIME types. + + This Enum provides a structured way to associate common file extensions with their respective + MIME types, facilitating easy retrieval of file extensions based on content types. Each member + of the enumeration is a tuple containing the file extension and its associated MIME type. + + Members + -------- + TEXT_PLAIN : tuple + Represents the MIME type "text/plain" with the file extension ".txt". + TEXT_HTML : tuple + Represents the MIME type "text/html" with the file extension ".html". + TEXT_CSV : tuple + Represents the MIME type "text/csv" with the file extension ".csv". + TEXT_XML : tuple + Represents the MIME type "text/xml" with the file extension ".xml". + APPLICATION_MS_EXCEL : tuple + Represents the MIME type "application/vnd.ms-excel" with the file extension ".xls". + APPLICATION_ODS : tuple + Represents the MIME type "application/vnd.oasis.opendocument.spreadsheet" with the file extension ".ods". + APPLICATION_OPENXML_EXCEL : tuple + Represents the MIME type "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + with the file extension ".xlsx". + APPLICATION_JSON : tuple + Represents the MIME type "application/json" with the file extension ".json". + APPLICATION_XML : tuple + Represents the MIME type "application/xml" with the file extension ".xml". + APPLICATION_PDF : tuple + Represents the MIME type "application/pdf" with the file extension ".pdf". + APPLICATION_PARQUET : tuple + Represents the MIME type "application/parquet" with the file extension ".parquet". + APPLICATION_VDN_PARQUET : tuple + Represents the MIME type "application/vdn.apache.parquet" with the file extension ".parquet". + APPLICATION_RAR_WINDOWS : tuple + Represents the MIME type "application/x-rar-compressed" with the file extension ".rar". + APPLICATION_RAR : tuple + Represents the MIME type "application/vnd.rar" with the file extension ".rar". + APPLICATION_ZIP : tuple + Represents the MIME type "application/zip" with the file extension ".zip". + APPLICATION_ZIP_WINDOWS : tuple + Represents the MIME type "application/x-zip-compressed" with the file extension ".zip". + """ + + TEXT_PLAIN = (".txt", "text/plain") + TEXT_HTML = (".html", "text/html") + TEXT_CSV = (".csv", "text/csv") + TEXT_XML = (".xml", "text/xml") + APPLICATION_MS_EXCEL = (".xls", "application/vnd.ms-excel") + APPLICATION_ODS = (".ods", "application/vnd.oasis.opendocument.spreadsheet") + APPLICATION_OPENXML_EXCEL = ( + ".xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ) + APPLICATION_JSON = (".json", "application/json") + APPLICATION_XML = (".xml", "application/xml") + APPLICATION_PDF = (".pdf", "application/pdf") + APPLICATION_PARQUET = (".parquet", "application/parquet") + APPLICATION_VDN_PARQUET = (".parquet", "application/vdn.apache.parquet") + APPLICATION_RAR_WINDOWS = (".rar", "application/x-rar-compressed") + APPLICATION_RAR = (".rar", "application/vnd.rar") + APPLICATION_ZIP = (".zip", "application/zip") + APPLICATION_ZIP_WINDOWS = (".zip", "application/x-zip-compressed") + + @classmethod + def get_extension(cls, content_type: str) -> str | None: + """ + Retrieve the file extension associated with a given MIME type. + + Parameters + ---------- + content_type : str + The MIME type for which the corresponding file extension is to be retrieved. + + Returns + ------- + str | None + The file extension associated with the given MIME type, or None if the + MIME type is not supported. + + Examples + -------- + >>> FileExtensionEnum.get_extension("application/pdf") + >>> '.pdf' + + >>> FileExtensionEnum.get_extension("application/unknown") + >>> None + + """ + for member in cls: + if member.value[1] == content_type: + return member.value[0] + return None + + @classmethod + def search_file_extension_in_url(cls, url: str) -> str | None: + """ + Search for the file extension in a given URL. + + Parameters + ---------- + url : str + The URL to search for the file extension. + + Returns + ------- + str | None + The file extension, or None if no match is found. + + Examples + -------- + >>> FileExtensionEnum.search_file_extension_in_url("https://example.com/file.pdf") + '.pdf' + + >>> FileExtensionEnum.search_file_extension_in_url("https://example.com/file.unknown") + None + + """ + for member in cls: + if re.search(r"\b" + re.escape(member.value[0]) + r"\b", url): + return member.value[0] + return None + + +class Commons: + """ + A utility class for various helper functions. + + This class provides static methods for common tasks, such as changing the format of datetime strings and replacing + special characters in strings. The methods are stateless and can be called without instantiating the class. + + Methods + ------- + change_datetime_format(input_datetime_string: str, output_datetime_format: DateFormatEnum) -> str | None: + Change the format of a given datetime string to a specified output format. + replace_special_characters(input_string: str) -> str: + Replace special characters and spaces in a string with underscores. + + Examples + -------- + >>> Commons.change_datetime_format("20250520144500", DateFormatEnum.SOURCES_CSV) + '2025-05-20 14:45:00' + >>> Commons.replace_special_characters("Hello, World! Welcome to Python @ 2023.") + 'hello_world_welcome_to_python_2023' + + """ + + @staticmethod + def change_datetime_format( + input_datetime_string: str, + output_datetime_format: DateFormatEnum, + ) -> str | typing.Any: + """ + Change the format of a given datetime string to a specified output format. + + The method takes a datetime string and automatically detects its format, then converts it to the specified output format. + If the input string cannot be parsed, it logs an error and returns None. + + Parameters + ---------- + input_datetime_string : str + datetime string that needs to be reformatted + + output_datetime_format : DateFormatEnum + desired format for the output datetime string, following the strftime format codes. + + Returns + ------- + str | None + reformatted datetime string if successful, otherwise None + + Raises + ------ + ValueError + If the input datetime string cannot be parsed. + + Examples + -------- + >>> Commons.change_datetime_format("20250520144500", DateFormatEnum.SOURCES_CSV) + >>> "2025-05-20 14:45:00" + + """ + try: + # Automatically detect the format of the input datetime string + dt = dateutil.parser.parse(input_datetime_string) + logger.debug(f"The datetime string has been parsed successfully: {dt}") + output_datetime_string = dt.strftime(output_datetime_format.value) + logger.debug(f"The format is now changed to {output_datetime_format.value}") + return output_datetime_string + except ValueError as e: + raise ValueError(f"Error during datetime formatting: {e}") + + @staticmethod + def replace_special_characters(input_string: str) -> str: + """ + Replace special characters and spaces in a string. + + The method replaces special characters and spaces in a string with underscores, + collapsing multiple consecutive underscores into a single underscore. Finally, it lowercases all characters of the string and removes leading or + trailing underscores. + + Parameters + ---------- + input_string : str + The input string from which special characters and spaces will be replaced. + + Returns + ------- + str + A new string with all special characters and spaces replaced by a single underscore + where consecutive underscores occur. + + Examples + -------- + >>> replace_special_characters("Hello, World! Welcome to Python @ 2023.") + 'hello_world_welcome_to_python_2023' + + >>> replace_special_characters("Special#Characters$Are%Fun!") + 'special_characters_are_fun' + + """ + # Replace any character that is not a word character or whitespace with underscore + replaced = re.sub(r"[^\w\s]", "_", input_string) + # Replace whitespace with underscore + replaced = replaced.replace(" ", "_") + # Collapse multiple consecutive underscores into a single underscore + replaced = re.sub(r"_+", "_", replaced) + # Remove leading and trailing underscores + replaced = replaced.strip("_") + # Lower case the string + replaced = replaced.casefold() + return replaced diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 00000000..a0d1fc81 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,97 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +""" +The module is used to define sharable pytest fixtures. + +Fixtures are a way to provide a fixed baseline upon which tests can +rely. They allow for setup code to be reused and can help manage +resources needed for tests, such as database connections, test data, +or configuration settings. +By placing fixtures in this file, they become accessible to all test +modules in the same directory and subdirectories, promoting code +reusability and organization. +""" + +import pathlib +import sys + +import pytest + +import technologydata + +sys.path.append("./technology-data") +path_cwd = pathlib.Path.cwd() + + +def create_source_from_params(params: dict[str, str]) -> technologydata.Source: + """ + Create a Source object from a parameter dictionary with validation. + + This function takes a dictionary of parameters and validates that the required fields are present. + If any required fields are missing, a ValueError is raised. If all required fields are present, + a new Source object is created and returned. + + Parameters + ---------- + params : dict[str, str] + A dictionary containing the parameters for creating a Source object. + Must include the keys "source_title" and "source_authors". + Other keys are optional. + + Returns + ------- + td.Source + A Source object initialized with the provided parameters. + + Raises + ------ + ValueError + If any of the required fields ("source_title", "source_authors") are missing from the params. + + Examples + -------- + >>> params_dict = { + ... "source_title": "Example Title", + ... "source_authors": "John Doe", + ... "source_url": "http://example.com", + ... "source_url_archive": "http://web.archive.org/web/20231001120000/http://example.com", + ... "source_url_date": "2023-10-01", + ... "source_url_date_archive": "2023-10-01T12:00:00Z" + ... } + >>> source = create_source_from_params(params_dict) + + """ + return technologydata.Source( + title=params["source_title"], + authors=params["source_authors"], + url=params.get("source_url"), + url_archive=params.get("source_url_archive"), + url_date=params.get("source_url_date"), + url_date_archive=params.get("source_url_date_archive"), + ) + + +@pytest.fixture(scope="function") # type: ignore +def example_source(request: pytest.FixtureRequest) -> technologydata.Source: + """Fixture to create an example source.""" + return create_source_from_params(request.param) + + +@pytest.fixture(scope="function") # type: ignore +def example_source_collection( + request: pytest.FixtureRequest, +) -> technologydata.SourceCollection: + """ + Fixture to create an example SourceCollection from a list of parameter dicts. + + Each dict in the list must contain the following keys: + - source_title + - source_authors + + This fixture is compatible with pytest parametrize. + """ + sources_params: list[dict[str, str]] = request.param + sources = [create_source_from_params(params) for params in sources_params] + return technologydata.SourceCollection(sources=sources) diff --git a/test/test_commons.py b/test/test_commons.py new file mode 100644 index 00000000..95bf5ad8 --- /dev/null +++ b/test/test_commons.py @@ -0,0 +1,141 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the utility methods.""" + +import typing + +import pytest + +import technologydata + + +@pytest.mark.parametrize( + "input_datetime_string, date_format, expected_date", + [ + ( + "2025-05-20 14:45:00", + technologydata.DateFormatEnum.SOURCES_CSV, + "2025-05-20 14:45:00", + ), + ( + "20250520144500", + technologydata.DateFormatEnum.SOURCES_CSV, + "2025-05-20 14:45:00", + ), + ( + "2025-05-20 14:45:00", + technologydata.DateFormatEnum.WAYBACK, + "20250520144500", + ), + ("20250520144500", technologydata.DateFormatEnum.WAYBACK, "20250520144500"), + ("2025-05-20 14:45:00", technologydata.DateFormatEnum.NONE, ""), + ("invalid-date-string", technologydata.DateFormatEnum.SOURCES_CSV, ValueError), + ("2025/13/01", technologydata.DateFormatEnum.SOURCES_CSV, ValueError), + ], +) # type: ignore +def test_change_datetime_format( + input_datetime_string: str, + date_format: technologydata.DateFormatEnum, + expected_date: str | typing.Any, +) -> None: + """Check if the datetime is correctly transformed to a new format.""" + if expected_date is ValueError: + with pytest.raises(ValueError, match="Error during datetime formatting"): + technologydata.Commons.change_datetime_format( + input_datetime_string, date_format + ) + else: + result = technologydata.Commons.change_datetime_format( + input_datetime_string, date_format + ) + assert result == expected_date + + +@pytest.mark.parametrize( + "input_string, expected_string", + [ + ( + "Hello, World! Welcome to Python @ 2023.", + "hello_world_welcome_to_python_2023", + ), + ( + " Special#Characters$Are%Fun! ", + "special_characters_are_fun", + ), + ( + "!!!LeadingAndTrailing!!!", + "leadingandtrailing", + ), + ], +) # type: ignore +def test_replace_special_characters( + input_string: str, + expected_string: str, +) -> None: + """Check if the special characters are removed from a string and the string is lowercased.""" + assert ( + technologydata.Commons.replace_special_characters(input_string) + == expected_string + ) + + +@pytest.mark.parametrize( + "input_string, expected_string", + [ + ("text/plain", ".txt"), + ("text/html", ".html"), + ("text/csv", ".csv"), + ("text/xml", ".xml"), + ("application/vnd.ms-excel", ".xls"), + ("application/vnd.oasis.opendocument.spreadsheet", ".ods"), + ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx"), + ("application/json", ".json"), + ("application/xml", ".xml"), + ("application/pdf", ".pdf"), + ("application/parquet", ".parquet"), + ("application/vdn.apache.parquet", ".parquet"), + ("application/x-rar-compressed", ".rar"), + ("application/vnd.rar", ".rar"), + ("application/zip", ".zip"), + ("application/x-zip-compressed", ".zip"), + ], +) # type: ignore +def test_get_extension( + input_string: str, + expected_string: str, +) -> None: + """Check if the correct file extension is associated to a given MIME type.""" + assert ( + technologydata.FileExtensionEnum.get_extension(input_string) == expected_string + ) + + +@pytest.mark.parametrize( + "input_string, expected_string", + [ + ("https://example.com/file.txt", ".txt"), + ("https://example.com/file.html", ".html"), + ("https://example.com/file.csv", ".csv"), + ("https://example.com/file.xml", ".xml"), + ("https://example.com/file.xls", ".xls"), + ("https://example.com/file.ods", ".ods"), + ("https://example.com/file.xlsx", ".xlsx"), + ("https://example.com/file.json", ".json"), + ("https://example.com/file.pdf", ".pdf"), + ("https://example.com/file.parquet", ".parquet"), + ("https://example.com/file.rar", ".rar"), + ("https://example.com/file.zip", ".zip"), + ("https://example.com/file.unknown", None), + ], +) # type: ignore +def test_search_file_extension_in_url( + input_string: str, + expected_string: str, +) -> None: + """Check if the correct file extension is found in a given url.""" + assert ( + technologydata.FileExtensionEnum.search_file_extension_in_url(input_string) + == expected_string + ) diff --git a/test/test_data/solar_photovoltaics_example_03/sources.json b/test/test_data/solar_photovoltaics_example_03/sources.json new file mode 100644 index 00000000..770b0e69 --- /dev/null +++ b/test/test_data/solar_photovoltaics_example_03/sources.json @@ -0,0 +1,20 @@ +{ + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] +} diff --git a/test/test_data/solar_photovoltaics_example_03/technologies.json b/test/test_data/solar_photovoltaics_example_03/technologies.json new file mode 100644 index 00000000..02712257 --- /dev/null +++ b/test/test_data/solar_photovoltaics_example_03/technologies.json @@ -0,0 +1,276 @@ +[ + { + "region": "DEU", + "case": "example-scenario", + "year": 2022, + "technology": "Solar photovoltaics", + "detailed_technology": "Si-HC", + "capacity": { + "quantity": { + "value": 1, + "unit": "MW" + }, + "provenance": "Model calculation", + "note": "Average capacity factor of 22% assumed", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "investment": { + "quantity": { + "value": 500, + "unit": "EUR_2022/KW_el" + }, + "provenance": "Industry report", + "note": "Average overnight cost", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" + }, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" + }, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" + }, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + { + "region": "DEU", + "case": "example-project", + "year": 2022, + "technology": "Solar photovoltaics", + "detailed_technology": "Si-HC", + "capacity": { + "quantity": { + "value": 1.0, + "unit": "MW" + }, + "provenance": "Model calculation", + "note": "Average capacity factor of 25% assumed", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "investment": { + "quantity": { + "value": 350, + "unit": "EUR_2022/KW_el" + }, + "provenance": "Industry report", + "note": "Average overnight cost for another tech", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" + }, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" + }, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + }, + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" + }, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + } +] diff --git a/test/test_data/solar_photovoltaics_example_04/technologies.json b/test/test_data/solar_photovoltaics_example_04/technologies.json new file mode 100644 index 00000000..964b37ae --- /dev/null +++ b/test/test_data/solar_photovoltaics_example_04/technologies.json @@ -0,0 +1,166 @@ +[ + { + "region": "DEU", + "case": "example-scenario", + "year": 2022, + "technology": "Solar photovoltaics", + "detailed_technology": "Si-HC", + "capacity": { + "quantity": { + "value": 1, + "unit": "MW" + }, + "provenance": "Model calculation", + "note": "Average capacity factor of 22% assumed", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "investment": { + "quantity": { + "value": 500, + "unit": "EUR_2022/KW_el" + }, + "provenance": "Industry report", + "note": "Average overnight cost", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" + }, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" + }, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" + }, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + } + }, + { + "region": "DEU", + "case": "example-project", + "year": 2022, + "technology": "Solar photovoltaics", + "detailed_technology": "Si-HC", + "capacity": { + "quantity": { + "value": 1.0, + "unit": "MW" + }, + "provenance": "Model calculation", + "note": "Average capacity factor of 25% assumed", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "investment": { + "quantity": { + "value": 350, + "unit": "EUR_2022/KW_el" + }, + "provenance": "Industry report", + "note": "Average overnight cost for another tech", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" + }, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" + }, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + }, + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" + }, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + } + } +] diff --git a/test/test_source.py b/test/test_source.py new file mode 100644 index 00000000..f2a521fc --- /dev/null +++ b/test/test_source.py @@ -0,0 +1,124 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the initialization and methods of the Source class.""" + +import datetime +import pathlib + +import pytest + +import technologydata + +path_cwd = pathlib.Path.cwd() + + +@pytest.mark.parametrize( + "example_source", + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + indirect=True, +) # type: ignore +def test_retrieve_from_wayback(example_source: technologydata.Source) -> None: + """Check if the example source is downloaded from the Internet Archive Wayback Machine.""" + storage_path = example_source.retrieve_from_wayback(path_cwd) + # Check if storage_paths is not None and is a list + assert storage_path is not None, "Expected a valid storage path, but got None." + assert isinstance(storage_path, pathlib.Path), ( + "Expected storage_path to be a pathlib.Path." + ) + assert storage_path is not None, "Expected a valid storage path, but got None." + assert storage_path.is_file(), ( + f"Expected {storage_path} to be a file, but it does not exist." + ) + # Delete the downloaded file + storage_path.unlink(missing_ok=True) + + +def test_store_in_wayback() -> None: + """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" + url_to_archive = "https://openenergytransition.org/outputs.html" + archived_info = technologydata.Source.store_in_wayback(url_to_archive) + + # Check if archived_info is None + assert archived_info is not None, "archived_info should not be None" + + archived_url, new_capture, output_timestamp = archived_info + + assert "https://web.archive.org/web/" in archived_url + assert url_to_archive in archived_url + assert isinstance(new_capture, bool) + + assert output_timestamp is not None, "output_timestamp should not be None" + try: + datetime.datetime.strptime( + output_timestamp, technologydata.DateFormatEnum.SOURCES_CSV + ) + except ValueError: + pytest.fail("Valid date-time string did not match the format") + + +@pytest.mark.parametrize( + "example_source", + [ + { + "source_title": "OET project page", + "source_authors": "Open Energy Transition gGmbH", + "source_url": "https://openenergytransition.org/outputs.html", + }, + ], + indirect=["example_source"], +) # type: ignore +def test_ensure_in_wayback(example_source: technologydata.Source) -> None: + """Check if the snapshot URL is created correctly.""" + # Ensure the snapshot is created + example_source.ensure_in_wayback() + assert example_source.url_date_archive is not None + assert example_source.url_archive is not None + + +@pytest.mark.parametrize( + "url_archived, source_path, source_title, expected_path", + [ + ( + "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + path_cwd, + "title", + pathlib.Path(path_cwd, "title.pdf"), + ), + ( + "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + path_cwd, + "title", + pathlib.Path(path_cwd, "title.parquet"), + ), + ], +) # type: ignore +def test_get_save_path( + url_archived: str, + source_path: pathlib.Path, + source_title: str, + expected_path: pathlib.Path, +) -> None: + """Check if the path where to store the file to download follows the requested pattern.""" + assert ( + technologydata.Source._get_save_path(url_archived, source_path, source_title) + == expected_path + ) diff --git a/test/test_source_collection.py b/test/test_source_collection.py new file mode 100644 index 00000000..41d65f68 --- /dev/null +++ b/test/test_source_collection.py @@ -0,0 +1,219 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the initialization and methods of the SourceCollection class.""" + +import pathlib + +import pandas +import pytest + +import technologydata + +path_cwd = pathlib.Path.cwd() + + +@pytest.mark.parametrize( + "example_source_collection", + [ + [ + { + "source_title": "Source 1", + "source_authors": "Author 1", + }, + { + "source_title": "Source 2", + "source_authors": "Author 2", + }, + ] + ], + indirect=True, +) # type: ignore +def test_example_source_collection( + example_source_collection: technologydata.SourceCollection, +) -> None: + """Check if the example source collection is instantiated correctly.""" + # Check that the returned object is a SourceCollection + assert isinstance(example_source_collection, technologydata.SourceCollection) + + # Check the number of sources + assert len(example_source_collection.sources) == 2 + + # Check the titles of the sources + assert example_source_collection.sources[0].title == "Source 1" + assert example_source_collection.sources[1].title == "Source 2" + assert example_source_collection.sources[0].authors == "Author 1" + assert example_source_collection.sources[1].authors == "Author 2" + + +@pytest.mark.parametrize( + "example_source_collection", + [ + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + ], + indirect=True, +) # type: ignore +def test_retrieve_all_from_wayback( + example_source_collection: technologydata.SourceCollection, +) -> None: + """Check if the example source collection is downloaded from the Internet Archive Wayback Machine.""" + storage_paths = example_source_collection.retrieve_all_from_wayback(path_cwd) + + # Check if storage_paths is not None and is a list + assert storage_paths is not None, "Expected storage_paths to be not None." + assert isinstance(storage_paths, list), "Expected storage_paths to be a list." + + # Filter out None values and check the remaining paths + valid_paths = [path for path in storage_paths if path is not None] + + assert all(isinstance(path, pathlib.Path) for path in valid_paths), ( + f"Expected all elements in {valid_paths} to be instances of pathlib.Path." + ) + assert all(path.is_file() for path in valid_paths), ( + f"Expected all elements in {valid_paths} to be a file, but it does not exist." + ) + + # Delete the downloaded files + for path in valid_paths: + path.unlink(missing_ok=True) + + +@pytest.mark.parametrize( + "example_source_collection", + [ + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + ], + indirect=True, +) # type: ignore +def test_to_csv(example_source_collection: technologydata.SourceCollection) -> None: + """Check if the example source collection is exported to CSV.""" + output_file = pathlib.Path(path_cwd, "export.csv") + example_source_collection.to_csv(path_or_buf=output_file) + assert output_file.is_file() + output_file.unlink(missing_ok=True) + + +@pytest.mark.parametrize( + "example_source_collection", + [ + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + ], + indirect=True, +) # type: ignore +def test_to_json(example_source_collection: technologydata.SourceCollection) -> None: + """Check if the example source collection is exported to JSON.""" + output_file = pathlib.Path(path_cwd, "sources.json") + schema_file = pathlib.Path(path_cwd, "source_collection_schema.json") + example_source_collection.to_json(pathlib.Path(output_file)) + assert output_file.is_file() + assert schema_file.is_file() + output_file.unlink(missing_ok=True) + schema_file.unlink(missing_ok=True) + + +@pytest.mark.parametrize( + "example_source_collection", + [ + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + ], + indirect=True, +) # type: ignore +def test_to_dataframe( + example_source_collection: technologydata.SourceCollection, +) -> None: + """Check if the example source collection is exported to pandas dataframe.""" + assert isinstance(example_source_collection.to_dataframe(), pandas.DataFrame) + + +def test_from_json() -> None: + """Check if the example source collection is exported to JSON.""" + input_file = pathlib.Path( + path_cwd, "test", "test_data", "solar_photovoltaics_example_03", "sources.json" + ) + source_collection = technologydata.SourceCollection.from_json(input_file) + assert isinstance(source_collection, technologydata.SourceCollection) + assert len(source_collection) == 2 + + +@pytest.mark.parametrize( + "title_pattern, authors_pattern", + [["ATB", "nrel"], ["TECH_DATA", "danish"]], +) # type: ignore +def test_get(title_pattern: str, authors_pattern: str) -> None: + """Check if the example source collection is filtered as requested.""" + input_file = pathlib.Path( + path_cwd, "test", "test_data", "solar_photovoltaics_example_03", "sources.json" + ) + + source_collection = technologydata.SourceCollection.from_json(input_file) + result = source_collection.get(title=title_pattern, authors=authors_pattern) + assert len(result.sources) == 1 diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..9a3db3d3 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2583 @@ +version = 1 +revision = 2 +requires-python = ">=3.12" + +[[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, upload_time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload_time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload_time = "2024-11-30T04:30:10.946Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "backrefs" +version = "5.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload_time = "2025-06-22T19:34:13.97Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload_time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload_time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload_time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload_time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload_time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, +] + +[[package]] +name = "certifi" +version = "2025.7.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386, upload_time = "2025-07-09T02:13:58.874Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230, upload_time = "2025-07-09T02:13:57.007Z" }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, +] + +[[package]] +name = "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, upload_time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "chardet" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload_time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload_time = "2025-05-20T23:19:47.796Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.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, upload_time = "2024-03-12T16:53:41.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload_time = "2024-03-12T16:53:39.226Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload_time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload_time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload_time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload_time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload_time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload_time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload_time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload_time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload_time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload_time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload_time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload_time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload_time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload_time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload_time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload_time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload_time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload_time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload_time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload_time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload_time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload_time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload_time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload_time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload_time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload_time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload_time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload_time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload_time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload_time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload_time = "2025-04-15T17:44:40.827Z" }, +] + +[[package]] +name = "csscompressor" +version = "0.9.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload_time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload_time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload_time = "2025-04-10T19:46:10.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload_time = "2025-04-10T19:46:26.044Z" }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload_time = "2025-04-10T19:46:27.464Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload_time = "2025-04-10T19:46:29.467Z" }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload_time = "2025-04-10T19:46:31.538Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload_time = "2025-04-10T19:46:32.96Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload_time = "2025-04-10T19:46:34.336Z" }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload_time = "2025-04-10T19:46:36.199Z" }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload_time = "2025-04-10T19:46:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload_time = "2025-04-10T19:46:54.077Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "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, upload_time = "2024-10-09T18:35:47.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload_time = "2024-10-09T18:35:44.272Z" }, +] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, +] + +[[package]] +name = "executing" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload_time = "2025-01-22T15:41:29.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload_time = "2025-01-22T15:41:25.929Z" }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, +] + +[[package]] +name = "flexcache" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, +] + +[[package]] +name = "flexparser" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, +] + +[[package]] +name = "fonttools" +version = "4.58.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/97/5735503e58d3816b0989955ef9b2df07e4c99b246469bd8b3823a14095da/fonttools-4.58.5.tar.gz", hash = "sha256:b2a35b0a19f1837284b3a23dd64fd7761b8911d50911ecd2bdbaf5b2d1b5df9c", size = 3526243, upload_time = "2025-07-03T14:04:47.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/68/66b498ee66f3e7e92fd68476c2509508082b7f57d68c0cdb4b8573f44331/fonttools-4.58.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c3af3fefaafb570a03051a0d6899b8374dcf8e6a4560e42575843aef33bdbad6", size = 2754751, upload_time = "2025-07-03T14:03:52.976Z" }, + { url = "https://files.pythonhosted.org/packages/f1/1e/edbc14b79290980c3944a1f43098624bc8965f534964aa03d52041f24cb4/fonttools-4.58.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:688137789dbd44e8757ad77b49a771539d8069195ffa9a8bcf18176e90bbd86d", size = 2322342, upload_time = "2025-07-03T14:03:54.957Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d7/3c87cf147185d91c2e946460a5cf68c236427b4a23ab96793ccb7d8017c9/fonttools-4.58.5-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af65836cf84cd7cb882d0b353bdc73643a497ce23b7414c26499bb8128ca1af", size = 4897011, upload_time = "2025-07-03T14:03:56.829Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d6/fbb44cc85d4195fe54356658bd9f934328b4f74ae14addd90b4b5558b5c9/fonttools-4.58.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2d79cfeb456bf438cb9fb87437634d4d6f228f27572ca5c5355e58472d5519d", size = 4942291, upload_time = "2025-07-03T14:03:59.204Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c8/453f82e21aedf25cdc2ae619c03a73512398cec9bd8b6c3b1c571e0b6632/fonttools-4.58.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0feac9dda9a48a7a342a593f35d50a5cee2dbd27a03a4c4a5192834a4853b204", size = 4886824, upload_time = "2025-07-03T14:04:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/40/54/e9190001b8e22d123f78925b2f508c866d9d18531694b979277ad45d59b0/fonttools-4.58.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36555230e168511e83ad8637232268649634b8dfff6ef58f46e1ebc057a041ad", size = 5038510, upload_time = "2025-07-03T14:04:03.917Z" }, + { url = "https://files.pythonhosted.org/packages/cf/9c/07cdad4774841a6304aabae939f8cbb9538cb1d8e97f5016b334da98e73a/fonttools-4.58.5-cp312-cp312-win32.whl", hash = "sha256:26ec05319353842d127bd02516eacb25b97ca83966e40e9ad6fab85cab0576f4", size = 2188459, upload_time = "2025-07-03T14:04:06.103Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4d/1eaaad22781d55f49d1b184563842172aeb6a4fe53c029e503be81114314/fonttools-4.58.5-cp312-cp312-win_amd64.whl", hash = "sha256:778a632e538f82c1920579c0c01566a8f83dc24470c96efbf2fbac698907f569", size = 2236565, upload_time = "2025-07-03T14:04:08.27Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ee/764dd8b99891f815241f449345863cfed9e546923d9cef463f37fd1d7168/fonttools-4.58.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f4b6f1360da13cecc88c0d60716145b31e1015fbe6a59e32f73a4404e2ea92cf", size = 2745867, upload_time = "2025-07-03T14:04:10.586Z" }, + { url = "https://files.pythonhosted.org/packages/e2/23/8fef484c02fef55e226dfeac4339a015c5480b6a496064058491759ac71e/fonttools-4.58.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a036822e915692aa2c03e2decc60f49a8190f8111b639c947a4f4e5774d0d7a", size = 2317933, upload_time = "2025-07-03T14:04:12.335Z" }, + { url = "https://files.pythonhosted.org/packages/ab/47/f92b135864fa777e11ad68420bf89446c91a572fe2782745586f8e6aac0c/fonttools-4.58.5-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d7709fcf4577b0f294ee6327088884ca95046e1eccde87c53bbba4d5008541", size = 4877844, upload_time = "2025-07-03T14:04:14.58Z" }, + { url = "https://files.pythonhosted.org/packages/3e/65/6c1a83511d8ac32411930495645edb3f8dfabebcb78f08cf6009ba2585ec/fonttools-4.58.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9b5099ca99b79d6d67162778b1b1616fc0e1de02c1a178248a0da8d78a33852", size = 4940106, upload_time = "2025-07-03T14:04:16.563Z" }, + { url = "https://files.pythonhosted.org/packages/fa/90/df8eb77d6cf266cbbba01866a1349a3e9121e0a63002cf8d6754e994f755/fonttools-4.58.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f2c05a8d82a4d15aebfdb3506e90793aea16e0302cec385134dd960647a36c0", size = 4879458, upload_time = "2025-07-03T14:04:19.584Z" }, + { url = "https://files.pythonhosted.org/packages/26/b1/e32f8de51b7afcfea6ad62780da2fa73212c43a32cd8cafcc852189d7949/fonttools-4.58.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79f0c4b1cc63839b61deeac646d8dba46f8ed40332c2ac1b9997281462c2e4ba", size = 5021917, upload_time = "2025-07-03T14:04:21.736Z" }, + { url = "https://files.pythonhosted.org/packages/89/72/578aa7fe32918dd763c62f447aaed672d665ee10e3eeb1725f4d6493fe96/fonttools-4.58.5-cp313-cp313-win32.whl", hash = "sha256:a1a9a2c462760976882131cbab7d63407813413a2d32cd699e86a1ff22bf7aa5", size = 2186827, upload_time = "2025-07-03T14:04:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/71/a3/21e921b16cb9c029d3308e0cb79c9a937e9ff1fc1ee28c2419f0957b9e7c/fonttools-4.58.5-cp313-cp313-win_amd64.whl", hash = "sha256:bca61b14031a4b7dc87e14bf6ca34c275f8e4b9f7a37bc2fe746b532a924cf30", size = 2235706, upload_time = "2025-07-03T14:04:26.082Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1d85a1996b6188cd2713230e002d79a6f3a289bb17cef600cba385848b72/fonttools-4.58.5-py3-none-any.whl", hash = "sha256:e48a487ed24d9b611c5c4b25db1e50e69e9854ca2670e39a3486ffcd98863ec4", size = 1115318, upload_time = "2025-07-03T14:04:45.378Z" }, +] + +[[package]] +name = "frictionless" +version = "5.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "chardet" }, + { name = "humanize" }, + { name = "isodate" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "marko" }, + { name = "petl" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "python-slugify" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rfc3986" }, + { name = "simpleeval" }, + { name = "tabulate" }, + { name = "typer" }, + { name = "typing-extensions" }, + { name = "validators" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, +] + +[package.optional-dependencies] +pandas = [ + { name = "pandas" }, + { name = "pyarrow" }, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload_time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload_time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload_time = "2025-01-02T07:32:43.59Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload_time = "2025-01-02T07:32:40.731Z" }, +] + +[[package]] +name = "griffe" +version = "1.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137, upload_time = "2025-04-23T11:29:09.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload_time = "2025-04-23T11:29:07.145Z" }, +] + +[[package]] +name = "hdx-python-country" +version = "3.9.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hdx-python-utilities" }, + { name = "libhxl" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/6b/424edb0f0834cd645a9ea97e2741046d42dbc54407eaef17bcd160f8e58d/hdx_python_country-3.9.5.tar.gz", hash = "sha256:1db9872a083c8bd0632ae13247b48011ab4655265b7967f73eeac88123168879", size = 529170, upload_time = "2025-06-24T22:28:08.996Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/9a/19b60f18d26bc674cc5c5e6a55ea0ec1da3713df6a307dfe6881486464f3/hdx_python_country-3.9.5-py3-none-any.whl", hash = "sha256:6e21b3f904564c8ef61835f063d2bcefff11393967bbe261b42ea87fe82f9b7c", size = 55537, upload_time = "2025-06-24T22:28:06.824Z" }, +] + +[[package]] +name = "hdx-python-utilities" +version = "3.8.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frictionless" }, + { name = "ijson" }, + { name = "jsonlines" }, + { name = "loguru" }, + { name = "openpyxl" }, + { name = "pyphonetics" }, + { name = "python-dateutil" }, + { name = "ratelimit" }, + { name = "requests-file" }, + { name = "ruamel-yaml" }, + { name = "tableschema-to-template" }, + { name = "xlrd" }, + { name = "xlsx2csv" }, + { name = "xlwt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009, upload_time = "2025-05-14T02:31:28.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787, upload_time = "2025-05-14T02:31:26.794Z" }, +] + +[[package]] +name = "htmlmin2" +version = "0.1.13" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, +] + +[[package]] +name = "humanize" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514, upload_time = "2025-04-30T11:51:07.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487, upload_time = "2025-04-30T11:51:06.468Z" }, +] + +[[package]] +name = "identify" +version = "2.6.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload_time = "2025-05-23T20:37:53.3Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload_time = "2025-05-23T20:37:51.495Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "ijson" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, +] + +[[package]] +name = "imf-reader" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "chardet" }, + { name = "pandas" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990, upload_time = "2025-02-06T09:16:10.723Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520, upload_time = "2025-02-06T09:16:09.042Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "ipykernel" +version = "6.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, upload_time = "2024-07-01T14:07:22.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload_time = "2024-07-01T14:07:19.603Z" }, +] + +[[package]] +name = "ipython" +version = "9.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload_time = "2025-07-01T11:11:30.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload_time = "2025-07-01T11:11:27.85Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload_time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload_time = "2025-05-23T12:04:37.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload_time = "2025-05-23T12:04:35.124Z" }, +] + +[[package]] +name = "jsmin" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } + +[[package]] +name = "jsonlines" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, +] + +[[package]] +name = "jsonpath-ng" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ply" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.24.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/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480, upload_time = "2025-05-26T18:48:10.459Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709, upload_time = "2025-05-26T18:48:08.417Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload_time = "2024-09-17T10:44:15.218Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload_time = "2025-05-27T07:38:16.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload_time = "2024-12-24T18:30:51.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152, upload_time = "2024-12-24T18:29:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555, upload_time = "2024-12-24T18:29:19.146Z" }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067, upload_time = "2024-12-24T18:29:20.096Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443, upload_time = "2024-12-24T18:29:22.843Z" }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728, upload_time = "2024-12-24T18:29:24.463Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388, upload_time = "2024-12-24T18:29:25.776Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849, upload_time = "2024-12-24T18:29:27.202Z" }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533, upload_time = "2024-12-24T18:29:28.638Z" }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898, upload_time = "2024-12-24T18:29:30.368Z" }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605, upload_time = "2024-12-24T18:29:33.151Z" }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801, upload_time = "2024-12-24T18:29:34.584Z" }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077, upload_time = "2024-12-24T18:29:36.138Z" }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410, upload_time = "2024-12-24T18:29:39.991Z" }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853, upload_time = "2024-12-24T18:29:42.006Z" }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424, upload_time = "2024-12-24T18:29:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156, upload_time = "2024-12-24T18:29:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555, upload_time = "2024-12-24T18:29:46.37Z" }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071, upload_time = "2024-12-24T18:29:47.333Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053, upload_time = "2024-12-24T18:29:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278, upload_time = "2024-12-24T18:29:51.164Z" }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139, upload_time = "2024-12-24T18:29:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517, upload_time = "2024-12-24T18:29:53.941Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952, upload_time = "2024-12-24T18:29:56.523Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132, upload_time = "2024-12-24T18:29:57.989Z" }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997, upload_time = "2024-12-24T18:29:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060, upload_time = "2024-12-24T18:30:01.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471, upload_time = "2024-12-24T18:30:04.574Z" }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793, upload_time = "2024-12-24T18:30:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855, upload_time = "2024-12-24T18:30:07.535Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430, upload_time = "2024-12-24T18:30:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294, upload_time = "2024-12-24T18:30:09.508Z" }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736, upload_time = "2024-12-24T18:30:11.039Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194, upload_time = "2024-12-24T18:30:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942, upload_time = "2024-12-24T18:30:18.927Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341, upload_time = "2024-12-24T18:30:22.102Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455, upload_time = "2024-12-24T18:30:24.947Z" }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138, upload_time = "2024-12-24T18:30:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857, upload_time = "2024-12-24T18:30:28.86Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129, upload_time = "2024-12-24T18:30:30.34Z" }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538, upload_time = "2024-12-24T18:30:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661, upload_time = "2024-12-24T18:30:34.939Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710, upload_time = "2024-12-24T18:30:37.281Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213, upload_time = "2024-12-24T18:30:40.019Z" }, +] + +[[package]] +name = "lark" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/60/bc7622aefb2aee1c0b4ba23c1446d3e30225c8770b38d7aedbfb65ca9d5a/lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80", size = 252132, upload_time = "2024-08-13T19:49:00.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/00/d90b10b962b4277f5e64a78b6609968859ff86889f5b898c1a778c06ec00/lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c", size = 111036, upload_time = "2024-08-13T19:48:58.603Z" }, +] + +[[package]] +name = "libhxl" +version = "5.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpath-ng" }, + { name = "ply" }, + { name = "python-dateutil" }, + { name = "python-io-wrapper" }, + { name = "requests" }, + { name = "structlog" }, + { name = "unidecode" }, + { name = "urllib3" }, + { name = "wheel" }, + { name = "xlrd3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } + +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, +] + +[[package]] +name = "markdown" +version = "3.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071, upload_time = "2025-06-19T17:12:44.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload_time = "2025-06-19T17:12:42.994Z" }, +] + +[[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, upload_time = "2023-06-03T06:41:14.443Z" } +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, upload_time = "2023-06-03T06:41:11.019Z" }, +] + +[[package]] +name = "marko" +version = "2.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795, upload_time = "2025-06-13T03:25:50.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186, upload_time = "2025-06-13T03:25:49.858Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.3" +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/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811, upload_time = "2025-05-08T19:10:54.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/43/6b80eb47d1071f234ef0c96ca370c2ca621f91c12045f1401b5c9b28a639/matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea", size = 8179689, upload_time = "2025-05-08T19:10:07.602Z" }, + { url = "https://files.pythonhosted.org/packages/0f/70/d61a591958325c357204870b5e7b164f93f2a8cca1dc6ce940f563909a13/matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4", size = 8050466, upload_time = "2025-05-08T19:10:09.383Z" }, + { url = "https://files.pythonhosted.org/packages/e7/75/70c9d2306203148cc7902a961240c5927dd8728afedf35e6a77e105a2985/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee", size = 8456252, upload_time = "2025-05-08T19:10:11.958Z" }, + { url = "https://files.pythonhosted.org/packages/c4/91/ba0ae1ff4b3f30972ad01cd4a8029e70a0ec3b8ea5be04764b128b66f763/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a", size = 8601321, upload_time = "2025-05-08T19:10:14.47Z" }, + { url = "https://files.pythonhosted.org/packages/d2/88/d636041eb54a84b889e11872d91f7cbf036b3b0e194a70fa064eb8b04f7a/matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7", size = 9406972, upload_time = "2025-05-08T19:10:16.569Z" }, + { url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05", size = 8067954, upload_time = "2025-05-08T19:10:18.663Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c1/23cfb566a74c696a3b338d8955c549900d18fe2b898b6e94d682ca21e7c2/matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", size = 8180318, upload_time = "2025-05-08T19:10:20.426Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/02f1c3b66b30da9ee343c343acbb6251bef5b01d34fad732446eaadcd108/matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", size = 8051132, upload_time = "2025-05-08T19:10:22.569Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ab/8db1a5ac9b3a7352fb914133001dae889f9fcecb3146541be46bed41339c/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", size = 8457633, upload_time = "2025-05-08T19:10:24.749Z" }, + { url = "https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", size = 8601031, upload_time = "2025-05-08T19:10:27.03Z" }, + { url = "https://files.pythonhosted.org/packages/12/6f/6cc79e9e5ab89d13ed64da28898e40fe5b105a9ab9c98f83abd24e46d7d7/matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", size = 9406988, upload_time = "2025-05-08T19:10:29.056Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", size = 8068034, upload_time = "2025-05-08T19:10:31.221Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e5/2f14791ff69b12b09e9975e1d116d9578ac684460860ce542c2588cb7a1c/matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", size = 8218223, upload_time = "2025-05-08T19:10:33.114Z" }, + { url = "https://files.pythonhosted.org/packages/5c/08/30a94afd828b6e02d0a52cae4a29d6e9ccfcf4c8b56cc28b021d3588873e/matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", size = 8094985, upload_time = "2025-05-08T19:10:35.337Z" }, + { url = "https://files.pythonhosted.org/packages/89/44/f3bc6b53066c889d7a1a3ea8094c13af6a667c5ca6220ec60ecceec2dabe/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", size = 8483109, upload_time = "2025-05-08T19:10:37.611Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c7/473bc559beec08ebee9f86ca77a844b65747e1a6c2691e8c92e40b9f42a8/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", size = 8618082, upload_time = "2025-05-08T19:10:39.892Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e9/6ce8edd264c8819e37bbed8172e0ccdc7107fe86999b76ab5752276357a4/matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", size = 9413699, upload_time = "2025-05-08T19:10:42.376Z" }, + { url = "https://files.pythonhosted.org/packages/1b/92/9a45c91089c3cf690b5badd4be81e392ff086ccca8a1d4e3a08463d8a966/matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", size = 8139044, upload_time = "2025-05-08T19:10:44.551Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload_time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload_time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload_time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload_time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-autolinks-plugin" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload_time = "2023-08-04T14:42:25.67Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload_time = "2023-08-04T14:42:23.955Z" }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/0c/c9826f35b99c67fa3a7cddfa094c1a6c43fafde558c309c6e4403e5b37dc/mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749", size = 54961, upload_time = "2025-05-20T13:09:09.886Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/dc/fc063b78f4b769d1956319351704e23ebeba1e9e1d6a41b4b602325fd7e4/mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13", size = 24969, upload_time = "2025-05-20T13:09:08.237Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload_time = "2023-11-20T17:51:09.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload_time = "2023-11-20T17:51:08.587Z" }, +] + +[[package]] +name = "mkdocs-git-revision-date-localized-plugin" +version = "1.4.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "gitpython" }, + { name = "mkdocs" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload_time = "2025-05-28T18:26:20.697Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload_time = "2025-05-28T18:26:18.907Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.6.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/c1/f804ba2db2ddc2183e900befe7dad64339a34fa935034e1ab405289d0a97/mkdocs_material-9.6.15.tar.gz", hash = "sha256:64adf8fa8dba1a17905b6aee1894a5aafd966d4aeb44a11088519b0f5ca4f1b5", size = 3951836, upload_time = "2025-07-01T10:14:15.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/30/dda19f0495a9096b64b6b3c07c4bfcff1c76ee0fc521086d53593f18b4c0/mkdocs_material-9.6.15-py3-none-any.whl", hash = "sha256:ac969c94d4fe5eb7c924b6d2f43d7db41159ea91553d18a9afc4780c34f2717a", size = 8716840, upload_time = "2025-07-01T10:14:13.18Z" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload_time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload_time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "mkdocs-minify-plugin" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "csscompressor" }, + { name = "htmlmin2" }, + { name = "jsmin" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366, upload_time = "2024-01-29T16:11:32.982Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723, upload_time = "2024-01-29T16:11:31.851Z" }, +] + +[[package]] +name = "mkdocs-open-in-new-tab" +version = "1.0.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791, upload_time = "2024-11-18T13:15:13.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717, upload_time = "2024-11-18T13:15:12.286Z" }, +] + +[[package]] +name = "mkdocstrings" +version = "0.29.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "pymdown-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686, upload_time = "2025-03-31T08:33:11.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075, upload_time = "2025-03-31T08:33:09.661Z" }, +] + +[[package]] +name = "mkdocstrings-python" +version = "1.16.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffe" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/ed/b886f8c714fd7cccc39b79646b627dbea84cd95c46be43459ef46852caf0/mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d", size = 206065, upload_time = "2025-06-03T12:52:49.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/dd/a24ee3de56954bfafb6ede7cd63c2413bb842cc48eb45e41c43a05a33074/mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374", size = 124287, upload_time = "2025-06-03T12:52:47.819Z" }, +] + +[[package]] +name = "mypy" +version = "1.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload_time = "2025-06-16T16:51:35.145Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493, upload_time = "2025-06-16T16:47:01.683Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687, upload_time = "2025-06-16T16:48:19.367Z" }, + { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723, upload_time = "2025-06-16T16:49:20.912Z" }, + { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980, upload_time = "2025-06-16T16:37:40.929Z" }, + { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328, upload_time = "2025-06-16T16:34:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321, upload_time = "2025-06-16T16:48:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480, upload_time = "2025-06-16T16:47:56.205Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538, upload_time = "2025-06-16T16:46:43.92Z" }, + { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839, upload_time = "2025-06-16T16:36:28.039Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634, upload_time = "2025-06-16T16:50:34.441Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584, upload_time = "2025-06-16T16:34:54.857Z" }, + { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886, upload_time = "2025-06-16T16:36:43.589Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923, upload_time = "2025-06-16T16:48:02.366Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload_time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload_time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "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, upload_time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload_time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372, upload_time = "2025-06-21T12:28:33.469Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664, upload_time = "2025-06-21T12:15:30.845Z" }, + { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078, upload_time = "2025-06-21T12:15:52.23Z" }, + { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554, upload_time = "2025-06-21T12:16:01.434Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560, upload_time = "2025-06-21T12:16:11.895Z" }, + { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638, upload_time = "2025-06-21T12:16:32.611Z" }, + { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729, upload_time = "2025-06-21T12:16:57.439Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330, upload_time = "2025-06-21T12:17:20.638Z" }, + { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734, upload_time = "2025-06-21T12:17:47.938Z" }, + { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411, upload_time = "2025-06-21T12:17:58.475Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973, upload_time = "2025-06-21T12:18:17.601Z" }, + { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491, upload_time = "2025-06-21T12:18:33.585Z" }, + { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381, upload_time = "2025-06-21T12:19:04.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726, upload_time = "2025-06-21T12:19:25.599Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145, upload_time = "2025-06-21T12:19:34.782Z" }, + { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409, upload_time = "2025-06-21T12:19:45.228Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630, upload_time = "2025-06-21T12:20:06.544Z" }, + { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546, upload_time = "2025-06-21T12:20:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538, upload_time = "2025-06-21T12:20:54.322Z" }, + { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327, upload_time = "2025-06-21T12:21:21.053Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330, upload_time = "2025-06-21T12:25:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565, upload_time = "2025-06-21T12:25:26.444Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262, upload_time = "2025-06-21T12:25:42.196Z" }, + { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593, upload_time = "2025-06-21T12:21:51.664Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523, upload_time = "2025-06-21T12:22:13.583Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993, upload_time = "2025-06-21T12:22:22.53Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652, upload_time = "2025-06-21T12:22:33.629Z" }, + { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561, upload_time = "2025-06-21T12:22:55.056Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349, upload_time = "2025-06-21T12:23:20.53Z" }, + { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053, upload_time = "2025-06-21T12:23:43.697Z" }, + { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184, upload_time = "2025-06-21T12:24:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678, upload_time = "2025-06-21T12:24:21.596Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697, upload_time = "2025-06-21T12:24:40.644Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376, upload_time = "2025-06-21T12:24:56.884Z" }, +] + +[[package]] +name = "oda-reader" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "openpyxl" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630, upload_time = "2025-06-16T16:15:05.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314, upload_time = "2025-06-16T16:15:04.328Z" }, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload_time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload_time = "2024-08-25T14:17:22.55Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload_time = "2025-07-07T19:20:04.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload_time = "2025-07-07T19:18:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload_time = "2025-07-07T19:18:54.785Z" }, + { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload_time = "2025-07-07T19:18:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload_time = "2025-07-07T19:18:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload_time = "2025-07-07T19:19:02.944Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload_time = "2025-07-07T19:19:06.82Z" }, + { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload_time = "2025-07-07T19:19:09.589Z" }, + { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload_time = "2025-07-07T19:19:12.245Z" }, + { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload_time = "2025-07-07T19:19:14.612Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload_time = "2025-07-07T19:19:16.857Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload_time = "2025-07-07T19:19:19.265Z" }, + { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload_time = "2025-07-07T19:19:21.547Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload_time = "2025-07-07T19:19:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload_time = "2025-07-07T19:19:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload_time = "2025-07-07T19:19:26.362Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload_time = "2025-07-07T19:19:29.157Z" }, + { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload_time = "2025-07-07T19:19:31.436Z" }, + { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload_time = "2025-07-07T19:19:34.267Z" }, + { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload_time = "2025-07-07T19:19:36.856Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload_time = "2025-07-07T19:19:39.999Z" }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload_time = "2024-04-05T09:43:55.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload_time = "2024-04-05T09:43:53.299Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "petl" +version = "1.7.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780, upload_time = "2025-04-04T23:54:50.921Z" } + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload_time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload_time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload_time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload_time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload_time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload_time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload_time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload_time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload_time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload_time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload_time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload_time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload_time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload_time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload_time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload_time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload_time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload_time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload_time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload_time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload_time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload_time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload_time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload_time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload_time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload_time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload_time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload_time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload_time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload_time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload_time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload_time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload_time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload_time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload_time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload_time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload_time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload_time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload_time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload_time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload_time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload_time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload_time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload_time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload_time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload_time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload_time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload_time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload_time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload_time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload_time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload_time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload_time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload_time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload_time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload_time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload_time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload_time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload_time = "2025-07-01T09:15:50.399Z" }, +] + +[[package]] +name = "pint" +version = "0.24.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flexcache" }, + { name = "flexparser" }, + { name = "platformdirs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload_time = "2024-11-07T16:29:46.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload_time = "2024-11-07T16:29:43.976Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload_time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload_time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "ply" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload_time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload_time = "2025-03-18T21:35:19.343Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload_time = "2025-04-15T09:18:47.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload_time = "2025-04-15T09:18:44.753Z" }, +] + +[[package]] +name = "psutil" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload_time = "2025-02-13T21:54:07.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload_time = "2025-02-13T21:54:12.36Z" }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload_time = "2025-02-13T21:54:16.07Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload_time = "2025-02-13T21:54:18.662Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload_time = "2025-02-13T21:54:21.811Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload_time = "2025-02-13T21:54:24.68Z" }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload_time = "2025-02-13T21:54:34.31Z" }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload_time = "2025-02-13T21:54:37.486Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload_time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload_time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pyarrow" +version = "20.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload_time = "2024-03-30T13:22:22.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload_time = "2025-06-14T08:33:17.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload_time = "2025-06-14T08:33:14.905Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, +] + +[[package]] +name = "pydeflate" +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hdx-python-country" }, + { name = "imf-reader" }, + { name = "oda-reader" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "requests" }, + { name = "wbgapi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586, upload_time = "2025-06-03T09:38:12.25Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540, upload_time = "2025-06-03T09:38:10.858Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197, upload_time = "2025-06-21T17:56:36.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143, upload_time = "2025-06-21T17:56:35.356Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload_time = "2025-03-25T05:01:28.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload_time = "2025-03-25T05:01:24.908Z" }, +] + +[[package]] +name = "pyphonetics" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload_time = "2025-06-18T05:48:06.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload_time = "2025-06-18T05:48:03.955Z" }, +] + +[[package]] +name = "python-calamine" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/03/269f96535705b2f18c8977fa58e76763b4e4727a9b3ae277a9468c8ffe05/python_calamine-0.4.0.tar.gz", hash = "sha256:94afcbae3fec36d2d7475095a59d4dc6fae45829968c743cb799ebae269d7bbf", size = 127737, upload_time = "2025-07-04T06:05:28.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/60/f951513aaaa470b3a38a87d65eca45e0a02bc329b47864f5a17db563f746/python_calamine-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:74bca5d44a73acf3dcfa5370820797fcfd225c8c71abcddea987c5b4f5077e98", size = 826603, upload_time = "2025-07-04T06:03:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/76/3f/789955bbc77831c639890758f945eb2b25d6358065edf00da6751226cf31/python_calamine-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf80178f5d1b0ee2ccfffb8549c50855f6249e930664adc5807f4d0d6c2b269c", size = 805826, upload_time = "2025-07-04T06:03:52.482Z" }, + { url = "https://files.pythonhosted.org/packages/00/4c/f87d17d996f647030a40bfd124fe45fe893c002bee35ae6aca9910a923ae/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfef345386ae86f7720f1be93495a40fd7e7feabb8caa1df5025d7fbc58a1f", size = 874989, upload_time = "2025-07-04T06:03:53.794Z" }, + { url = "https://files.pythonhosted.org/packages/47/d2/3269367303f6c0488cf1bfebded3f9fe968d118a988222e04c9b2636bf2e/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f23e6214dbf9b29065a5dcfd6a6c674dd0e251407298c9138611c907d53423ff", size = 877504, upload_time = "2025-07-04T06:03:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/f9/6d/c7ac35f5c7125e8bd07eb36773f300fda20dd2da635eae78a8cebb0b6ab7/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d792d304ee232ab01598e1d3ab22e074a32c2511476b5fb4f16f4222d9c2a265", size = 1014171, upload_time = "2025-07-04T06:03:56.777Z" }, + { url = "https://files.pythonhosted.org/packages/f0/81/5ea8792a2e9ab5e2a05872db3a4d3ed3538ad5af1861282c789e2f13a8cf/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf813425918fd68f3e991ef7c4b5015be0a1a95fc4a8ab7e73c016ef1b881bb4", size = 926737, upload_time = "2025-07-04T06:03:58.024Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/989e56e6f073fc0981a74ba7a393881eb351bb143e5486aa629b5e5d6a8b/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbe2a0ccb4d003635888eea83a995ff56b0748c8c76fc71923544f5a4a7d4cd7", size = 887032, upload_time = "2025-07-04T06:03:59.298Z" }, + { url = "https://files.pythonhosted.org/packages/5d/92/2c9bd64277c6fe4be695d7d5a803b38d953ec8565037486be7506642c27c/python_calamine-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7b3bb5f0d910b9b03c240987560f843256626fd443279759df4e91b717826d2", size = 929700, upload_time = "2025-07-04T06:04:01.388Z" }, + { url = "https://files.pythonhosted.org/packages/64/fa/fc758ca37701d354a6bc7d63118699f1c73788a1f2e1b44d720824992764/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bd2c0fc2b5eabd08ceac8a2935bffa88dbc6116db971aa8c3f244bad3fd0f644", size = 1053971, upload_time = "2025-07-04T06:04:02.704Z" }, + { url = "https://files.pythonhosted.org/packages/65/52/40d7e08ae0ddba331cdc9f7fb3e92972f8f38d7afbd00228158ff6d1fceb/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:85b547cb1c5b692a0c2406678d666dbc1cec65a714046104683fe4f504a1721d", size = 1057057, upload_time = "2025-07-04T06:04:04.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/e8a071c0adfda73285d891898a24f6e99338328c404f497ff5b0e6bc3d45/python_calamine-0.4.0-cp312-cp312-win32.whl", hash = "sha256:4c2a1e3a0db4d6de4587999a21cc35845648c84fba81c03dd6f3072c690888e4", size = 665540, upload_time = "2025-07-04T06:04:05.679Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f2/7fdfada13f80db12356853cf08697ff4e38800a1809c2bdd26ee60962e7a/python_calamine-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b193c89ffcc146019475cd121c552b23348411e19c04dedf5c766a20db64399a", size = 695366, upload_time = "2025-07-04T06:04:06.977Z" }, + { url = "https://files.pythonhosted.org/packages/20/66/d37412ad854480ce32f50d9f74f2a2f88b1b8a6fbc32f70aabf3211ae89e/python_calamine-0.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:43a0f15e0b60c75a71b21a012b911d5d6f5fa052afad2a8edbc728af43af0fcf", size = 670740, upload_time = "2025-07-04T06:04:08.656Z" }, + { url = "https://files.pythonhosted.org/packages/5a/10/f78218ccdc5bb5591a37d582c7e8723121d0fbe8196c5a4089110ec02f22/python_calamine-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f8d6b2d2ae73acf91343f02756bdcb2fa6117db4eaf5cfab75ce50dfb54525ee", size = 826339, upload_time = "2025-07-04T06:04:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/15/b1/d7d0dbbd0469db0fc628b1b9ee3a8f3b698391279f0d7aea96e2018a3863/python_calamine-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aca7e019f42ca16806fef53e3028fa158005c0e68eabda577c3f3c2bea9735fd", size = 805473, upload_time = "2025-07-04T06:04:11.557Z" }, + { url = "https://files.pythonhosted.org/packages/46/52/033b902fb11f9b4bb59fa18621acbf5eaf4ecb0bce878d34fcb0020229df/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aca67cb447ba8dcefa4d5a1131d1cfdd1e0d0a0f0c6470655ce9ad37b7cfa228", size = 874275, upload_time = "2025-07-04T06:04:13.318Z" }, + { url = "https://files.pythonhosted.org/packages/56/12/e6b589293314a5d10b2c309411542424ebefb77430cc715d7601d80349ae/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e127d3b78d511d4f6fbdfed02fe666d83a722d73e27dd64d1718be9efafbabfe", size = 877061, upload_time = "2025-07-04T06:04:15.013Z" }, + { url = "https://files.pythonhosted.org/packages/64/24/0eeb583eb5d44f674ca9f7a846c665e33190431386d7c9f6d08ec9f09d3c/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e47891d9d62e3015448749ddb2ba60ab583a651d0fca9a3a1794936942ad7d5d", size = 1013946, upload_time = "2025-07-04T06:04:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/c4/93/360cf58b8e24f760a3d4643423389dbc37bdca8b6fdda75ffc664ce622b5/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4072bf9dcb8ec49f5b92688bd960b5d0e03e4826d227bbd66478a6f6b0aea06", size = 926462, upload_time = "2025-07-04T06:04:17.936Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5d/3b8c46ccc62d020858bc52f2d792208910eb68682c6ebf8d6706593d7a88/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabc9dc770f753c4227aacedd8390056937e67af0bf65d6696c584d3054f1287", size = 886319, upload_time = "2025-07-04T06:04:19.33Z" }, + { url = "https://files.pythonhosted.org/packages/66/cf/73241714800bddb277f827c4683f579b81915406bf7dc643dc185cef7eb2/python_calamine-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4bcf36dc77674892616b66cffba432f5fd62df3e0adb0487ec245036b50041", size = 929044, upload_time = "2025-07-04T06:04:20.689Z" }, + { url = "https://files.pythonhosted.org/packages/7c/6b/71e30ee568ce1ea6676be66f1a42c6397946859effc471cc102922fb4792/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f81518d4b49c47054cb1861badf5bcef44b0a49959968fb2e9c9cb89645c76af", size = 1053084, upload_time = "2025-07-04T06:04:22.414Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/87b42fe975f8952754562785a545f6d2eec17c353befdf33a8e16c046ce0/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:18375eb3ac1362fcbf3a9fcad0672d8dc054001247bc52f063e0054a3e01a8d1", size = 1056735, upload_time = "2025-07-04T06:04:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/04/db/ecee6e5d6ed4f3725312580a83c4cb1758c9060aa08bf2d8512d3396cea1/python_calamine-0.4.0-cp313-cp313-win32.whl", hash = "sha256:c7e98c7e531bafdf719414d0c428f25f933a82640fb92e6e84864a85e758aecc", size = 665282, upload_time = "2025-07-04T06:04:25.274Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0b/26337e0a0e2b335c1d6225bda8de259a21fea129a06009c1471deda28e1f/python_calamine-0.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:6ec081b874e78f4dbcbe70804644281366814289956755575a5871f725592d4e", size = 694982, upload_time = "2025-07-04T06:04:26.573Z" }, + { url = "https://files.pythonhosted.org/packages/90/26/f72c2b2fe70f2901abb41fcdf8249181133ddd72b9392cfb63d030393b3e/python_calamine-0.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f9bdf570023138ee4090a51b1e34786978d6e649852ccc3b83ac9729f125ca2", size = 670283, upload_time = "2025-07-04T06:04:28.434Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-io-wrapper" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload_time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload_time = "2025-05-13T15:23:59.629Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload_time = "2025-06-13T14:09:07.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload_time = "2025-06-13T14:07:31.676Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload_time = "2025-06-13T14:07:33.104Z" }, + { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload_time = "2025-06-13T14:07:34.831Z" }, + { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload_time = "2025-06-13T14:07:36.553Z" }, + { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload_time = "2025-06-13T14:07:38.21Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload_time = "2025-06-13T14:07:39.599Z" }, + { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload_time = "2025-06-13T14:07:41.027Z" }, + { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload_time = "2025-06-13T14:07:42.533Z" }, + { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload_time = "2025-06-13T14:07:43.843Z" }, + { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload_time = "2025-06-13T14:07:45.51Z" }, + { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826, upload_time = "2025-06-13T14:07:46.881Z" }, + { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283, upload_time = "2025-06-13T14:07:49.562Z" }, + { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567, upload_time = "2025-06-13T14:07:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681, upload_time = "2025-06-13T14:07:52.77Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148, upload_time = "2025-06-13T14:07:54.178Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768, upload_time = "2025-06-13T14:07:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199, upload_time = "2025-06-13T14:07:57.166Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439, upload_time = "2025-06-13T14:07:58.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload_time = "2025-06-13T14:08:00.777Z" }, +] + +[[package]] +name = "ratelimit" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload_time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "requests-file" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, +] + +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, +] + +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload_time = "2025-07-01T15:57:13.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload_time = "2025-07-01T15:54:15.734Z" }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload_time = "2025-07-01T15:54:16.922Z" }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload_time = "2025-07-01T15:54:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload_time = "2025-07-01T15:54:19.295Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload_time = "2025-07-01T15:54:20.858Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload_time = "2025-07-01T15:54:22.508Z" }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload_time = "2025-07-01T15:54:23.987Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload_time = "2025-07-01T15:54:25.073Z" }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload_time = "2025-07-01T15:54:26.225Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload_time = "2025-07-01T15:54:27.424Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload_time = "2025-07-01T15:54:29.93Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload_time = "2025-07-01T15:54:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload_time = "2025-07-01T15:54:32.195Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload_time = "2025-07-01T15:54:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload_time = "2025-07-01T15:54:34.755Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload_time = "2025-07-01T15:54:36.292Z" }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload_time = "2025-07-01T15:54:37.469Z" }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload_time = "2025-07-01T15:54:38.954Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload_time = "2025-07-01T15:54:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload_time = "2025-07-01T15:54:43.025Z" }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload_time = "2025-07-01T15:54:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload_time = "2025-07-01T15:54:46.043Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload_time = "2025-07-01T15:54:47.64Z" }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload_time = "2025-07-01T15:54:48.9Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload_time = "2025-07-01T15:54:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload_time = "2025-07-01T15:54:52.023Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload_time = "2025-07-01T15:54:53.692Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload_time = "2025-07-01T15:54:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload_time = "2025-07-01T15:54:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload_time = "2025-07-01T15:54:58.561Z" }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload_time = "2025-07-01T15:54:59.751Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload_time = "2025-07-01T15:55:00.898Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload_time = "2025-07-01T15:55:02.201Z" }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload_time = "2025-07-01T15:55:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload_time = "2025-07-01T15:55:05.398Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload_time = "2025-07-01T15:55:08.316Z" }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload_time = "2025-07-01T15:55:09.52Z" }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload_time = "2025-07-01T15:55:11.216Z" }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload_time = "2025-07-01T15:55:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload_time = "2025-07-01T15:55:14.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload_time = "2025-07-01T15:55:15.745Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload_time = "2025-07-01T15:55:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload_time = "2025-07-01T15:55:18.922Z" }, + { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload_time = "2025-07-01T15:55:20.399Z" }, + { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload_time = "2025-07-01T15:55:21.729Z" }, + { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload_time = "2025-07-01T15:55:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload_time = "2025-07-01T15:55:24.207Z" }, + { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload_time = "2025-07-01T15:55:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload_time = "2025-07-01T15:55:27.798Z" }, + { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload_time = "2025-07-01T15:55:29.057Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload_time = "2025-07-01T15:55:30.719Z" }, + { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload_time = "2025-07-01T15:55:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload_time = "2025-07-01T15:55:33.312Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload_time = "2025-07-01T15:55:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload_time = "2025-07-01T15:55:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload_time = "2025-07-01T15:55:37.483Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload_time = "2025-07-01T15:55:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload_time = "2025-07-01T15:55:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload_time = "2025-07-01T15:55:42.015Z" }, + { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload_time = "2025-07-01T15:55:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload_time = "2025-07-01T15:55:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload_time = "2025-07-01T15:55:47.098Z" }, + { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload_time = "2025-07-01T15:55:48.412Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload_time = "2025-07-01T15:55:49.816Z" }, + { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload_time = "2025-07-01T15:55:51.192Z" }, + { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload_time = "2025-07-01T15:55:52.541Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload_time = "2025-07-01T15:55:53.874Z" }, + { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload_time = "2025-07-01T15:55:55.167Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload_time = "2025-06-09T08:51:09.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload_time = "2025-06-09T08:51:06.348Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, +] + +[[package]] +name = "ruff" +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e", size = 4432239, upload_time = "2025-07-03T16:40:19.566Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be", size = 10369761, upload_time = "2025-07-03T16:39:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e", size = 11155659, upload_time = "2025-07-03T16:39:42.294Z" }, + { url = "https://files.pythonhosted.org/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc", size = 10537769, upload_time = "2025-07-03T16:39:44.75Z" }, + { url = "https://files.pythonhosted.org/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922", size = 10717602, upload_time = "2025-07-03T16:39:47.652Z" }, + { url = "https://files.pythonhosted.org/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b", size = 10198772, upload_time = "2025-07-03T16:39:49.641Z" }, + { url = "https://files.pythonhosted.org/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d", size = 11845173, upload_time = "2025-07-03T16:39:52.069Z" }, + { url = "https://files.pythonhosted.org/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1", size = 12553002, upload_time = "2025-07-03T16:39:54.551Z" }, + { url = "https://files.pythonhosted.org/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4", size = 12171330, upload_time = "2025-07-03T16:39:57.55Z" }, + { url = "https://files.pythonhosted.org/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9", size = 11774717, upload_time = "2025-07-03T16:39:59.78Z" }, + { url = "https://files.pythonhosted.org/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da", size = 11646659, upload_time = "2025-07-03T16:40:01.934Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce", size = 10604012, upload_time = "2025-07-03T16:40:04.363Z" }, + { url = "https://files.pythonhosted.org/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d", size = 10176799, upload_time = "2025-07-03T16:40:06.514Z" }, + { url = "https://files.pythonhosted.org/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04", size = 11241507, upload_time = "2025-07-03T16:40:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342", size = 11717609, upload_time = "2025-07-03T16:40:10.836Z" }, + { url = "https://files.pythonhosted.org/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a", size = 10523823, upload_time = "2025-07-03T16:40:13.203Z" }, + { url = "https://files.pythonhosted.org/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639", size = 11629831, upload_time = "2025-07-03T16:40:15.478Z" }, + { url = "https://files.pythonhosted.org/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12", size = 10735334, upload_time = "2025-07-03T16:40:17.677Z" }, +] + +[[package]] +name = "savepagenow" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload_time = "2023-07-01T13:31:49.607Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/18/b06a83f0c5ee8cddbde5e3f3d0bb9b702abfa5136ef6d4620ff67df7eee5/scipy-1.16.0.tar.gz", hash = "sha256:b5ef54021e832869c8cfb03bc3bf20366cbcd426e02a58e8a58d7584dfbb8f62", size = 30581216, upload_time = "2025-06-22T16:27:55.782Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/c0/c943bc8d2bbd28123ad0f4f1eef62525fa1723e84d136b32965dcb6bad3a/scipy-1.16.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:7eb6bd33cef4afb9fa5f1fb25df8feeb1e52d94f21a44f1d17805b41b1da3180", size = 36459071, upload_time = "2025-06-22T16:19:06.605Z" }, + { url = "https://files.pythonhosted.org/packages/99/0d/270e2e9f1a4db6ffbf84c9a0b648499842046e4e0d9b2275d150711b3aba/scipy-1.16.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1dbc8fdba23e4d80394ddfab7a56808e3e6489176d559c6c71935b11a2d59db1", size = 28490500, upload_time = "2025-06-22T16:19:11.775Z" }, + { url = "https://files.pythonhosted.org/packages/1c/22/01d7ddb07cff937d4326198ec8d10831367a708c3da72dfd9b7ceaf13028/scipy-1.16.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7dcf42c380e1e3737b343dec21095c9a9ad3f9cbe06f9c05830b44b1786c9e90", size = 20762345, upload_time = "2025-06-22T16:19:15.813Z" }, + { url = "https://files.pythonhosted.org/packages/34/7f/87fd69856569ccdd2a5873fe5d7b5bbf2ad9289d7311d6a3605ebde3a94b/scipy-1.16.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26ec28675f4a9d41587266084c626b02899db373717d9312fa96ab17ca1ae94d", size = 23418563, upload_time = "2025-06-22T16:19:20.746Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f1/e4f4324fef7f54160ab749efbab6a4bf43678a9eb2e9817ed71a0a2fd8de/scipy-1.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:952358b7e58bd3197cfbd2f2f2ba829f258404bdf5db59514b515a8fe7a36c52", size = 33203951, upload_time = "2025-06-22T16:19:25.813Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f0/b6ac354a956384fd8abee2debbb624648125b298f2c4a7b4f0d6248048a5/scipy-1.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03931b4e870c6fef5b5c0970d52c9f6ddd8c8d3e934a98f09308377eba6f3824", size = 35070225, upload_time = "2025-06-22T16:19:31.416Z" }, + { url = "https://files.pythonhosted.org/packages/e5/73/5cbe4a3fd4bc3e2d67ffad02c88b83edc88f381b73ab982f48f3df1a7790/scipy-1.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:512c4f4f85912767c351a0306824ccca6fd91307a9f4318efe8fdbd9d30562ef", size = 35389070, upload_time = "2025-06-22T16:19:37.387Z" }, + { url = "https://files.pythonhosted.org/packages/86/e8/a60da80ab9ed68b31ea5a9c6dfd3c2f199347429f229bf7f939a90d96383/scipy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e69f798847e9add03d512eaf5081a9a5c9a98757d12e52e6186ed9681247a1ac", size = 37825287, upload_time = "2025-06-22T16:19:43.375Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b5/29fece1a74c6a94247f8a6fb93f5b28b533338e9c34fdcc9cfe7a939a767/scipy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:adf9b1999323ba335adc5d1dc7add4781cb5a4b0ef1e98b79768c05c796c4e49", size = 38431929, upload_time = "2025-06-22T16:19:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/46/95/0746417bc24be0c2a7b7563946d61f670a3b491b76adede420e9d173841f/scipy-1.16.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:e9f414cbe9ca289a73e0cc92e33a6a791469b6619c240aa32ee18abdce8ab451", size = 36418162, upload_time = "2025-06-22T16:19:56.3Z" }, + { url = "https://files.pythonhosted.org/packages/19/5a/914355a74481b8e4bbccf67259bbde171348a3f160b67b4945fbc5f5c1e5/scipy-1.16.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bbba55fb97ba3cdef9b1ee973f06b09d518c0c7c66a009c729c7d1592be1935e", size = 28465985, upload_time = "2025-06-22T16:20:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/46/63477fc1246063855969cbefdcee8c648ba4b17f67370bd542ba56368d0b/scipy-1.16.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:58e0d4354eacb6004e7aa1cd350e5514bd0270acaa8d5b36c0627bb3bb486974", size = 20737961, upload_time = "2025-06-22T16:20:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/93/86/0fbb5588b73555e40f9d3d6dde24ee6fac7d8e301a27f6f0cab9d8f66ff2/scipy-1.16.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:75b2094ec975c80efc273567436e16bb794660509c12c6a31eb5c195cbf4b6dc", size = 23377941, upload_time = "2025-06-22T16:20:10.668Z" }, + { url = "https://files.pythonhosted.org/packages/ca/80/a561f2bf4c2da89fa631b3cbf31d120e21ea95db71fd9ec00cb0247c7a93/scipy-1.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b65d232157a380fdd11a560e7e21cde34fdb69d65c09cb87f6cc024ee376351", size = 33196703, upload_time = "2025-06-22T16:20:16.097Z" }, + { url = "https://files.pythonhosted.org/packages/11/6b/3443abcd0707d52e48eb315e33cc669a95e29fc102229919646f5a501171/scipy-1.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d8747f7736accd39289943f7fe53a8333be7f15a82eea08e4afe47d79568c32", size = 35083410, upload_time = "2025-06-22T16:20:21.734Z" }, + { url = "https://files.pythonhosted.org/packages/20/ab/eb0fc00e1e48961f1bd69b7ad7e7266896fe5bad4ead91b5fc6b3561bba4/scipy-1.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb9f147a1b8529bb7fec2a85cf4cf42bdfadf9e83535c309a11fdae598c88e8b", size = 35387829, upload_time = "2025-06-22T16:20:27.548Z" }, + { url = "https://files.pythonhosted.org/packages/57/9e/d6fc64e41fad5d481c029ee5a49eefc17f0b8071d636a02ceee44d4a0de2/scipy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d2b83c37edbfa837a8923d19c749c1935ad3d41cf196006a24ed44dba2ec4358", size = 37841356, upload_time = "2025-06-22T16:20:35.112Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a7/4c94bbe91f12126b8bf6709b2471900577b7373a4fd1f431f28ba6f81115/scipy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:79a3c13d43c95aa80b87328a46031cf52508cf5f4df2767602c984ed1d3c6bbe", size = 38403710, upload_time = "2025-06-22T16:21:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/47/20/965da8497f6226e8fa90ad3447b82ed0e28d942532e92dd8b91b43f100d4/scipy-1.16.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:f91b87e1689f0370690e8470916fe1b2308e5b2061317ff76977c8f836452a47", size = 36813833, upload_time = "2025-06-22T16:20:43.925Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/197580c3dac2d234e948806e164601c2df6f0078ed9f5ad4a62685b7c331/scipy-1.16.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:88a6ca658fb94640079e7a50b2ad3b67e33ef0f40e70bdb7dc22017dae73ac08", size = 28974431, upload_time = "2025-06-22T16:20:51.302Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fc/e18b8550048d9224426e76906694c60028dbdb65d28b1372b5503914b89d/scipy-1.16.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ae902626972f1bd7e4e86f58fd72322d7f4ec7b0cfc17b15d4b7006efc385176", size = 21246454, upload_time = "2025-06-22T16:20:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/8c/48/07b97d167e0d6a324bfd7484cd0c209cc27338b67e5deadae578cf48e809/scipy-1.16.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:8cb824c1fc75ef29893bc32b3ddd7b11cf9ab13c1127fe26413a05953b8c32ed", size = 23772979, upload_time = "2025-06-22T16:21:03.363Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4f/9efbd3f70baf9582edf271db3002b7882c875ddd37dc97f0f675ad68679f/scipy-1.16.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:de2db7250ff6514366a9709c2cba35cb6d08498e961cba20d7cff98a7ee88938", size = 33341972, upload_time = "2025-06-22T16:21:11.14Z" }, + { url = "https://files.pythonhosted.org/packages/3f/dc/9e496a3c5dbe24e76ee24525155ab7f659c20180bab058ef2c5fa7d9119c/scipy-1.16.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e85800274edf4db8dd2e4e93034f92d1b05c9421220e7ded9988b16976f849c1", size = 35185476, upload_time = "2025-06-22T16:21:19.156Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b3/21001cff985a122ba434c33f2c9d7d1dc3b669827e94f4fc4e1fe8b9dfd8/scipy-1.16.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4f720300a3024c237ace1cb11f9a84c38beb19616ba7c4cdcd771047a10a1706", size = 35570990, upload_time = "2025-06-22T16:21:27.797Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/7ba42647d6709251cdf97043d0c107e0317e152fa2f76873b656b509ff55/scipy-1.16.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:aad603e9339ddb676409b104c48a027e9916ce0d2838830691f39552b38a352e", size = 37950262, upload_time = "2025-06-22T16:21:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c4/231cac7a8385394ebbbb4f1ca662203e9d8c332825ab4f36ffc3ead09a42/scipy-1.16.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f56296fefca67ba605fd74d12f7bd23636267731a72cb3947963e76b8c0a25db", size = 38515076, upload_time = "2025-06-22T16:21:45.694Z" }, +] + +[[package]] +name = "seaborn" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload_time = "2024-01-25T13:21:52.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload_time = "2024-01-25T13:21:49.598Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "simpleeval" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "structlog" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, +] + +[[package]] +name = "tableschema-to-template" +version = "0.0.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "pyyaml" }, + { name = "xlsxwriter" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "technologydata" +source = { editable = "." } +dependencies = [ + { name = "frictionless", extra = ["pandas"] }, + { name = "hdx-python-country" }, + { name = "ipykernel" }, + { name = "matplotlib" }, + { name = "mypy" }, + { name = "pandas" }, + { name = "pint" }, + { name = "pre-commit" }, + { name = "pydeflate" }, + { name = "pytest" }, + { name = "python-calamine" }, + { name = "requests" }, + { name = "ruff" }, + { name = "savepagenow" }, + { name = "scipy" }, + { name = "seaborn" }, + { name = "tqdm" }, + { name = "ucumvert" }, +] + +[package.optional-dependencies] +docs = [ + { name = "mkdocs-autolinks-plugin" }, + { name = "mkdocs-git-revision-date-localized-plugin" }, + { name = "mkdocs-material" }, + { name = "mkdocs-minify-plugin" }, + { name = "mkdocs-open-in-new-tab" }, + { name = "mkdocstrings" }, + { name = "mkdocstrings-python" }, +] + +[package.metadata] +requires-dist = [ + { name = "frictionless", extras = ["pandas"], specifier = ">=5.18.0" }, + { name = "hdx-python-country", specifier = ">=3.9.4" }, + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "matplotlib", specifier = ">=3.10.1" }, + { name = "mkdocs-autolinks-plugin", marker = "extra == 'docs'", specifier = ">=0.7.1" }, + { name = "mkdocs-git-revision-date-localized-plugin", marker = "extra == 'docs'", specifier = ">=1.4.7" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.6.14" }, + { name = "mkdocs-minify-plugin", marker = "extra == 'docs'", specifier = ">=0.8.0" }, + { name = "mkdocs-open-in-new-tab", marker = "extra == 'docs'", specifier = ">=1.0.8" }, + { name = "mkdocstrings", marker = "extra == 'docs'", specifier = ">=0.29.1" }, + { name = "mkdocstrings-python", marker = "extra == 'docs'", specifier = ">=1.16.11" }, + { name = "mypy", specifier = ">=1.15.0" }, + { name = "pandas", specifier = ">=2.2.3" }, + { name = "pint", specifier = ">=0.24.4" }, + { name = "pre-commit", specifier = ">=4.2.0" }, + { name = "pydeflate", specifier = ">=2.1.3" }, + { name = "pytest", specifier = ">=8.3.5" }, + { name = "python-calamine", specifier = ">=0.3.1" }, + { name = "requests", specifier = ">=2.32.3" }, + { name = "ruff", specifier = ">=0.11.0" }, + { name = "savepagenow", specifier = ">=1.3.0" }, + { name = "scipy", specifier = ">=1.15.2" }, + { name = "seaborn", specifier = ">=0.13.2" }, + { name = "tqdm", specifier = ">=4.67.1" }, + { name = "ucumvert", specifier = ">=0.2.1" }, +] +provides-extras = ["docs"] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload_time = "2025-05-22T18:15:38.788Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload_time = "2025-05-22T18:15:20.862Z" }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload_time = "2025-05-22T18:15:22.591Z" }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload_time = "2025-05-22T18:15:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload_time = "2025-05-22T18:15:25.735Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload_time = "2025-05-22T18:15:27.499Z" }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload_time = "2025-05-22T18:15:29.299Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload_time = "2025-05-22T18:15:31.038Z" }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload_time = "2025-05-22T18:15:32.426Z" }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload_time = "2025-05-22T18:15:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload_time = "2025-05-22T18:15:36.1Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "typer" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload_time = "2025-05-26T14:30:31.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload_time = "2025-05-26T14:30:30.523Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload_time = "2025-07-04T13:28:34.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "ucumvert" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, + { name = "pint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/27/cfeeea46e92d30edd1f8938e7630798e92c2cc8dbb0493a26373d850b3c4/ucumvert-0.2.2.tar.gz", hash = "sha256:f6218839a36b0e74e671f16d1f9f4aa1a2b530527a3c126031515c13273b1343", size = 52281, upload_time = "2025-05-10T22:18:25.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/b5/be9107654e04f7bcc16138598f2bccfde20952dfe1115f5289b5a7c5717e/ucumvert-0.2.2-py3-none-any.whl", hash = "sha256:cd5b9e93f9dfc52d4dbe3f4e790d0b426934185823a611fd6898bb4e3d6f4c86", size = 53201, upload_time = "2025-05-10T22:18:23.304Z" }, +] + +[[package]] +name = "unidecode" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "validators" +version = "0.35.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload_time = "2025-05-08T17:58:23.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload_time = "2025-05-08T17:58:21.15Z" }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, +] + +[[package]] +name = "wbgapi" +version = "1.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "requests" }, + { name = "tabulate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, +] + +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, +] + +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, +] + +[[package]] +name = "xlrd" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, +] + +[[package]] +name = "xlrd3" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, +] + +[[package]] +name = "xlsx2csv" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, +] + +[[package]] +name = "xlsxwriter" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306, upload_time = "2025-06-17T08:59:14.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347, upload_time = "2025-06-17T08:59:13.453Z" }, +] + +[[package]] +name = "xlwt" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, +] From 617dce4c7c1d2c3a37a7b3c18985484cb978e791 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:18:37 +0200 Subject: [PATCH 03/81] Extend Technology and TechnologyCollection (#14) * doc: update class-diagram * code: technology collection * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: update technologycollection and technology definition * code: new changes to file * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: add override method for __str__ for Source and SourceCollection * code: update __str__ for source.py * code: finalize technology_collection unit tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * data: re-format solar_photovoltaics_example_04 * refactor * code: push forward the development * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: add hash and eq methods for Source and finalize get_source_collection * code: SourceCollection optional in Datapackage * code: new datapackage methods * code: docstring for to_datapackage * code: modify unit tests * code: new updates * code: remove to_datapackage * code: remove datapackage path * code: including Annotated and removing Parameters section * code: modify __eq__ method for Source * code: re-write __hash__ method * code: change SourceCollection.from_json --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/class-diagram.puml | 36 +-- technologydata/__init__.py | 8 +- technologydata/datapackage.py | 169 ++++++---- technologydata/parameter.py | 69 +++- technologydata/source.py | 114 +++++-- technologydata/source_collection.py | 103 ++++-- technologydata/technology.py | 96 ++++-- technologydata/technology_collection.py | 238 ++++++++++++++ technologydata/unit_value.py | 13 +- test/conftest.py | 14 +- .../technologies.json | 296 +++++++++--------- .../technologies.json | 288 ++++++++--------- test/test_datapackage.py | 29 ++ test/test_source.py | 98 +++++- test/test_source_collection.py | 48 ++- test/test_technology_collection.py | 106 +++++++ 16 files changed, 1225 insertions(+), 500 deletions(-) create mode 100644 technologydata/technology_collection.py create mode 100644 test/test_datapackage.py create mode 100644 test/test_technology_collection.py diff --git a/docs/class-diagram.puml b/docs/class-diagram.puml index 15db0fff..3ddba2dd 100644 --- a/docs/class-diagram.puml +++ b/docs/class-diagram.puml @@ -10,7 +10,7 @@ class UnitValue { } note left of UnitValue::unit - Unit should be able to accomodate any unit of measurement, + Unit should be able to accommodate any unit of measurement, currencies+years, LHVs and different energy carriers. e.g. EUR_2020, kWh_electricity, kWh_hydrogen_LHV end note @@ -20,8 +20,8 @@ class Source { - authors: str - url: str - url_archive: str - - urldate: str - - urldate_archive: str + - url_date: str + - url_date_archive: str + ensure_in_wayback() + store_in_wayback() @@ -42,6 +42,7 @@ class Parameter { - provenance: str - note: str - sources: SourceCollection + + from_dict(): Parameter } Parameter --> UnitValue : quantity @@ -72,6 +73,7 @@ class Technology { - output-hydrogen: Parameter - output-electricity: Parameter + + from_dict(): Technology + adjust_currency(): Technology // or inplace + adjust_region(): Technology // or inplace + adjust_scale(): Technology // or inplace @@ -116,6 +118,11 @@ end note class TechnologyCollection { - technologies: Iterable + get(**criteria): Technology | TechnologyCollection | None + + from_dict(): TechnologyCollection + + to_json(): str + + to_csv(): str + + to_dataframe(): pd.DataFrame + + from_json(): TechnologyCollection + create_projection(): TechnologyCollection ' TODO: Think about more methods here } @@ -149,25 +156,23 @@ note left of SourceCollection::retrieve_all_from_wayback and stores the files locally. end note -note left of SourceCollection::to_csv - Export the source collection into a csv file. -end note - note left of SourceCollection::to_json Export the source collection into a json file. end note +note left of SourceCollection::to_csv + Export the source collection into a csv file. +end note + note left of SourceCollection::to_dataframe Export the source collection into a Pandas dataframe. end note class Datapackage { - - name: str - - path: Path - technologies: TechnologyCollection - sources: SourceCollection - // potentially other Collections in the future - + to_datapackage() + + to_csv() + from_json() + to_json() + get_source_collection() @@ -182,12 +187,6 @@ note top of Datapackage Please note that the "sources" field is built in the background from "technologies" end note -note right of Datapackage::name - Currently we use "source" as a reference to pre-packaged data and for a column in "technologies.csv". - The Datapackage.name would substitute for referencing to pre-packaged data, e.g. "example01" would be - a packaged data included with `technologydata`. It is meant to be independent of the "TechnologyCollection" or its members. -end note - note right of Datapackage::technologies Derived from the TechnologyCollection. end note @@ -196,11 +195,6 @@ note right of Datapackage::sources Built in the background with the get_source_collection() method, which derives it from all Source objects that are related to the TechnologyCollection (i.e., all sources referenced by technologies and their parameters). end note -note right of Datapackage::to_datapackage - Exports all member Source and TechnologyCollection to a folder following the datapackage - specification, including the schema .json files and the .csv files. -end note - Parameter --> SourceCollection : sources Technology --> "*" Parameter : uses for its members TechnologyCollection --> "*" Technology : consists of diff --git a/technologydata/__init__.py b/technologydata/__init__.py index d3380162..20b78e28 100644 --- a/technologydata/__init__.py +++ b/technologydata/__init__.py @@ -8,17 +8,19 @@ from technologydata.source import Source from technologydata.source_collection import SourceCollection from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection from technologydata.unit_value import UnitValue from technologydata.utils.commons import Commons, DateFormatEnum, FileExtensionEnum __all__ = [ "Commons", "DateFormatEnum", + "DataPackage", "FileExtensionEnum", - "UnitValue", - "Technology", "Parameter", "Source", "SourceCollection", - "DataPackage", + "Technology", + "TechnologyCollection", + "UnitValue", ] diff --git a/technologydata/datapackage.py b/technologydata/datapackage.py index 27ed5182..ca450ff0 100644 --- a/technologydata/datapackage.py +++ b/technologydata/datapackage.py @@ -11,76 +11,135 @@ """ +import logging import pathlib +import typing import pydantic from technologydata.source_collection import SourceCollection +from technologydata.technology_collection import TechnologyCollection -# from technologydata.technology_collection import TechnologyCollection +logger = logging.getLogger(__name__) -# TODO complete class class DataPackage(pydantic.BaseModel): # type: ignore """ Container for a collection of Technology objects and/or Source objects, with batch operations and loading utilities. - Parameters - ---------- - name : str - The short-name code of the source - technologies : List[Technology] - List of Technology objects. - Attributes ---------- - technologies : List[Technology] + technologies : Optional[TechnologyCollection] List of Technology objects. + sources : Optional[SourceCollection] + List of Source objects. """ - name: str - path: pathlib.Path - # technologies: TechnologyCollection - sources: SourceCollection - - # @classmethod - # def from_json(cls, path: pathlib.Path) -> technologydata.DataPackage: - # """ - # Load a DataPackage from a JSON file. - # - # Parameters - # ---------- - # path : Path - # Path to the JSON file. - # - # Returns - # ------- - # DataPackage - # The loaded DataPackage instance. - # - # """ - # with open(path) as f: - # data = json.load(f) - # techs = technologydata.TechnologyCollection( - # [technologydata.Technology(**t) for t in data.get("technologies", [])] - # ) - # # TODO: redo this part once an example JSON is available - # techs = technologydata.TechnologyCollection( - # [technologydata.Technology(**t) for t in data.get("technologies", [])] - # ) - # # You should also handle 'name', 'sources', etc. as needed - # return cls( - # name=data.get("name", ""), - # path=path, - # technologies=techs, - # sources=technologydata.SourceCollection(data.get("sources", [])), - # ) - # - # @classmethod - # def to_json(cls, path: pathlib.Path) -> None: - # pass - # - # @classmethod - # def to_datapackage(cls, path: pathlib.Path) -> None: - # pass + technologies: typing.Annotated[ + TechnologyCollection | None, + pydantic.Field(description="List of Technology objects."), + ] = None + sources: typing.Annotated[ + SourceCollection | None, pydantic.Field(description="List of Source objects.") + ] = None + + def get_source_collection(self) -> None: + """ + Get the SourceCollection associated with this DataPackage from the TechnologyCollection. + + Returns + ------- + SourceCollection + The SourceCollection instance. + + """ + sources_set = set() + if self.sources is None: + if self.technologies is not None: + for technology in self.technologies: + for parameter in technology.parameters.values(): + for source in parameter.sources: + sources_set.add(source) + else: + raise ValueError( + "No technologies available to extract a sources collection from." + ) + else: + logger.info("The data package already has a sources collection.") + self.sources = SourceCollection(sources=list(sources_set)) + + @classmethod + def from_json(cls, path_to_folder: pathlib.Path | str) -> "DataPackage": + """ + Load a DataPackage from a JSON file. + + Parameters + ---------- + path_to_folder : pathlib.Path or str + Path to the data package folder. + + Returns + ------- + DataPackage + The loaded DataPackage instance. + + """ + # Load technologies + technologies_path = pathlib.Path(path_to_folder, "technologies.json") + technologies = TechnologyCollection.from_json(technologies_path) + + # Create DataPackage instance + data_package = cls( + path=path_to_folder, + technologies=technologies, + ) + + # Generate sources collection from technologies if sources is None + data_package.get_source_collection() + + return data_package + + def to_json(self, folder_path: pathlib.Path) -> None: + """ + Export the Datapackage to JSON files. + + The files are: + - the 'technologies' attribute is exported to technologies.json, together with the corresponding data schema + - the 'sources' attribute is exported to sources.json, together with the corresponding data schema + + Parameters + ---------- + folder_path : pathlib.Path + The path to the folder where the JSON files are created + + """ + if self.technologies is not None: + technologies_path = pathlib.Path(folder_path, "technologies.json") + self.technologies.to_json(technologies_path) + + if self.sources is not None: + sources_path = pathlib.Path(folder_path, "sources.json") + self.sources.to_json(sources_path) + + def to_csv(self, folder_path: pathlib.Path) -> None: + """ + Export the Datapackage to CSV files. + + The files are: + - the 'technologies' attribute is exported to technologies.csv + - the 'sources' attribute is exported to sources.csv + + Parameters + ---------- + folder_path : pathlib.Path + The path to the folder where the CSV files are created + + """ + if self.technologies is not None: + technologies_path = pathlib.Path(folder_path, "technologies.csv") + self.technologies.to_csv(path_or_buf=technologies_path) + + if self.sources is not None: + sources_path = pathlib.Path(folder_path, "sources.csv") + self.sources.to_csv(path_or_buf=sources_path) diff --git a/technologydata/parameter.py b/technologydata/parameter.py index 10f94bc6..feb4483a 100644 --- a/technologydata/parameter.py +++ b/technologydata/parameter.py @@ -15,6 +15,8 @@ """ +import typing + import pydantic from technologydata.source_collection import SourceCollection @@ -26,17 +28,6 @@ class Parameter(pydantic.BaseModel): # type: ignore """ Encapsulate a value with its unit, provenance, notes, and sources. - Parameters - ---------- - quantity : UnitValue - The value and its unit. - provenance : Optional[str] - Description of the data's provenance. - note : Optional[str] - Additional notes about the parameter. - sources : SourceCollection - One or more sources for the parameter. - Attributes ---------- quantity : UnitValue @@ -50,12 +41,18 @@ class Parameter(pydantic.BaseModel): # type: ignore """ - quantity: UnitValue = pydantic.Field(..., description="The value and its unit.") - provenance: str | None = pydantic.Field(None, description="Data provenance.") - note: str | None = pydantic.Field(None, description="Additional notes.") - sources: SourceCollection = pydantic.Field( - ..., description="Collection of Sources." - ) + quantity: typing.Annotated[ + UnitValue, pydantic.Field(description="The value and its unit.") + ] + provenance: typing.Annotated[ + str | None, pydantic.Field(description="Data provenance.") + ] = None + note: typing.Annotated[ + str | None, pydantic.Field(description="Additional notes.") + ] = None + sources: typing.Annotated[ + SourceCollection, pydantic.Field(description="Collection of Sources.") + ] @property def value(self) -> float: @@ -82,3 +79,41 @@ def unit(self) -> str: """ return self.quantity.unit + + @classmethod + def from_dict(cls, data: dict[str, typing.Any]) -> "Parameter": + """ + Create an instance of the class from a dictionary. + + Parameters + ---------- + cls : type + The class to instantiate. + data : dict + A dictionary containing the data to initialize the class instance. + Expected keys include: + - "quantity" (dict): A dictionary representing a UnitValue, parsed via `UnitValue.parse_obj()`. + - "provenance" (str or None): Optional provenance information. + - "note" (str or None): Optional notes. + - "sources" (list): A list of source data dictionaries, to be converted into a SourceCollection. + + Returns + ------- + instance : cls + An instance of the class initialized with the provided data. + + Notes + ----- + This method converts the "sources" list into a `SourceCollection` using `SourceCollection.from_json()`. + The "quantity" field is parsed into a `UnitValue` object using `UnitValue.parse_obj()`. + + """ + # Convert sources list into SourceCollection + sources_data = data.get("sources", []) + sources = SourceCollection.from_json(from_str=sources_data) + return cls( + quantity=UnitValue.model_validate(data["quantity"]), + provenance=data.get("provenance"), + note=data.get("note"), + sources=sources, + ) diff --git a/technologydata/source.py b/technologydata/source.py index 3b1fd1f7..7bb369a0 100644 --- a/technologydata/source.py +++ b/technologydata/source.py @@ -30,21 +30,6 @@ class Source(pydantic.BaseModel): # type: ignore """ Represent a data source, including bibliographic and web information. - Parameters - ---------- - title : str - Title of the source. - authors : str - Authors of the source. - url : Optional[str] - URL of the source. - url_archive : Optional[str] - Archived URL (e.g., from the Wayback Machine). - url_date : Optional[str] - Date the URL was accessed. - url_date_archive : Optional[str] - Date the URL was archived. - Attributes ---------- title : str @@ -62,16 +47,95 @@ class Source(pydantic.BaseModel): # type: ignore """ - title: str = pydantic.Field(..., description="Title of the source.") - authors: str = pydantic.Field(..., description="Authors of the source.") - url: str | None = pydantic.Field(None, description="URL of the source.") - url_archive: str | None = pydantic.Field(None, description="Archived URL.") - url_date: str | None = pydantic.Field( - None, description="Date the URL was accessed." - ) - url_date_archive: str | None = pydantic.Field( - None, description="Date the URL was archived." - ) + title: typing.Annotated[str, pydantic.Field(description="Title of the source.")] + authors: typing.Annotated[str, pydantic.Field(description="Authors of the source.")] + url: typing.Annotated[ + str | None, pydantic.Field(description="URL of the source.") + ] = None + url_archive: typing.Annotated[ + str | None, pydantic.Field(description="Archived URL.") + ] = None + url_date: typing.Annotated[ + str | None, pydantic.Field(description="Date the URL was accessed.") + ] = None + url_date_archive: typing.Annotated[ + str | None, pydantic.Field(description="Date the URL was archived.") + ] = None + + def __eq__(self, other: object) -> bool: + """ + Check for equality with another Source object based on non-None attributes. + + Compares all attributes of the current instance with those of the other object. + Only compares attributes that are not None in both instances. + + Parameters + ---------- + other : object + The object to compare with. Expected to be an instance of Source. + + Returns + ------- + bool + True if all non-None attributes are equal between self and other, False otherwise. + Returns False if other is not a Source instance. + + Notes + ----- + This method considers only attributes that are not None in both objects. + If an attribute is None in either object, it is ignored in the comparison. + + """ + if not isinstance(other, Source): + logger.error("The object is not a Source instance.") + return False + + for field in self.__class__.model_fields.keys(): + value_self = getattr(self, field) + value_other = getattr(other, field) + if value_self != value_other: + return False + return True + + def __hash__(self) -> int: + """ + Return a hash value for the Source instance based on all attributes. + + This method computes a combined hash of the instance's attributes to + uniquely identify the object in hash-based collections such as sets and dictionaries. + + Returns + ------- + int + The hash value of the Source instance. + + """ + # Retrieve all attribute values dynamically + attribute_values = tuple( + getattr(self, field) for field in self.__class__.model_fields.keys() + ) + return hash(attribute_values) + + def __str__(self) -> str: + """ + Return a string representation of the Source, including all available attributes. + + Returns + ------- + str + A string detailing the source's information. + + """ + parts = [f"'{self.authors}': '{self.title}'"] + if self.url: + parts.append(f"from url '{self.url}'") + if self.url_date: + parts.append(f"last accessed on '{self.url_date}'") + if self.url_archive: + parts.append(f"archived at '{self.url_archive}'") + if self.url_date_archive: + parts.append(f"on '{self.url_date_archive}'.") + return ", ".join(parts) def ensure_in_wayback(self) -> None: """ diff --git a/technologydata/source_collection.py b/technologydata/source_collection.py index 8dfd1714..702c4f96 100644 --- a/technologydata/source_collection.py +++ b/technologydata/source_collection.py @@ -8,6 +8,7 @@ import json import pathlib import re +import typing import pandas import pydantic @@ -19,11 +20,6 @@ class SourceCollection(pydantic.BaseModel): # type: ignore """ Represent a collection of sources. - Parameters - ---------- - sources : List[Source] - List of Source objects. - Attributes ---------- sources : List[Source] @@ -31,7 +27,46 @@ class SourceCollection(pydantic.BaseModel): # type: ignore """ - sources: list[Source] = pydantic.Field(..., description="List of Source objects.") + sources: typing.Annotated[ + list[Source], pydantic.Field(description="List of Source objects.") + ] + + def __iter__(self) -> typing.Iterator["Source"]: + """ + Return an iterator over the list of Source objects. + + Returns + ------- + Iterator[Source] + An iterator over the Source objects contained in the collection. + + """ + return iter(self.sources) + + def __len__(self) -> int: + """ + Return the number of sources in this collection. + + Returns + ------- + int + The number of Source objects in the sources list. + + """ + return len(self.sources) + + def __str__(self) -> str: + """ + Return a string representation of the SourceCollection. + + Returns + ------- + str + A string representation of the SourceCollection, showing the number of sources. + + """ + sources_str = ", ".join(str(source) for source in self.sources) + return f"SourceCollection with {len(self.sources)} sources: {sources_str}" def get(self, title: str, authors: str) -> "SourceCollection": """ @@ -66,18 +101,6 @@ def get(self, title: str, authors: str) -> "SourceCollection": return SourceCollection(sources=filtered_sources) - def __len__(self) -> int: - """ - Return the number of sources in this collection. - - Returns - ------- - int - The number of Source objects in the sources list. - - """ - return len(self.sources) - def retrieve_all_from_wayback( self, download_directory: pathlib.Path ) -> list[pathlib.Path | None]: @@ -162,7 +185,7 @@ def to_json( file_path : pathlib.Path The path to the JSON file to be created. schema_path : pathlib.Path - The path to the JSON schema file to be created. By default created with a `schema` suffix next to `file_path`. + The path to the JSON schema file to be created. By default, created with a `schema` suffix next to `file_path`. """ if schema_path is None: @@ -180,20 +203,46 @@ def to_json( jsonfile.write(json_data) @classmethod - def from_json(cls, file_path: pathlib.Path | str) -> "SourceCollection": + def from_json( + cls, + file_path: pathlib.Path | str | None = None, + from_str: list[dict[str, typing.Any]] | None = None, + ) -> "SourceCollection": """ Import the SourceCollection from a JSON file. Parameters ---------- - file_path : pathlib.Path + file_path : Optional[pathlib.Path | str] The path to the JSON file to be imported. + from_str : Optional[list] + The list of dictionaries with Source fields. """ - if isinstance(file_path, pathlib.Path | str): - file_path = pathlib.Path(file_path) - else: - raise TypeError("file_path must be a pathlib.Path or str") - with open(file_path, encoding="utf-8") as jsonfile: - json_data = json.load(jsonfile) + if file_path is None and from_str is None: + raise ValueError( + "Both file_path and from_str are None. One must be provided." + ) + + json_data = None + + # Load data from file if file_path is provided + if file_path is not None: + if not isinstance(file_path, (pathlib.Path | str)): + raise TypeError( + f"file_path must be a pathlib.Path or str, but got {type(file_path)}" + ) + path = pathlib.Path(file_path) + with path.open(encoding="utf-8") as jsonfile: + json_data = json.load(jsonfile) + + # Override json_data if from_str is provided + if from_str is not None: + if not isinstance(from_str, list): + raise TypeError(f"from_str must be a list, but got {type(from_str)}") + json_data = {"sources": [Source(**source) for source in from_str]} + + if json_data is None: + raise ValueError("No data to load. Provide either a file_path or from_str.") + return cls(**json_data) diff --git a/technologydata/technology.py b/technologydata/technology.py index ca09967e..2963a968 100644 --- a/technologydata/technology.py +++ b/technologydata/technology.py @@ -11,57 +11,45 @@ import pydantic -import technologydata +from technologydata.parameter import Parameter class Technology(pydantic.BaseModel): # type: ignore """ Represent a technology with region, year, and a flexible set of parameters. - Parameters - ---------- - name : str - Name of the technology. - region : str - Region identifier. - year : Optional[int] - Year of the data. - parameters : Dict[str, Parameter] - Dictionary of parameter names to Parameter objects. - case : Optional[str] - Case or scenario identifier. - detailed_technology : Optional[str] - More detailed technology name. - Attributes ---------- name : str Name of the technology. region : str Region identifier. - year : Optional[int] + year : int Year of the data. parameters : Dict[str, Parameter] Dictionary of parameter names to Parameter objects. - case : Optional[str] + case : str Case or scenario identifier. - detailed_technology : Optional[str] + detailed_technology : str More detailed technology name. """ - name: str = pydantic.Field(..., description="Name of the technology.") - region: str = pydantic.Field(..., description="Region identifier.") - year: int | None = pydantic.Field(None, description="Year of the data.") - parameters: dict[str, technologydata.Parameter] = pydantic.Field( - default_factory=dict, description="Parameters." - ) - case: str | None = pydantic.Field(None, description="Case or scenario identifier.") - detailed_technology: str | None = pydantic.Field( - None, description="Detailed technology name." - ) - - def __getitem__(self, key: str) -> technologydata.Parameter: + name: typing.Annotated[str, pydantic.Field(description="Name of the technology.")] + region: typing.Annotated[str, pydantic.Field(description="Region identifier.")] + year: typing.Annotated[int, pydantic.Field(description="Year of the data.")] + parameters: typing.Annotated[ + dict[str, Parameter], + pydantic.Field(default_factory=dict, description="Parameters."), + ] + case: typing.Annotated[ + str, pydantic.Field(description="Case or scenario identifier.") + ] + detailed_technology: typing.Annotated[ + str, pydantic.Field(description="Detailed technology name.") + ] + + def __getitem__(self, key: str) -> Parameter: """ Access a parameter by name. @@ -78,7 +66,7 @@ def __getitem__(self, key: str) -> technologydata.Parameter: """ return self.parameters[key] - def __setitem__(self, key: str, value: technologydata.Parameter) -> None: + def __setitem__(self, key: str, value: Parameter) -> None: """ Set a parameter by name. @@ -180,3 +168,47 @@ def adjust_scale(self, scaling_factor: float) -> "Technology": """ # Placeholder: implement scaling logic return self + + @classmethod + def from_dict(cls, data: dict[str, typing.Any]) -> "Technology": + """ + Create an instance of the class from a dictionary. + + Parameters + ---------- + cls : type + The class to instantiate. + data : dict + A dictionary containing the data to initialize the class instance. + Expected keys include: + - "region" (str): The region associated with the instance. + - "case" (str): The case identifier. + - "year" (int): The year value. + - "name" (str): The name of the instance. + - "detailed_technology" (str): Details about the technology. + - "parameters" (dict): A dictionary where each key maps to a parameter data + dictionary, which will be converted to a Parameter object. + + Returns + ------- + instance : cls + An instance of the class initialized with the provided data. + + Notes + ----- + This method processes the "parameters" field in the input data by converting each + parameter dictionary into a Parameter object using `Parameter.from_dict()`. It then + constructs and returns an instance of the class with all the provided attributes. + + """ + params = {} + for key, param_data in data.get("parameters", {}).items(): + params[key] = Parameter.from_dict(param_data) + return cls( + region=data["region"], + case=data["case"], + year=data["year"], + name=data["name"], + detailed_technology=data["detailed_technology"], + parameters=params, + ) diff --git a/technologydata/technology_collection.py b/technologydata/technology_collection.py new file mode 100644 index 00000000..4d28dd1b --- /dev/null +++ b/technologydata/technology_collection.py @@ -0,0 +1,238 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""TechnologyCollection class for representing an iterable of Technology Objects.""" + +import csv +import json +import pathlib +import re +import typing +from collections.abc import Iterator + +import pandas +import pydantic + +from technologydata.technology import Technology + + +class TechnologyCollection(pydantic.BaseModel): # type: ignore + """ + Represent a collection of technologies. + + Attributes + ---------- + technologies : List[Technology] + List of Technology objects. + + """ + + technologies: typing.Annotated[ + list[Technology], pydantic.Field(description="List of Technology objects.") + ] + + def __iter__(self) -> Iterator["Technology"]: + """ + Return an iterator over the list of Technology objects. + + Returns + ------- + Iterator[Technology] + An iterator over the Technology objects contained in the collection. + + """ + return iter(self.technologies) + + def __len__(self) -> int: + """ + Return the number of technologies in this collection. + + Returns + ------- + int + The number of Technology objects in the technologies list. + + """ + return len(self.technologies) + + def get( + self, name: str, region: str, year: int, case: str, detailed_technology: str + ) -> "TechnologyCollection": + """ + Filter technologies based on regex patterns for non-optional attributes. + + Parameters + ---------- + name : str + Regex pattern to filter technology names. + region : str + Regex pattern to filter region identifiers. + year : int + Regex pattern to filter the year of the data. + case : str + Regex pattern to filter case or scenario identifiers. + detailed_technology : str + Regex pattern to filter detailed technology names. + + Returns + ------- + TechnologyCollection + A new TechnologyCollection with filtered technologies. + + """ + filtered_technologies = self.technologies + + if name is not None: + pattern_name = re.compile(name, re.IGNORECASE) + filtered_technologies = [ + t for t in filtered_technologies if pattern_name.search(t.name) + ] + + if region is not None: + pattern_region = re.compile(region, re.IGNORECASE) + filtered_technologies = [ + t for t in filtered_technologies if pattern_region.search(t.region) + ] + + if year is not None: + pattern_year = re.compile(str(year), re.IGNORECASE) + filtered_technologies = [ + t for t in filtered_technologies if pattern_year.search(str(t.year)) + ] + + if case is not None: + pattern_case = re.compile(case, re.IGNORECASE) + filtered_technologies = [ + t for t in filtered_technologies if pattern_case.search(t.case) + ] + + if detailed_technology is not None: + pattern_detailed_technology = re.compile(detailed_technology, re.IGNORECASE) + filtered_technologies = [ + t + for t in filtered_technologies + if pattern_detailed_technology.search(t.detailed_technology) + ] + + return TechnologyCollection(technologies=filtered_technologies) + + def to_dataframe(self) -> pandas.DataFrame: + """ + Convert the TechnologyCollection to a pandas DataFrame. + + Returns + ------- + pd.DataFrame + A DataFrame containing the technology data. + + """ + return pandas.DataFrame( + [technology.model_dump() for technology in self.technologies] + ) + + def to_csv(self, **kwargs: pathlib.Path | str | bool) -> None: + """ + Export the TechnologyCollection to a CSV file. + + Parameters + ---------- + **kwargs : dict + Additional keyword arguments passed to pandas.DataFrame.to_csv(). + Common options include: + - path_or_buf : str or pathlib.Path or file-like object, optional + File path or object, if None, the result is returned as a string. + Default is None. + - sep : str + String of length 1. Field delimiter for the output file. + Default is ','. + - index : bool + Write row names (index). Default is True. + - encoding : str + String representing the encoding to use in the output file. + Default is 'utf-8'. + + Notes + ----- + The method converts the collection to a pandas DataFrame using + `self.to_dataframe()` and then writes it to a CSV file using the provided + kwargs. + + """ + default_kwargs = { + "sep": ",", + "index": False, + "encoding": "utf-8", + "quoting": csv.QUOTE_ALL, + } + + # Merge default_kwargs with user-provided kwargs, giving precedence to user kwargs + merged_kwargs = {**default_kwargs, **kwargs} + output_dataframe = self.to_dataframe() + output_dataframe.to_csv(**merged_kwargs) + + def to_json( + self, file_path: pathlib.Path, schema_path: pathlib.Path | None = None + ) -> None: + """ + Export the TechnologyCollection to a JSON file, together with a data schema. + + Parameters + ---------- + file_path : pathlib.Path + The path to the JSON file to be created. + schema_path : pathlib.Path + The path to the JSON schema file to be created. By default, created with a `schema` suffix next to `file_path`. + + """ + if schema_path is None: + schema_path = file_path.with_suffix(".schema.json") + + # Export the model's schema with descriptions to a dict + schema = self.model_json_schema() + + # Save the schema (which includes descriptions) to a JSON file + with open(schema_path, "w") as f: + json.dump(schema, f, indent=4) + + with open(file_path, mode="w", encoding="utf-8") as jsonfile: + json_data = self.model_dump_json(indent=4) # Convert to JSON string + jsonfile.write(json_data) + + @classmethod + def from_json(cls, file_path: pathlib.Path | str) -> "TechnologyCollection": + """ + Load a TechnologyCollection instance from a JSON file. + + Parameters + ---------- + file_path : pathlib.Path or str + Path to the JSON file containing the data. Can be a pathlib.Path object or a string path. + + Returns + ------- + TechnologyCollection + An instance of TechnologyCollection initialized with the data from the JSON file. + + Raises + ------ + TypeError + If `file_path` is not a pathlib.Path or str. + + Notes + ----- + This method reads the JSON data from the specified file, creates `Technology` objects + for each item in the JSON list using `Technology.from_dict()`, and returns a new + `TechnologyCollection` containing these objects. + + """ + if isinstance(file_path, pathlib.Path | str): + file_path = pathlib.Path(file_path) + else: + raise TypeError("file_path must be a pathlib.Path or str") + with open(file_path, encoding="utf-8") as jsonfile: + json_data = json.load(jsonfile) + techs = [] + for item in json_data: + techs.append(Technology.from_dict(item)) + return cls(technologies=techs) diff --git a/technologydata/unit_value.py b/technologydata/unit_value.py index 0b42cddb..a354a343 100644 --- a/technologydata/unit_value.py +++ b/technologydata/unit_value.py @@ -17,6 +17,8 @@ """ +import typing + import pint import pydantic @@ -27,13 +29,6 @@ class UnitValue(pydantic.BaseModel): # type: ignore """ Represent a numerical value with an associated unit of measurement. - Parameters - ---------- - value : float - The numerical value. - unit : str - The unit of measurement (e.g., 'EUR_2020', 'kWh_electricity', 'kWh_hydrogen_LHV'). - Attributes ---------- value : float @@ -43,8 +38,8 @@ class UnitValue(pydantic.BaseModel): # type: ignore """ - value: float = pydantic.Field(..., description="The numerical value.") - unit: str = pydantic.Field(..., description="The unit of measurement.") + value: typing.Annotated[float, pydantic.Field(description="The numerical value.")] + unit: typing.Annotated[str, pydantic.Field(description="The unit of measurement.")] def to(self, new_unit: str) -> "UnitValue": """ diff --git a/test/conftest.py b/test/conftest.py index a0d1fc81..a87b2dde 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -42,7 +42,7 @@ def create_source_from_params(params: dict[str, str]) -> technologydata.Source: Returns ------- - td.Source + technologydata.Source A Source object initialized with the provided parameters. Raises @@ -50,18 +50,6 @@ def create_source_from_params(params: dict[str, str]) -> technologydata.Source: ValueError If any of the required fields ("source_title", "source_authors") are missing from the params. - Examples - -------- - >>> params_dict = { - ... "source_title": "Example Title", - ... "source_authors": "John Doe", - ... "source_url": "http://example.com", - ... "source_url_archive": "http://web.archive.org/web/20231001120000/http://example.com", - ... "source_url_date": "2023-10-01", - ... "source_url_date_archive": "2023-10-01T12:00:00Z" - ... } - >>> source = create_source_from_params(params_dict) - """ return technologydata.Source( title=params["source_title"], diff --git a/test/test_data/solar_photovoltaics_example_03/technologies.json b/test/test_data/solar_photovoltaics_example_03/technologies.json index 02712257..be406154 100644 --- a/test/test_data/solar_photovoltaics_example_03/technologies.json +++ b/test/test_data/solar_photovoltaics_example_03/technologies.json @@ -3,170 +3,174 @@ "region": "DEU", "case": "example-scenario", "year": 2022, - "technology": "Solar photovoltaics", + "name": "Solar photovoltaics", "detailed_technology": "Si-HC", - "capacity": { - "quantity": { - "value": 1, - "unit": "MW" - }, - "provenance": "Model calculation", - "note": "Average capacity factor of 22% assumed", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" + "parameters": { + "capacity": { + "quantity": { + "value": 1, + "unit": "MW" }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "investment": { - "quantity": { - "value": 500, - "unit": "EUR_2022/KW_el" + "provenance": "Model calculation", + "note": "Average capacity factor of 22% assumed", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] }, - "provenance": "Industry report", - "note": "Average overnight cost", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" + "investment": { + "quantity": { + "value": 500, + "unit": "EUR_2022/KW_el" }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" + "provenance": "Industry report", + "note": "Average overnight cost", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] }, - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "lifetime": { - "quantity": { - "value": 30, - "unit": "years" + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] }, - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] }, - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } } }, { "region": "DEU", "case": "example-project", "year": 2022, - "technology": "Solar photovoltaics", + "name": "Solar photovoltaics", "detailed_technology": "Si-HC", - "capacity": { - "quantity": { - "value": 1.0, - "unit": "MW" - }, - "provenance": "Model calculation", - "note": "Average capacity factor of 25% assumed", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" + "parameters": { + "capacity": { + "quantity": { + "value": 1.0, + "unit": "MW" }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] + "provenance": "Model calculation", + "note": "Average capacity factor of 25% assumed", + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } }, "investment": { "quantity": { diff --git a/test/test_data/solar_photovoltaics_example_04/technologies.json b/test/test_data/solar_photovoltaics_example_04/technologies.json index 964b37ae..b97485fd 100644 --- a/test/test_data/solar_photovoltaics_example_04/technologies.json +++ b/test/test_data/solar_photovoltaics_example_04/technologies.json @@ -3,164 +3,168 @@ "region": "DEU", "case": "example-scenario", "year": 2022, - "technology": "Solar photovoltaics", + "name": "Solar photovoltaics", "detailed_technology": "Si-HC", - "capacity": { - "quantity": { - "value": 1, - "unit": "MW" + "parameters": { + "capacity": { + "quantity": { + "value": 1, + "unit": "MW" + }, + "provenance": "Model calculation", + "note": "Average capacity factor of 22% assumed", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Model calculation", - "note": "Average capacity factor of 22% assumed", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "investment": { - "quantity": { - "value": 500, - "unit": "EUR_2022/KW_el" + "investment": { + "quantity": { + "value": 500, + "unit": "EUR_2022/KW_el" + }, + "provenance": "Industry report", + "note": "Average overnight cost", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Industry report", - "note": "Average overnight cost", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" + }, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "lifetime": { - "quantity": { - "value": 30, - "unit": "years" + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" + }, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" - }, - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" + }, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + } } }, { "region": "DEU", "case": "example-project", "year": 2022, - "technology": "Solar photovoltaics", + "name": "Solar photovoltaics", "detailed_technology": "Si-HC", - "capacity": { - "quantity": { - "value": 1.0, - "unit": "MW" - }, - "provenance": "Model calculation", - "note": "Average capacity factor of 25% assumed", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "investment": { - "quantity": { - "value": 350, - "unit": "EUR_2022/KW_el" + "parameters": { + "capacity": { + "quantity": { + "value": 1.0, + "unit": "MW" + }, + "provenance": "Model calculation", + "note": "Average capacity factor of 25% assumed", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Industry report", - "note": "Average overnight cost for another tech", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" + "investment": { + "quantity": { + "value": 350, + "unit": "EUR_2022/KW_el" + }, + "provenance": "Industry report", + "note": "Average overnight cost for another tech", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "lifetime": { - "quantity": { - "value": 30, - "unit": "years" + "specific_investment": { + "quantity": { + "value": 0.95, + "unit": "USD/W" + }, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" + "lifetime": { + "quantity": { + "value": 30, + "unit": "years" + }, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] }, - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] + "wacc": { + "quantity": { + "value": 0.05, + "unit": "fraction" + }, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": [ + { + "title": "example04", + "authors": "Open Energy Transition gGmbH", + "url": "https://openenergytransition.org/outputs.html" + } + ] + } } } ] diff --git a/test/test_datapackage.py b/test/test_datapackage.py new file mode 100644 index 00000000..5e84e940 --- /dev/null +++ b/test/test_datapackage.py @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the initialization and methods of the Datapackage class.""" + +import pathlib + +import technologydata + +path_cwd = pathlib.Path.cwd() + + +def test_get_source_collection() -> None: + """Test how the sources attributes is extracted from a TechnologyCollection instance.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technologies_collection = technologydata.TechnologyCollection.from_json(input_file) + data_package = technologydata.DataPackage( + technologies=technologies_collection, + ) + data_package.get_source_collection() + assert isinstance(data_package.sources, technologydata.SourceCollection) + assert len(data_package.sources) == 2 diff --git a/test/test_source.py b/test/test_source.py index f2a521fc..3751b8e2 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -14,6 +14,102 @@ path_cwd = pathlib.Path.cwd() +@pytest.mark.parametrize( + "example_source, expected_equal", + [ + ( + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https:download", + "source_url_archive": "http:/3273/download", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + False, # Expect not equal + ), + ( + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https:download", + "source_url_archive": "http:/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + True, # Expect equal + ), + ( + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + }, + False, # Expect not equal + ), + ], + indirect=["example_source"], +) # type: ignore +def test_eq(example_source: technologydata.Source, expected_equal: bool) -> None: + """Check if the override method __eq__ works as expected.""" + reference_source = technologydata.Source( + title="tech_data_generation", + authors="Danish Energy Agency", + url="https:download", + url_archive="http:/3273/download", + url_date="2025-05-06 16:02:04", + url_date_archive="2025-05-06 16:02:04", + ) + assert (example_source == reference_source) == expected_equal + + +@pytest.mark.parametrize( + "example_source", + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url_archive": "http:/3273/download", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https:download", + "source_url_archive": "http:/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + indirect=["example_source"], +) # type: ignore +def test_hash(example_source: technologydata.Source) -> None: + """Check if the override method __hash__ works as expected.""" + assert isinstance(hash(example_source), int) + + +@pytest.mark.parametrize( + "example_source, expected_string", + [ + ( + { + "source_title": "OET project page", + "source_authors": "Open Energy Transition gGmbH", + "source_url": "https://outputs.html", + "source_url_archive": "https:archived.html", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + "'Open Energy Transition gGmbH': 'OET project page', from url 'https://outputs.html', last accessed on '2025-05-06 16:02:04', archived at 'https:archived.html', on '2025-05-06 16:02:04'.", + ) + ], + indirect=["example_source"], +) # type: ignore +def test_str(example_source: technologydata.Source, expected_string: str) -> None: + """Check if the override method __str__ works as expected.""" + # Ensure the snapshot is created + assert str(example_source) == expected_string + + @pytest.mark.parametrize( "example_source", [ @@ -34,7 +130,7 @@ "source_url_date_archive": "2025-05-06 16:02:04", }, ], - indirect=True, + indirect=["example_source"], ) # type: ignore def test_retrieve_from_wayback(example_source: technologydata.Source) -> None: """Check if the example source is downloaded from the Internet Archive Wayback Machine.""" diff --git a/test/test_source_collection.py b/test/test_source_collection.py index 41d65f68..fd75356b 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -14,6 +14,36 @@ path_cwd = pathlib.Path.cwd() +@pytest.mark.parametrize( + "example_source_collection, expected_string", + [ + ( + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url_date": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + "SourceCollection with 2 sources: " + "'NREL/ATB': 'atb_nrel', last accessed on '2025-05-22 15:08:02', " + "'Danish Energy Agency': 'tech_data_generation', on '2025-05-06 16:02:04'.", + ), + ], + indirect=["example_source_collection"], +) # type: ignore +def test_str( + example_source_collection: technologydata.SourceCollection, expected_string: str +) -> None: + """Check if the example source collection is cast to string as expected.""" + assert str(example_source_collection) == expected_string + + @pytest.mark.parametrize( "example_source_collection", [ @@ -28,7 +58,7 @@ }, ] ], - indirect=True, + indirect=["example_source_collection"], ) # type: ignore def test_example_source_collection( example_source_collection: technologydata.SourceCollection, @@ -69,7 +99,7 @@ def test_example_source_collection( }, ], ], - indirect=True, + indirect=["example_source_collection"], ) # type: ignore def test_retrieve_all_from_wayback( example_source_collection: technologydata.SourceCollection, @@ -118,7 +148,7 @@ def test_retrieve_all_from_wayback( }, ], ], - indirect=True, + indirect=["example_source_collection"], ) # type: ignore def test_to_csv(example_source_collection: technologydata.SourceCollection) -> None: """Check if the example source collection is exported to CSV.""" @@ -150,12 +180,12 @@ def test_to_csv(example_source_collection: technologydata.SourceCollection) -> N }, ], ], - indirect=True, + indirect=["example_source_collection"], ) # type: ignore def test_to_json(example_source_collection: technologydata.SourceCollection) -> None: """Check if the example source collection is exported to JSON.""" output_file = pathlib.Path(path_cwd, "sources.json") - schema_file = pathlib.Path(path_cwd, "source_collection_schema.json") + schema_file = pathlib.Path(path_cwd, "sources.schema.json") example_source_collection.to_json(pathlib.Path(output_file)) assert output_file.is_file() assert schema_file.is_file() @@ -185,7 +215,7 @@ def test_to_json(example_source_collection: technologydata.SourceCollection) -> }, ], ], - indirect=True, + indirect=["example_source_collection"], ) # type: ignore def test_to_dataframe( example_source_collection: technologydata.SourceCollection, @@ -195,11 +225,11 @@ def test_to_dataframe( def test_from_json() -> None: - """Check if the example source collection is exported to JSON.""" + """Check if the example source collection is imported from JSON.""" input_file = pathlib.Path( path_cwd, "test", "test_data", "solar_photovoltaics_example_03", "sources.json" ) - source_collection = technologydata.SourceCollection.from_json(input_file) + source_collection = technologydata.SourceCollection.from_json(file_path=input_file) assert isinstance(source_collection, technologydata.SourceCollection) assert len(source_collection) == 2 @@ -214,6 +244,6 @@ def test_get(title_pattern: str, authors_pattern: str) -> None: path_cwd, "test", "test_data", "solar_photovoltaics_example_03", "sources.json" ) - source_collection = technologydata.SourceCollection.from_json(input_file) + source_collection = technologydata.SourceCollection.from_json(file_path=input_file) result = source_collection.get(title=title_pattern, authors=authors_pattern) assert len(result.sources) == 1 diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py new file mode 100644 index 00000000..3e1e7fb5 --- /dev/null +++ b/test/test_technology_collection.py @@ -0,0 +1,106 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the initialization and methods of the TechnologyCollection class.""" + +import pathlib + +import pandas +import pytest + +import technologydata + +path_cwd = pathlib.Path.cwd() + + +def test_to_csv() -> None: + """Check if the example technology collection is exported to CSV.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json(input_file) + output_file = pathlib.Path(path_cwd, "technologies.csv") + technology_collection.to_csv(path_or_buf=output_file) + assert output_file.is_file() + output_file.unlink(missing_ok=True) + + +def test_to_dataframe() -> None: + """Check if the example technology collection is exported to pandas dataframe.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json(input_file) + assert isinstance(technology_collection.to_dataframe(), pandas.DataFrame) + + +def test_to_json() -> None: + """Check if the example technology collection is exported to JSON.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json(input_file) + output_file = pathlib.Path(path_cwd, "technologies.json") + schema_file = pathlib.Path(path_cwd, "technologies.schema.json") + technology_collection.to_json(pathlib.Path(output_file)) + assert output_file.is_file() + assert schema_file.is_file() + output_file.unlink(missing_ok=True) + schema_file.unlink(missing_ok=True) + + +def test_from_json() -> None: + """Check if the example technology collection is imported from JSON.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json(input_file) + assert isinstance(technology_collection, technologydata.TechnologyCollection) + assert len(technology_collection) == 2 + + +@pytest.mark.parametrize( + "name, region, year, case, detailed_technology", + [ + ["Solar photovoltaics", "DEU", 2022, "example-scenario", "Si-HC"], + ["Solar photovoltaics", "DEU", 2022, "example-project", "Si-HC"], + ], +) # type: ignore +def test_get( + name: str, region: str, year: int, case: str, detailed_technology: str +) -> None: + """Check if the example technology collection is filtered as requested.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technologies_collection = technologydata.TechnologyCollection.from_json(input_file) + result = technologies_collection.get( + name=name, + region=region, + year=year, + case=case, + detailed_technology=detailed_technology, + ) + assert isinstance(result, technologydata.TechnologyCollection) + assert len(result.technologies) == 1 From 506f17f8efec48541faaf977f8cfccf5435b2a45 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:59:44 +0200 Subject: [PATCH 04/81] config: add pytest-xdist and pytest-cov (#16) --- pyproject.toml | 13 +- uv.lock | 1383 +++++------------------------------------------- 2 files changed, 143 insertions(+), 1253 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 535a6247..b6b18868 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,9 +30,12 @@ dependencies = [ "ipykernel>=6.29.5", # this one can go into optional as "dev" "mypy>=1.15.0", "pandas>=2.2.3", - "pre-commit>=4.2.0", # this one can go into optional as "dev" + "pre-commit>=4.2.0", # this one can go into optional as "dev" "pytest>=8.3.5", # this one can go into optional as "dev" + "pytest-cov>=6.2.1", # this one can go into optional as "dev" + "pytest-xdist>=3.8.0", # this one can go into optional as "dev" "requests>=2.32.3", + "reuse>=5.0.2", "savepagenow>=1.3.0", ] @@ -53,9 +56,15 @@ docs = [ "mkdocstrings-python>=1.16.11", ] +[tool.pytest.ini_options] +testpaths = "test" +addopts = "--cov=technologydata --cov-report=term" +filterwarnings = [ + "ignore::RuntimeWarning", + "ignore:numpy.ndarray size changed*:RuntimeWarning" +] # Setuptools_scm settings - [tool.uv] package = true diff --git a/uv.lock b/uv.lock index 9a3db3d3..91c5b29f 100644 --- a/uv.lock +++ b/uv.lock @@ -2,15 +2,6 @@ version = 1 revision = 2 requires-python = ">=3.12" -[[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, upload_time = "2024-05-20T21:33:25.928Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, -] - [[package]] name = "appnope" version = "0.1.4" @@ -62,16 +53,24 @@ wheels = [ ] [[package]] -name = "beautifulsoup4" -version = "4.13.4" +name = "binaryornot" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, + { name = "chardet" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload_time = "2017-08-03T15:55:25.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload_time = "2017-08-03T15:55:31.23Z" }, +] + +[[package]] +name = "boolean-py" +version = "5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, ] [[package]] @@ -203,44 +202,67 @@ wheels = [ ] [[package]] -name = "contourpy" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload_time = "2025-04-15T17:47:53.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload_time = "2025-04-15T17:37:03.105Z" }, - { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload_time = "2025-04-15T17:37:07.026Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload_time = "2025-04-15T17:37:11.481Z" }, - { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload_time = "2025-04-15T17:37:18.212Z" }, - { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload_time = "2025-04-15T17:37:22.76Z" }, - { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload_time = "2025-04-15T17:37:33.001Z" }, - { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload_time = "2025-04-15T17:37:48.64Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload_time = "2025-04-15T17:38:06.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload_time = "2025-04-15T17:38:10.338Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload_time = "2025-04-15T17:38:14.239Z" }, - { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload_time = "2025-04-15T17:38:19.142Z" }, - { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload_time = "2025-04-15T17:38:23.688Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload_time = "2025-04-15T17:38:28.238Z" }, - { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload_time = "2025-04-15T17:38:33.502Z" }, - { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload_time = "2025-04-15T17:38:38.672Z" }, - { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload_time = "2025-04-15T17:38:43.712Z" }, - { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload_time = "2025-04-15T17:39:00.224Z" }, - { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload_time = "2025-04-15T17:43:29.649Z" }, - { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload_time = "2025-04-15T17:44:44.532Z" }, - { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload_time = "2025-04-15T17:44:48.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload_time = "2025-04-15T17:43:34.084Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload_time = "2025-04-15T17:43:38.626Z" }, - { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload_time = "2025-04-15T17:43:44.522Z" }, - { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload_time = "2025-04-15T17:43:49.545Z" }, - { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload_time = "2025-04-15T17:43:54.203Z" }, - { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload_time = "2025-04-15T17:44:01.025Z" }, - { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload_time = "2025-04-15T17:44:17.322Z" }, - { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload_time = "2025-04-15T17:44:33.43Z" }, - { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload_time = "2025-04-15T17:44:37.092Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload_time = "2025-04-15T17:44:40.827Z" }, +name = "coverage" +version = "7.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938, upload_time = "2025-07-27T14:13:39.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934, upload_time = "2025-07-27T14:11:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173, upload_time = "2025-07-27T14:11:38.005Z" }, + { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190, upload_time = "2025-07-27T14:11:39.887Z" }, + { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618, upload_time = "2025-07-27T14:11:41.841Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081, upload_time = "2025-07-27T14:11:43.705Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990, upload_time = "2025-07-27T14:11:45.244Z" }, + { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191, upload_time = "2025-07-27T14:11:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400, upload_time = "2025-07-27T14:11:48.643Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338, upload_time = "2025-07-27T14:11:50.258Z" }, + { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125, upload_time = "2025-07-27T14:11:52.034Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523, upload_time = "2025-07-27T14:11:53.965Z" }, + { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960, upload_time = "2025-07-27T14:11:55.959Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220, upload_time = "2025-07-27T14:11:57.899Z" }, + { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772, upload_time = "2025-07-27T14:12:00.422Z" }, + { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116, upload_time = "2025-07-27T14:12:03.099Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554, upload_time = "2025-07-27T14:12:04.668Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766, upload_time = "2025-07-27T14:12:06.234Z" }, + { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735, upload_time = "2025-07-27T14:12:08.305Z" }, + { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118, upload_time = "2025-07-27T14:12:09.903Z" }, + { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381, upload_time = "2025-07-27T14:12:11.535Z" }, + { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152, upload_time = "2025-07-27T14:12:13.182Z" }, + { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559, upload_time = "2025-07-27T14:12:14.807Z" }, + { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677, upload_time = "2025-07-27T14:12:16.68Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899, upload_time = "2025-07-27T14:12:18.758Z" }, + { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140, upload_time = "2025-07-27T14:12:20.357Z" }, + { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005, upload_time = "2025-07-27T14:12:22.007Z" }, + { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143, upload_time = "2025-07-27T14:12:23.746Z" }, + { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735, upload_time = "2025-07-27T14:12:25.73Z" }, + { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871, upload_time = "2025-07-27T14:12:27.767Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692, upload_time = "2025-07-27T14:12:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059, upload_time = "2025-07-27T14:12:31.076Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150, upload_time = "2025-07-27T14:12:32.746Z" }, + { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014, upload_time = "2025-07-27T14:12:34.406Z" }, + { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951, upload_time = "2025-07-27T14:12:36.069Z" }, + { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229, upload_time = "2025-07-27T14:12:37.759Z" }, + { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738, upload_time = "2025-07-27T14:12:39.453Z" }, + { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045, upload_time = "2025-07-27T14:12:41.387Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666, upload_time = "2025-07-27T14:12:43.056Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692, upload_time = "2025-07-27T14:12:44.83Z" }, + { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536, upload_time = "2025-07-27T14:12:46.527Z" }, + { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954, upload_time = "2025-07-27T14:12:49.279Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616, upload_time = "2025-07-27T14:12:51.214Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412, upload_time = "2025-07-27T14:12:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776, upload_time = "2025-07-27T14:12:55.482Z" }, + { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698, upload_time = "2025-07-27T14:12:57.225Z" }, + { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902, upload_time = "2025-07-27T14:12:59.071Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230, upload_time = "2025-07-27T14:13:01.248Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194, upload_time = "2025-07-27T14:13:03.247Z" }, + { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316, upload_time = "2025-07-27T14:13:04.957Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794, upload_time = "2025-07-27T14:13:06.715Z" }, + { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869, upload_time = "2025-07-27T14:13:08.933Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765, upload_time = "2025-07-27T14:13:10.778Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420, upload_time = "2025-07-27T14:13:12.882Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536, upload_time = "2025-07-27T14:13:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190, upload_time = "2025-07-27T14:13:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597, upload_time = "2025-07-27T14:13:37.221Z" }, ] [[package]] @@ -249,15 +271,6 @@ version = "0.9.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } -[[package]] -name = "cycler" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload_time = "2023-10-07T05:32:18.335Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload_time = "2023-10-07T05:32:16.783Z" }, -] - [[package]] name = "debugpy" version = "1.8.14" @@ -294,12 +307,12 @@ wheels = [ ] [[package]] -name = "et-xmlfile" -version = "2.0.0" +name = "execnet" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, ] [[package]] @@ -320,91 +333,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, ] -[[package]] -name = "flexcache" -version = "0.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, -] - -[[package]] -name = "flexparser" -version = "0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, -] - -[[package]] -name = "fonttools" -version = "4.58.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/97/5735503e58d3816b0989955ef9b2df07e4c99b246469bd8b3823a14095da/fonttools-4.58.5.tar.gz", hash = "sha256:b2a35b0a19f1837284b3a23dd64fd7761b8911d50911ecd2bdbaf5b2d1b5df9c", size = 3526243, upload_time = "2025-07-03T14:04:47.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/68/66b498ee66f3e7e92fd68476c2509508082b7f57d68c0cdb4b8573f44331/fonttools-4.58.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c3af3fefaafb570a03051a0d6899b8374dcf8e6a4560e42575843aef33bdbad6", size = 2754751, upload_time = "2025-07-03T14:03:52.976Z" }, - { url = "https://files.pythonhosted.org/packages/f1/1e/edbc14b79290980c3944a1f43098624bc8965f534964aa03d52041f24cb4/fonttools-4.58.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:688137789dbd44e8757ad77b49a771539d8069195ffa9a8bcf18176e90bbd86d", size = 2322342, upload_time = "2025-07-03T14:03:54.957Z" }, - { url = "https://files.pythonhosted.org/packages/c1/d7/3c87cf147185d91c2e946460a5cf68c236427b4a23ab96793ccb7d8017c9/fonttools-4.58.5-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af65836cf84cd7cb882d0b353bdc73643a497ce23b7414c26499bb8128ca1af", size = 4897011, upload_time = "2025-07-03T14:03:56.829Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d6/fbb44cc85d4195fe54356658bd9f934328b4f74ae14addd90b4b5558b5c9/fonttools-4.58.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2d79cfeb456bf438cb9fb87437634d4d6f228f27572ca5c5355e58472d5519d", size = 4942291, upload_time = "2025-07-03T14:03:59.204Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c8/453f82e21aedf25cdc2ae619c03a73512398cec9bd8b6c3b1c571e0b6632/fonttools-4.58.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0feac9dda9a48a7a342a593f35d50a5cee2dbd27a03a4c4a5192834a4853b204", size = 4886824, upload_time = "2025-07-03T14:04:01.517Z" }, - { url = "https://files.pythonhosted.org/packages/40/54/e9190001b8e22d123f78925b2f508c866d9d18531694b979277ad45d59b0/fonttools-4.58.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36555230e168511e83ad8637232268649634b8dfff6ef58f46e1ebc057a041ad", size = 5038510, upload_time = "2025-07-03T14:04:03.917Z" }, - { url = "https://files.pythonhosted.org/packages/cf/9c/07cdad4774841a6304aabae939f8cbb9538cb1d8e97f5016b334da98e73a/fonttools-4.58.5-cp312-cp312-win32.whl", hash = "sha256:26ec05319353842d127bd02516eacb25b97ca83966e40e9ad6fab85cab0576f4", size = 2188459, upload_time = "2025-07-03T14:04:06.103Z" }, - { url = "https://files.pythonhosted.org/packages/0e/4d/1eaaad22781d55f49d1b184563842172aeb6a4fe53c029e503be81114314/fonttools-4.58.5-cp312-cp312-win_amd64.whl", hash = "sha256:778a632e538f82c1920579c0c01566a8f83dc24470c96efbf2fbac698907f569", size = 2236565, upload_time = "2025-07-03T14:04:08.27Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ee/764dd8b99891f815241f449345863cfed9e546923d9cef463f37fd1d7168/fonttools-4.58.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f4b6f1360da13cecc88c0d60716145b31e1015fbe6a59e32f73a4404e2ea92cf", size = 2745867, upload_time = "2025-07-03T14:04:10.586Z" }, - { url = "https://files.pythonhosted.org/packages/e2/23/8fef484c02fef55e226dfeac4339a015c5480b6a496064058491759ac71e/fonttools-4.58.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a036822e915692aa2c03e2decc60f49a8190f8111b639c947a4f4e5774d0d7a", size = 2317933, upload_time = "2025-07-03T14:04:12.335Z" }, - { url = "https://files.pythonhosted.org/packages/ab/47/f92b135864fa777e11ad68420bf89446c91a572fe2782745586f8e6aac0c/fonttools-4.58.5-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d7709fcf4577b0f294ee6327088884ca95046e1eccde87c53bbba4d5008541", size = 4877844, upload_time = "2025-07-03T14:04:14.58Z" }, - { url = "https://files.pythonhosted.org/packages/3e/65/6c1a83511d8ac32411930495645edb3f8dfabebcb78f08cf6009ba2585ec/fonttools-4.58.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9b5099ca99b79d6d67162778b1b1616fc0e1de02c1a178248a0da8d78a33852", size = 4940106, upload_time = "2025-07-03T14:04:16.563Z" }, - { url = "https://files.pythonhosted.org/packages/fa/90/df8eb77d6cf266cbbba01866a1349a3e9121e0a63002cf8d6754e994f755/fonttools-4.58.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f2c05a8d82a4d15aebfdb3506e90793aea16e0302cec385134dd960647a36c0", size = 4879458, upload_time = "2025-07-03T14:04:19.584Z" }, - { url = "https://files.pythonhosted.org/packages/26/b1/e32f8de51b7afcfea6ad62780da2fa73212c43a32cd8cafcc852189d7949/fonttools-4.58.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79f0c4b1cc63839b61deeac646d8dba46f8ed40332c2ac1b9997281462c2e4ba", size = 5021917, upload_time = "2025-07-03T14:04:21.736Z" }, - { url = "https://files.pythonhosted.org/packages/89/72/578aa7fe32918dd763c62f447aaed672d665ee10e3eeb1725f4d6493fe96/fonttools-4.58.5-cp313-cp313-win32.whl", hash = "sha256:a1a9a2c462760976882131cbab7d63407813413a2d32cd699e86a1ff22bf7aa5", size = 2186827, upload_time = "2025-07-03T14:04:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/71/a3/21e921b16cb9c029d3308e0cb79c9a937e9ff1fc1ee28c2419f0957b9e7c/fonttools-4.58.5-cp313-cp313-win_amd64.whl", hash = "sha256:bca61b14031a4b7dc87e14bf6ca34c275f8e4b9f7a37bc2fe746b532a924cf30", size = 2235706, upload_time = "2025-07-03T14:04:26.082Z" }, - { url = "https://files.pythonhosted.org/packages/d7/d4/1d85a1996b6188cd2713230e002d79a6f3a289bb17cef600cba385848b72/fonttools-4.58.5-py3-none-any.whl", hash = "sha256:e48a487ed24d9b611c5c4b25db1e50e69e9854ca2670e39a3486ffcd98863ec4", size = 1115318, upload_time = "2025-07-03T14:04:45.378Z" }, -] - -[[package]] -name = "frictionless" -version = "5.18.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "chardet" }, - { name = "humanize" }, - { name = "isodate" }, - { name = "jinja2" }, - { name = "jsonschema" }, - { name = "marko" }, - { name = "petl" }, - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "python-slugify" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "rfc3986" }, - { name = "simpleeval" }, - { name = "tabulate" }, - { name = "typer" }, - { name = "typing-extensions" }, - { name = "validators" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, -] - -[package.optional-dependencies] -pandas = [ - { name = "pandas" }, - { name = "pyarrow" }, -] - [[package]] name = "ghp-import" version = "2.1.0" @@ -453,45 +381,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload_time = "2025-04-23T11:29:07.145Z" }, ] -[[package]] -name = "hdx-python-country" -version = "3.9.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "hdx-python-utilities" }, - { name = "libhxl" }, - { name = "tenacity" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/6b/424edb0f0834cd645a9ea97e2741046d42dbc54407eaef17bcd160f8e58d/hdx_python_country-3.9.5.tar.gz", hash = "sha256:1db9872a083c8bd0632ae13247b48011ab4655265b7967f73eeac88123168879", size = 529170, upload_time = "2025-06-24T22:28:08.996Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/9a/19b60f18d26bc674cc5c5e6a55ea0ec1da3713df6a307dfe6881486464f3/hdx_python_country-3.9.5-py3-none-any.whl", hash = "sha256:6e21b3f904564c8ef61835f063d2bcefff11393967bbe261b42ea87fe82f9b7c", size = 55537, upload_time = "2025-06-24T22:28:06.824Z" }, -] - -[[package]] -name = "hdx-python-utilities" -version = "3.8.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frictionless" }, - { name = "ijson" }, - { name = "jsonlines" }, - { name = "loguru" }, - { name = "openpyxl" }, - { name = "pyphonetics" }, - { name = "python-dateutil" }, - { name = "ratelimit" }, - { name = "requests-file" }, - { name = "ruamel-yaml" }, - { name = "tableschema-to-template" }, - { name = "xlrd" }, - { name = "xlsx2csv" }, - { name = "xlwt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009, upload_time = "2025-05-14T02:31:28.578Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787, upload_time = "2025-05-14T02:31:26.794Z" }, -] - [[package]] name = "htmlmin2" version = "0.1.13" @@ -500,15 +389,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, ] -[[package]] -name = "humanize" -version = "4.12.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514, upload_time = "2025-04-30T11:51:07.98Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487, upload_time = "2025-04-30T11:51:06.468Z" }, -] - [[package]] name = "identify" version = "2.6.12" @@ -527,62 +407,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] -[[package]] -name = "ijson" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, -] - -[[package]] -name = "imf-reader" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "chardet" }, - { name = "pandas" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990, upload_time = "2025-02-06T09:16:10.723Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520, upload_time = "2025-02-06T09:16:09.042Z" }, -] - [[package]] name = "iniconfig" version = "2.1.0" @@ -649,15 +473,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, ] -[[package]] -name = "isodate" -version = "0.7.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, -] - [[package]] name = "jedi" version = "0.19.2" @@ -682,72 +497,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] -[[package]] -name = "joblib" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload_time = "2025-05-23T12:04:37.097Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload_time = "2025-05-23T12:04:35.124Z" }, -] - [[package]] name = "jsmin" version = "3.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } -[[package]] -name = "jsonlines" -version = "4.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, -] - -[[package]] -name = "jsonpath-ng" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ply" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, -] - -[[package]] -name = "jsonschema" -version = "4.24.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/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480, upload_time = "2025-05-26T18:48:10.459Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709, upload_time = "2025-05-26T18:48:08.417Z" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, -] - [[package]] name = "jupyter-client" version = "8.6.3" @@ -779,94 +534,15 @@ wheels = [ ] [[package]] -name = "kiwisolver" -version = "1.4.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload_time = "2024-12-24T18:30:51.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152, upload_time = "2024-12-24T18:29:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555, upload_time = "2024-12-24T18:29:19.146Z" }, - { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067, upload_time = "2024-12-24T18:29:20.096Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443, upload_time = "2024-12-24T18:29:22.843Z" }, - { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728, upload_time = "2024-12-24T18:29:24.463Z" }, - { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388, upload_time = "2024-12-24T18:29:25.776Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849, upload_time = "2024-12-24T18:29:27.202Z" }, - { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533, upload_time = "2024-12-24T18:29:28.638Z" }, - { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898, upload_time = "2024-12-24T18:29:30.368Z" }, - { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605, upload_time = "2024-12-24T18:29:33.151Z" }, - { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801, upload_time = "2024-12-24T18:29:34.584Z" }, - { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077, upload_time = "2024-12-24T18:29:36.138Z" }, - { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410, upload_time = "2024-12-24T18:29:39.991Z" }, - { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853, upload_time = "2024-12-24T18:29:42.006Z" }, - { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424, upload_time = "2024-12-24T18:29:44.38Z" }, - { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156, upload_time = "2024-12-24T18:29:45.368Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555, upload_time = "2024-12-24T18:29:46.37Z" }, - { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071, upload_time = "2024-12-24T18:29:47.333Z" }, - { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053, upload_time = "2024-12-24T18:29:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278, upload_time = "2024-12-24T18:29:51.164Z" }, - { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139, upload_time = "2024-12-24T18:29:52.594Z" }, - { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517, upload_time = "2024-12-24T18:29:53.941Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952, upload_time = "2024-12-24T18:29:56.523Z" }, - { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132, upload_time = "2024-12-24T18:29:57.989Z" }, - { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997, upload_time = "2024-12-24T18:29:59.393Z" }, - { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060, upload_time = "2024-12-24T18:30:01.338Z" }, - { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471, upload_time = "2024-12-24T18:30:04.574Z" }, - { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793, upload_time = "2024-12-24T18:30:06.25Z" }, - { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855, upload_time = "2024-12-24T18:30:07.535Z" }, - { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430, upload_time = "2024-12-24T18:30:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294, upload_time = "2024-12-24T18:30:09.508Z" }, - { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736, upload_time = "2024-12-24T18:30:11.039Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194, upload_time = "2024-12-24T18:30:14.886Z" }, - { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942, upload_time = "2024-12-24T18:30:18.927Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341, upload_time = "2024-12-24T18:30:22.102Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455, upload_time = "2024-12-24T18:30:24.947Z" }, - { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138, upload_time = "2024-12-24T18:30:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857, upload_time = "2024-12-24T18:30:28.86Z" }, - { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129, upload_time = "2024-12-24T18:30:30.34Z" }, - { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538, upload_time = "2024-12-24T18:30:33.334Z" }, - { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661, upload_time = "2024-12-24T18:30:34.939Z" }, - { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710, upload_time = "2024-12-24T18:30:37.281Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213, upload_time = "2024-12-24T18:30:40.019Z" }, -] - -[[package]] -name = "lark" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/60/bc7622aefb2aee1c0b4ba23c1446d3e30225c8770b38d7aedbfb65ca9d5a/lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80", size = 252132, upload_time = "2024-08-13T19:49:00.652Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/00/d90b10b962b4277f5e64a78b6609968859ff86889f5b898c1a778c06ec00/lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c", size = 111036, upload_time = "2024-08-13T19:48:58.603Z" }, -] - -[[package]] -name = "libhxl" -version = "5.2.2" +name = "license-expression" +version = "30.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonpath-ng" }, - { name = "ply" }, - { name = "python-dateutil" }, - { name = "python-io-wrapper" }, - { name = "requests" }, - { name = "structlog" }, - { name = "unidecode" }, - { name = "urllib3" }, - { name = "wheel" }, - { name = "xlrd3" }, + { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } - -[[package]] -name = "loguru" -version = "0.7.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "win32-setctime", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload_time = "2025-07-22T11:13:32.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, ] [[package]] @@ -878,27 +554,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload_time = "2025-06-19T17:12:42.994Z" }, ] -[[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, upload_time = "2023-06-03T06:41:14.443Z" } -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, upload_time = "2023-06-03T06:41:11.019Z" }, -] - -[[package]] -name = "marko" -version = "2.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795, upload_time = "2025-06-13T03:25:50.857Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186, upload_time = "2025-06-13T03:25:49.858Z" }, -] - [[package]] name = "markupsafe" version = "3.0.2" @@ -937,43 +592,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, ] -[[package]] -name = "matplotlib" -version = "3.10.3" -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/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811, upload_time = "2025-05-08T19:10:54.39Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/43/6b80eb47d1071f234ef0c96ca370c2ca621f91c12045f1401b5c9b28a639/matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea", size = 8179689, upload_time = "2025-05-08T19:10:07.602Z" }, - { url = "https://files.pythonhosted.org/packages/0f/70/d61a591958325c357204870b5e7b164f93f2a8cca1dc6ce940f563909a13/matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4", size = 8050466, upload_time = "2025-05-08T19:10:09.383Z" }, - { url = "https://files.pythonhosted.org/packages/e7/75/70c9d2306203148cc7902a961240c5927dd8728afedf35e6a77e105a2985/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee", size = 8456252, upload_time = "2025-05-08T19:10:11.958Z" }, - { url = "https://files.pythonhosted.org/packages/c4/91/ba0ae1ff4b3f30972ad01cd4a8029e70a0ec3b8ea5be04764b128b66f763/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a", size = 8601321, upload_time = "2025-05-08T19:10:14.47Z" }, - { url = "https://files.pythonhosted.org/packages/d2/88/d636041eb54a84b889e11872d91f7cbf036b3b0e194a70fa064eb8b04f7a/matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7", size = 9406972, upload_time = "2025-05-08T19:10:16.569Z" }, - { url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05", size = 8067954, upload_time = "2025-05-08T19:10:18.663Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c1/23cfb566a74c696a3b338d8955c549900d18fe2b898b6e94d682ca21e7c2/matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", size = 8180318, upload_time = "2025-05-08T19:10:20.426Z" }, - { url = "https://files.pythonhosted.org/packages/6c/0c/02f1c3b66b30da9ee343c343acbb6251bef5b01d34fad732446eaadcd108/matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", size = 8051132, upload_time = "2025-05-08T19:10:22.569Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ab/8db1a5ac9b3a7352fb914133001dae889f9fcecb3146541be46bed41339c/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", size = 8457633, upload_time = "2025-05-08T19:10:24.749Z" }, - { url = "https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", size = 8601031, upload_time = "2025-05-08T19:10:27.03Z" }, - { url = "https://files.pythonhosted.org/packages/12/6f/6cc79e9e5ab89d13ed64da28898e40fe5b105a9ab9c98f83abd24e46d7d7/matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", size = 9406988, upload_time = "2025-05-08T19:10:29.056Z" }, - { url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", size = 8068034, upload_time = "2025-05-08T19:10:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/3e/e5/2f14791ff69b12b09e9975e1d116d9578ac684460860ce542c2588cb7a1c/matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", size = 8218223, upload_time = "2025-05-08T19:10:33.114Z" }, - { url = "https://files.pythonhosted.org/packages/5c/08/30a94afd828b6e02d0a52cae4a29d6e9ccfcf4c8b56cc28b021d3588873e/matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", size = 8094985, upload_time = "2025-05-08T19:10:35.337Z" }, - { url = "https://files.pythonhosted.org/packages/89/44/f3bc6b53066c889d7a1a3ea8094c13af6a667c5ca6220ec60ecceec2dabe/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", size = 8483109, upload_time = "2025-05-08T19:10:37.611Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c7/473bc559beec08ebee9f86ca77a844b65747e1a6c2691e8c92e40b9f42a8/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", size = 8618082, upload_time = "2025-05-08T19:10:39.892Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e9/6ce8edd264c8819e37bbed8172e0ccdc7107fe86999b76ab5752276357a4/matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", size = 9413699, upload_time = "2025-05-08T19:10:42.376Z" }, - { url = "https://files.pythonhosted.org/packages/1b/92/9a45c91089c3cf690b5badd4be81e392ff086ccca8a1d4e3a08463d8a966/matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", size = 8139044, upload_time = "2025-05-08T19:10:44.551Z" }, -] - [[package]] name = "matplotlib-inline" version = "0.1.7" @@ -986,15 +604,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, ] -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, -] - [[package]] name = "mergedeep" version = "1.3.4" @@ -1266,34 +875,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376, upload_time = "2025-06-21T12:24:56.884Z" }, ] -[[package]] -name = "oda-reader" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "openpyxl" }, - { name = "pandas" }, - { name = "pyarrow" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630, upload_time = "2025-06-16T16:15:05.49Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314, upload_time = "2025-06-16T16:15:04.328Z" }, -] - -[[package]] -name = "openpyxl" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "et-xmlfile" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, -] - [[package]] name = "packaging" version = "25.0" @@ -1364,12 +945,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, ] -[[package]] -name = "petl" -version = "1.7.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780, upload_time = "2025-04-04T23:54:50.921Z" } - [[package]] name = "pexpect" version = "4.9.0" @@ -1382,87 +957,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, ] -[[package]] -name = "pillow" -version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload_time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload_time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload_time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload_time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload_time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload_time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload_time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload_time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload_time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload_time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload_time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload_time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload_time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload_time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload_time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload_time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload_time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload_time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload_time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload_time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload_time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload_time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload_time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload_time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload_time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload_time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload_time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload_time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload_time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload_time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload_time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload_time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload_time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload_time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload_time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload_time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload_time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload_time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload_time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload_time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload_time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload_time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload_time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload_time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload_time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload_time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload_time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload_time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload_time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload_time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload_time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload_time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload_time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload_time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload_time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload_time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload_time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload_time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload_time = "2025-07-01T09:15:50.399Z" }, -] - -[[package]] -name = "pint" -version = "0.24.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flexcache" }, - { name = "flexparser" }, - { name = "platformdirs" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload_time = "2024-11-07T16:29:46.061Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload_time = "2024-11-07T16:29:43.976Z" }, -] - [[package]] name = "platformdirs" version = "4.3.8" @@ -1481,15 +975,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "ply" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, -] - [[package]] name = "pre-commit" version = "4.2.0" @@ -1551,41 +1036,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, ] -[[package]] -name = "pyarrow" -version = "20.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, -] - [[package]] name = "pycparser" version = "2.22" @@ -1595,81 +1045,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, ] -[[package]] -name = "pydantic" -version = "2.11.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload_time = "2025-06-14T08:33:17.137Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload_time = "2025-06-14T08:33:14.905Z" }, -] - -[[package]] -name = "pydantic-core" -version = "2.33.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, -] - -[[package]] -name = "pydeflate" -version = "2.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "hdx-python-country" }, - { name = "imf-reader" }, - { name = "oda-reader" }, - { name = "pandas" }, - { name = "pyarrow" }, - { name = "requests" }, - { name = "wbgapi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586, upload_time = "2025-06-03T09:38:12.25Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540, upload_time = "2025-06-03T09:38:10.858Z" }, -] - [[package]] name = "pygments" version = "2.19.2" @@ -1692,27 +1067,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143, upload_time = "2025-06-21T17:56:35.356Z" }, ] -[[package]] -name = "pyparsing" -version = "3.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload_time = "2025-03-25T05:01:28.114Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload_time = "2025-03-25T05:01:24.908Z" }, -] - -[[package]] -name = "pyphonetics" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "unidecode" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, -] - [[package]] name = "pytest" version = "8.4.1" @@ -1730,40 +1084,30 @@ wheels = [ ] [[package]] -name = "python-calamine" -version = "0.4.0" +name = "pytest-cov" +version = "6.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "packaging" }, + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/03/269f96535705b2f18c8977fa58e76763b4e4727a9b3ae277a9468c8ffe05/python_calamine-0.4.0.tar.gz", hash = "sha256:94afcbae3fec36d2d7475095a59d4dc6fae45829968c743cb799ebae269d7bbf", size = 127737, upload_time = "2025-07-04T06:05:28.626Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/60/f951513aaaa470b3a38a87d65eca45e0a02bc329b47864f5a17db563f746/python_calamine-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:74bca5d44a73acf3dcfa5370820797fcfd225c8c71abcddea987c5b4f5077e98", size = 826603, upload_time = "2025-07-04T06:03:51.245Z" }, - { url = "https://files.pythonhosted.org/packages/76/3f/789955bbc77831c639890758f945eb2b25d6358065edf00da6751226cf31/python_calamine-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf80178f5d1b0ee2ccfffb8549c50855f6249e930664adc5807f4d0d6c2b269c", size = 805826, upload_time = "2025-07-04T06:03:52.482Z" }, - { url = "https://files.pythonhosted.org/packages/00/4c/f87d17d996f647030a40bfd124fe45fe893c002bee35ae6aca9910a923ae/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfef345386ae86f7720f1be93495a40fd7e7feabb8caa1df5025d7fbc58a1f", size = 874989, upload_time = "2025-07-04T06:03:53.794Z" }, - { url = "https://files.pythonhosted.org/packages/47/d2/3269367303f6c0488cf1bfebded3f9fe968d118a988222e04c9b2636bf2e/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f23e6214dbf9b29065a5dcfd6a6c674dd0e251407298c9138611c907d53423ff", size = 877504, upload_time = "2025-07-04T06:03:55.095Z" }, - { url = "https://files.pythonhosted.org/packages/f9/6d/c7ac35f5c7125e8bd07eb36773f300fda20dd2da635eae78a8cebb0b6ab7/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d792d304ee232ab01598e1d3ab22e074a32c2511476b5fb4f16f4222d9c2a265", size = 1014171, upload_time = "2025-07-04T06:03:56.777Z" }, - { url = "https://files.pythonhosted.org/packages/f0/81/5ea8792a2e9ab5e2a05872db3a4d3ed3538ad5af1861282c789e2f13a8cf/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf813425918fd68f3e991ef7c4b5015be0a1a95fc4a8ab7e73c016ef1b881bb4", size = 926737, upload_time = "2025-07-04T06:03:58.024Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6e/989e56e6f073fc0981a74ba7a393881eb351bb143e5486aa629b5e5d6a8b/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbe2a0ccb4d003635888eea83a995ff56b0748c8c76fc71923544f5a4a7d4cd7", size = 887032, upload_time = "2025-07-04T06:03:59.298Z" }, - { url = "https://files.pythonhosted.org/packages/5d/92/2c9bd64277c6fe4be695d7d5a803b38d953ec8565037486be7506642c27c/python_calamine-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7b3bb5f0d910b9b03c240987560f843256626fd443279759df4e91b717826d2", size = 929700, upload_time = "2025-07-04T06:04:01.388Z" }, - { url = "https://files.pythonhosted.org/packages/64/fa/fc758ca37701d354a6bc7d63118699f1c73788a1f2e1b44d720824992764/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bd2c0fc2b5eabd08ceac8a2935bffa88dbc6116db971aa8c3f244bad3fd0f644", size = 1053971, upload_time = "2025-07-04T06:04:02.704Z" }, - { url = "https://files.pythonhosted.org/packages/65/52/40d7e08ae0ddba331cdc9f7fb3e92972f8f38d7afbd00228158ff6d1fceb/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:85b547cb1c5b692a0c2406678d666dbc1cec65a714046104683fe4f504a1721d", size = 1057057, upload_time = "2025-07-04T06:04:04.014Z" }, - { url = "https://files.pythonhosted.org/packages/16/de/e8a071c0adfda73285d891898a24f6e99338328c404f497ff5b0e6bc3d45/python_calamine-0.4.0-cp312-cp312-win32.whl", hash = "sha256:4c2a1e3a0db4d6de4587999a21cc35845648c84fba81c03dd6f3072c690888e4", size = 665540, upload_time = "2025-07-04T06:04:05.679Z" }, - { url = "https://files.pythonhosted.org/packages/5e/f2/7fdfada13f80db12356853cf08697ff4e38800a1809c2bdd26ee60962e7a/python_calamine-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b193c89ffcc146019475cd121c552b23348411e19c04dedf5c766a20db64399a", size = 695366, upload_time = "2025-07-04T06:04:06.977Z" }, - { url = "https://files.pythonhosted.org/packages/20/66/d37412ad854480ce32f50d9f74f2a2f88b1b8a6fbc32f70aabf3211ae89e/python_calamine-0.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:43a0f15e0b60c75a71b21a012b911d5d6f5fa052afad2a8edbc728af43af0fcf", size = 670740, upload_time = "2025-07-04T06:04:08.656Z" }, - { url = "https://files.pythonhosted.org/packages/5a/10/f78218ccdc5bb5591a37d582c7e8723121d0fbe8196c5a4089110ec02f22/python_calamine-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f8d6b2d2ae73acf91343f02756bdcb2fa6117db4eaf5cfab75ce50dfb54525ee", size = 826339, upload_time = "2025-07-04T06:04:10.254Z" }, - { url = "https://files.pythonhosted.org/packages/15/b1/d7d0dbbd0469db0fc628b1b9ee3a8f3b698391279f0d7aea96e2018a3863/python_calamine-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aca7e019f42ca16806fef53e3028fa158005c0e68eabda577c3f3c2bea9735fd", size = 805473, upload_time = "2025-07-04T06:04:11.557Z" }, - { url = "https://files.pythonhosted.org/packages/46/52/033b902fb11f9b4bb59fa18621acbf5eaf4ecb0bce878d34fcb0020229df/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aca67cb447ba8dcefa4d5a1131d1cfdd1e0d0a0f0c6470655ce9ad37b7cfa228", size = 874275, upload_time = "2025-07-04T06:04:13.318Z" }, - { url = "https://files.pythonhosted.org/packages/56/12/e6b589293314a5d10b2c309411542424ebefb77430cc715d7601d80349ae/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e127d3b78d511d4f6fbdfed02fe666d83a722d73e27dd64d1718be9efafbabfe", size = 877061, upload_time = "2025-07-04T06:04:15.013Z" }, - { url = "https://files.pythonhosted.org/packages/64/24/0eeb583eb5d44f674ca9f7a846c665e33190431386d7c9f6d08ec9f09d3c/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e47891d9d62e3015448749ddb2ba60ab583a651d0fca9a3a1794936942ad7d5d", size = 1013946, upload_time = "2025-07-04T06:04:16.647Z" }, - { url = "https://files.pythonhosted.org/packages/c4/93/360cf58b8e24f760a3d4643423389dbc37bdca8b6fdda75ffc664ce622b5/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4072bf9dcb8ec49f5b92688bd960b5d0e03e4826d227bbd66478a6f6b0aea06", size = 926462, upload_time = "2025-07-04T06:04:17.936Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5d/3b8c46ccc62d020858bc52f2d792208910eb68682c6ebf8d6706593d7a88/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabc9dc770f753c4227aacedd8390056937e67af0bf65d6696c584d3054f1287", size = 886319, upload_time = "2025-07-04T06:04:19.33Z" }, - { url = "https://files.pythonhosted.org/packages/66/cf/73241714800bddb277f827c4683f579b81915406bf7dc643dc185cef7eb2/python_calamine-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4bcf36dc77674892616b66cffba432f5fd62df3e0adb0487ec245036b50041", size = 929044, upload_time = "2025-07-04T06:04:20.689Z" }, - { url = "https://files.pythonhosted.org/packages/7c/6b/71e30ee568ce1ea6676be66f1a42c6397946859effc471cc102922fb4792/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f81518d4b49c47054cb1861badf5bcef44b0a49959968fb2e9c9cb89645c76af", size = 1053084, upload_time = "2025-07-04T06:04:22.414Z" }, - { url = "https://files.pythonhosted.org/packages/75/19/87b42fe975f8952754562785a545f6d2eec17c353befdf33a8e16c046ce0/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:18375eb3ac1362fcbf3a9fcad0672d8dc054001247bc52f063e0054a3e01a8d1", size = 1056735, upload_time = "2025-07-04T06:04:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/04/db/ecee6e5d6ed4f3725312580a83c4cb1758c9060aa08bf2d8512d3396cea1/python_calamine-0.4.0-cp313-cp313-win32.whl", hash = "sha256:c7e98c7e531bafdf719414d0c428f25f933a82640fb92e6e84864a85e758aecc", size = 665282, upload_time = "2025-07-04T06:04:25.274Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0b/26337e0a0e2b335c1d6225bda8de259a21fea129a06009c1471deda28e1f/python_calamine-0.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:6ec081b874e78f4dbcbe70804644281366814289956755575a5871f725592d4e", size = 694982, upload_time = "2025-07-04T06:04:26.573Z" }, - { url = "https://files.pythonhosted.org/packages/90/26/f72c2b2fe70f2901abb41fcdf8249181133ddd72b9392cfb63d030393b3e/python_calamine-0.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f9bdf570023138ee4090a51b1e34786978d6e649852ccc3b83ac9729f125ca2", size = 670283, upload_time = "2025-07-04T06:04:28.434Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload_time = "2025-06-12T10:47:47.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload_time = "2025-06-12T10:47:45.932Z" }, +] + +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload_time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload_time = "2025-07-01T13:30:56.632Z" }, ] [[package]] @@ -1779,21 +1123,15 @@ wheels = [ ] [[package]] -name = "python-io-wrapper" -version = "0.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } - -[[package]] -name = "python-slugify" -version = "8.0.4" +name = "python-debian" +version = "1.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "text-unidecode" }, + { name = "charset-normalizer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload_time = "2025-03-11T12:27:27.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, + { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, ] [[package]] @@ -1886,26 +1224,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload_time = "2025-06-13T14:08:00.777Z" }, ] -[[package]] -name = "ratelimit" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } - -[[package]] -name = "referencing" -version = "0.36.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, -] - [[package]] name = "requests" version = "2.32.4" @@ -1922,176 +1240,22 @@ wheels = [ ] [[package]] -name = "requests-file" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, -] - -[[package]] -name = "rfc3986" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, -] - -[[package]] -name = "rich" -version = "14.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, -] - -[[package]] -name = "rpds-py" -version = "0.26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload_time = "2025-07-01T15:57:13.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload_time = "2025-07-01T15:54:15.734Z" }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload_time = "2025-07-01T15:54:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload_time = "2025-07-01T15:54:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload_time = "2025-07-01T15:54:19.295Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload_time = "2025-07-01T15:54:20.858Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload_time = "2025-07-01T15:54:22.508Z" }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload_time = "2025-07-01T15:54:23.987Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload_time = "2025-07-01T15:54:25.073Z" }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload_time = "2025-07-01T15:54:26.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload_time = "2025-07-01T15:54:27.424Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload_time = "2025-07-01T15:54:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload_time = "2025-07-01T15:54:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload_time = "2025-07-01T15:54:32.195Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload_time = "2025-07-01T15:54:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload_time = "2025-07-01T15:54:34.755Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload_time = "2025-07-01T15:54:36.292Z" }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload_time = "2025-07-01T15:54:37.469Z" }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload_time = "2025-07-01T15:54:38.954Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload_time = "2025-07-01T15:54:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload_time = "2025-07-01T15:54:43.025Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload_time = "2025-07-01T15:54:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload_time = "2025-07-01T15:54:46.043Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload_time = "2025-07-01T15:54:47.64Z" }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload_time = "2025-07-01T15:54:48.9Z" }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload_time = "2025-07-01T15:54:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload_time = "2025-07-01T15:54:52.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload_time = "2025-07-01T15:54:53.692Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload_time = "2025-07-01T15:54:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload_time = "2025-07-01T15:54:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload_time = "2025-07-01T15:54:58.561Z" }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload_time = "2025-07-01T15:54:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload_time = "2025-07-01T15:55:00.898Z" }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload_time = "2025-07-01T15:55:02.201Z" }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload_time = "2025-07-01T15:55:03.698Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload_time = "2025-07-01T15:55:05.398Z" }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload_time = "2025-07-01T15:55:08.316Z" }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload_time = "2025-07-01T15:55:09.52Z" }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload_time = "2025-07-01T15:55:11.216Z" }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload_time = "2025-07-01T15:55:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload_time = "2025-07-01T15:55:14.486Z" }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload_time = "2025-07-01T15:55:15.745Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload_time = "2025-07-01T15:55:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload_time = "2025-07-01T15:55:18.922Z" }, - { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload_time = "2025-07-01T15:55:20.399Z" }, - { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload_time = "2025-07-01T15:55:21.729Z" }, - { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload_time = "2025-07-01T15:55:22.918Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload_time = "2025-07-01T15:55:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload_time = "2025-07-01T15:55:25.554Z" }, - { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload_time = "2025-07-01T15:55:27.798Z" }, - { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload_time = "2025-07-01T15:55:29.057Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload_time = "2025-07-01T15:55:30.719Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload_time = "2025-07-01T15:55:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload_time = "2025-07-01T15:55:33.312Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload_time = "2025-07-01T15:55:34.933Z" }, - { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload_time = "2025-07-01T15:55:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload_time = "2025-07-01T15:55:37.483Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload_time = "2025-07-01T15:55:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload_time = "2025-07-01T15:55:40.175Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload_time = "2025-07-01T15:55:42.015Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload_time = "2025-07-01T15:55:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload_time = "2025-07-01T15:55:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload_time = "2025-07-01T15:55:47.098Z" }, - { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload_time = "2025-07-01T15:55:48.412Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload_time = "2025-07-01T15:55:49.816Z" }, - { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload_time = "2025-07-01T15:55:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload_time = "2025-07-01T15:55:52.541Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload_time = "2025-07-01T15:55:53.874Z" }, - { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload_time = "2025-07-01T15:55:55.167Z" }, -] - -[[package]] -name = "ruamel-yaml" -version = "0.18.14" +name = "reuse" +version = "5.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload_time = "2025-06-09T08:51:09.828Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload_time = "2025-06-09T08:51:06.348Z" }, -] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, + { name = "attrs" }, + { name = "binaryornot" }, + { name = "boolean-py" }, + { name = "click" }, + { name = "jinja2" }, + { name = "license-expression" }, + { name = "python-debian" }, + { name = "tomlkit" }, ] - -[[package]] -name = "ruff" -version = "0.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e", size = 4432239, upload_time = "2025-07-03T16:40:19.566Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/43/35421efe0e69823787b331362e11cc16bb697cd6f19cbed284d421615f14/reuse-5.0.2.tar.gz", hash = "sha256:878016ae5dd29c10bad4606d6676c12a268c12aa9fcfea66403598e16eed085c", size = 358798, upload_time = "2024-11-14T09:33:17.512Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be", size = 10369761, upload_time = "2025-07-03T16:39:38.847Z" }, - { url = "https://files.pythonhosted.org/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e", size = 11155659, upload_time = "2025-07-03T16:39:42.294Z" }, - { url = "https://files.pythonhosted.org/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc", size = 10537769, upload_time = "2025-07-03T16:39:44.75Z" }, - { url = "https://files.pythonhosted.org/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922", size = 10717602, upload_time = "2025-07-03T16:39:47.652Z" }, - { url = "https://files.pythonhosted.org/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b", size = 10198772, upload_time = "2025-07-03T16:39:49.641Z" }, - { url = "https://files.pythonhosted.org/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d", size = 11845173, upload_time = "2025-07-03T16:39:52.069Z" }, - { url = "https://files.pythonhosted.org/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1", size = 12553002, upload_time = "2025-07-03T16:39:54.551Z" }, - { url = "https://files.pythonhosted.org/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4", size = 12171330, upload_time = "2025-07-03T16:39:57.55Z" }, - { url = "https://files.pythonhosted.org/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9", size = 11774717, upload_time = "2025-07-03T16:39:59.78Z" }, - { url = "https://files.pythonhosted.org/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da", size = 11646659, upload_time = "2025-07-03T16:40:01.934Z" }, - { url = "https://files.pythonhosted.org/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce", size = 10604012, upload_time = "2025-07-03T16:40:04.363Z" }, - { url = "https://files.pythonhosted.org/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d", size = 10176799, upload_time = "2025-07-03T16:40:06.514Z" }, - { url = "https://files.pythonhosted.org/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04", size = 11241507, upload_time = "2025-07-03T16:40:08.708Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342", size = 11717609, upload_time = "2025-07-03T16:40:10.836Z" }, - { url = "https://files.pythonhosted.org/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a", size = 10523823, upload_time = "2025-07-03T16:40:13.203Z" }, - { url = "https://files.pythonhosted.org/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639", size = 11629831, upload_time = "2025-07-03T16:40:15.478Z" }, - { url = "https://files.pythonhosted.org/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12", size = 10735334, upload_time = "2025-07-03T16:40:17.677Z" }, + { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309, upload_time = "2024-11-14T09:33:15.047Z" }, ] [[package]] @@ -2107,76 +1271,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, ] -[[package]] -name = "scipy" -version = "1.16.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/81/18/b06a83f0c5ee8cddbde5e3f3d0bb9b702abfa5136ef6d4620ff67df7eee5/scipy-1.16.0.tar.gz", hash = "sha256:b5ef54021e832869c8cfb03bc3bf20366cbcd426e02a58e8a58d7584dfbb8f62", size = 30581216, upload_time = "2025-06-22T16:27:55.782Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/c0/c943bc8d2bbd28123ad0f4f1eef62525fa1723e84d136b32965dcb6bad3a/scipy-1.16.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:7eb6bd33cef4afb9fa5f1fb25df8feeb1e52d94f21a44f1d17805b41b1da3180", size = 36459071, upload_time = "2025-06-22T16:19:06.605Z" }, - { url = "https://files.pythonhosted.org/packages/99/0d/270e2e9f1a4db6ffbf84c9a0b648499842046e4e0d9b2275d150711b3aba/scipy-1.16.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1dbc8fdba23e4d80394ddfab7a56808e3e6489176d559c6c71935b11a2d59db1", size = 28490500, upload_time = "2025-06-22T16:19:11.775Z" }, - { url = "https://files.pythonhosted.org/packages/1c/22/01d7ddb07cff937d4326198ec8d10831367a708c3da72dfd9b7ceaf13028/scipy-1.16.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7dcf42c380e1e3737b343dec21095c9a9ad3f9cbe06f9c05830b44b1786c9e90", size = 20762345, upload_time = "2025-06-22T16:19:15.813Z" }, - { url = "https://files.pythonhosted.org/packages/34/7f/87fd69856569ccdd2a5873fe5d7b5bbf2ad9289d7311d6a3605ebde3a94b/scipy-1.16.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26ec28675f4a9d41587266084c626b02899db373717d9312fa96ab17ca1ae94d", size = 23418563, upload_time = "2025-06-22T16:19:20.746Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f1/e4f4324fef7f54160ab749efbab6a4bf43678a9eb2e9817ed71a0a2fd8de/scipy-1.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:952358b7e58bd3197cfbd2f2f2ba829f258404bdf5db59514b515a8fe7a36c52", size = 33203951, upload_time = "2025-06-22T16:19:25.813Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f0/b6ac354a956384fd8abee2debbb624648125b298f2c4a7b4f0d6248048a5/scipy-1.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03931b4e870c6fef5b5c0970d52c9f6ddd8c8d3e934a98f09308377eba6f3824", size = 35070225, upload_time = "2025-06-22T16:19:31.416Z" }, - { url = "https://files.pythonhosted.org/packages/e5/73/5cbe4a3fd4bc3e2d67ffad02c88b83edc88f381b73ab982f48f3df1a7790/scipy-1.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:512c4f4f85912767c351a0306824ccca6fd91307a9f4318efe8fdbd9d30562ef", size = 35389070, upload_time = "2025-06-22T16:19:37.387Z" }, - { url = "https://files.pythonhosted.org/packages/86/e8/a60da80ab9ed68b31ea5a9c6dfd3c2f199347429f229bf7f939a90d96383/scipy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e69f798847e9add03d512eaf5081a9a5c9a98757d12e52e6186ed9681247a1ac", size = 37825287, upload_time = "2025-06-22T16:19:43.375Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b5/29fece1a74c6a94247f8a6fb93f5b28b533338e9c34fdcc9cfe7a939a767/scipy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:adf9b1999323ba335adc5d1dc7add4781cb5a4b0ef1e98b79768c05c796c4e49", size = 38431929, upload_time = "2025-06-22T16:19:49.385Z" }, - { url = "https://files.pythonhosted.org/packages/46/95/0746417bc24be0c2a7b7563946d61f670a3b491b76adede420e9d173841f/scipy-1.16.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:e9f414cbe9ca289a73e0cc92e33a6a791469b6619c240aa32ee18abdce8ab451", size = 36418162, upload_time = "2025-06-22T16:19:56.3Z" }, - { url = "https://files.pythonhosted.org/packages/19/5a/914355a74481b8e4bbccf67259bbde171348a3f160b67b4945fbc5f5c1e5/scipy-1.16.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bbba55fb97ba3cdef9b1ee973f06b09d518c0c7c66a009c729c7d1592be1935e", size = 28465985, upload_time = "2025-06-22T16:20:01.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/46/63477fc1246063855969cbefdcee8c648ba4b17f67370bd542ba56368d0b/scipy-1.16.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:58e0d4354eacb6004e7aa1cd350e5514bd0270acaa8d5b36c0627bb3bb486974", size = 20737961, upload_time = "2025-06-22T16:20:05.913Z" }, - { url = "https://files.pythonhosted.org/packages/93/86/0fbb5588b73555e40f9d3d6dde24ee6fac7d8e301a27f6f0cab9d8f66ff2/scipy-1.16.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:75b2094ec975c80efc273567436e16bb794660509c12c6a31eb5c195cbf4b6dc", size = 23377941, upload_time = "2025-06-22T16:20:10.668Z" }, - { url = "https://files.pythonhosted.org/packages/ca/80/a561f2bf4c2da89fa631b3cbf31d120e21ea95db71fd9ec00cb0247c7a93/scipy-1.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b65d232157a380fdd11a560e7e21cde34fdb69d65c09cb87f6cc024ee376351", size = 33196703, upload_time = "2025-06-22T16:20:16.097Z" }, - { url = "https://files.pythonhosted.org/packages/11/6b/3443abcd0707d52e48eb315e33cc669a95e29fc102229919646f5a501171/scipy-1.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d8747f7736accd39289943f7fe53a8333be7f15a82eea08e4afe47d79568c32", size = 35083410, upload_time = "2025-06-22T16:20:21.734Z" }, - { url = "https://files.pythonhosted.org/packages/20/ab/eb0fc00e1e48961f1bd69b7ad7e7266896fe5bad4ead91b5fc6b3561bba4/scipy-1.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb9f147a1b8529bb7fec2a85cf4cf42bdfadf9e83535c309a11fdae598c88e8b", size = 35387829, upload_time = "2025-06-22T16:20:27.548Z" }, - { url = "https://files.pythonhosted.org/packages/57/9e/d6fc64e41fad5d481c029ee5a49eefc17f0b8071d636a02ceee44d4a0de2/scipy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d2b83c37edbfa837a8923d19c749c1935ad3d41cf196006a24ed44dba2ec4358", size = 37841356, upload_time = "2025-06-22T16:20:35.112Z" }, - { url = "https://files.pythonhosted.org/packages/7c/a7/4c94bbe91f12126b8bf6709b2471900577b7373a4fd1f431f28ba6f81115/scipy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:79a3c13d43c95aa80b87328a46031cf52508cf5f4df2767602c984ed1d3c6bbe", size = 38403710, upload_time = "2025-06-22T16:21:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/47/20/965da8497f6226e8fa90ad3447b82ed0e28d942532e92dd8b91b43f100d4/scipy-1.16.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:f91b87e1689f0370690e8470916fe1b2308e5b2061317ff76977c8f836452a47", size = 36813833, upload_time = "2025-06-22T16:20:43.925Z" }, - { url = "https://files.pythonhosted.org/packages/28/f4/197580c3dac2d234e948806e164601c2df6f0078ed9f5ad4a62685b7c331/scipy-1.16.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:88a6ca658fb94640079e7a50b2ad3b67e33ef0f40e70bdb7dc22017dae73ac08", size = 28974431, upload_time = "2025-06-22T16:20:51.302Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fc/e18b8550048d9224426e76906694c60028dbdb65d28b1372b5503914b89d/scipy-1.16.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ae902626972f1bd7e4e86f58fd72322d7f4ec7b0cfc17b15d4b7006efc385176", size = 21246454, upload_time = "2025-06-22T16:20:57.276Z" }, - { url = "https://files.pythonhosted.org/packages/8c/48/07b97d167e0d6a324bfd7484cd0c209cc27338b67e5deadae578cf48e809/scipy-1.16.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:8cb824c1fc75ef29893bc32b3ddd7b11cf9ab13c1127fe26413a05953b8c32ed", size = 23772979, upload_time = "2025-06-22T16:21:03.363Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4f/9efbd3f70baf9582edf271db3002b7882c875ddd37dc97f0f675ad68679f/scipy-1.16.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:de2db7250ff6514366a9709c2cba35cb6d08498e961cba20d7cff98a7ee88938", size = 33341972, upload_time = "2025-06-22T16:21:11.14Z" }, - { url = "https://files.pythonhosted.org/packages/3f/dc/9e496a3c5dbe24e76ee24525155ab7f659c20180bab058ef2c5fa7d9119c/scipy-1.16.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e85800274edf4db8dd2e4e93034f92d1b05c9421220e7ded9988b16976f849c1", size = 35185476, upload_time = "2025-06-22T16:21:19.156Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b3/21001cff985a122ba434c33f2c9d7d1dc3b669827e94f4fc4e1fe8b9dfd8/scipy-1.16.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4f720300a3024c237ace1cb11f9a84c38beb19616ba7c4cdcd771047a10a1706", size = 35570990, upload_time = "2025-06-22T16:21:27.797Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d3/7ba42647d6709251cdf97043d0c107e0317e152fa2f76873b656b509ff55/scipy-1.16.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:aad603e9339ddb676409b104c48a027e9916ce0d2838830691f39552b38a352e", size = 37950262, upload_time = "2025-06-22T16:21:36.976Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c4/231cac7a8385394ebbbb4f1ca662203e9d8c332825ab4f36ffc3ead09a42/scipy-1.16.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f56296fefca67ba605fd74d12f7bd23636267731a72cb3947963e76b8c0a25db", size = 38515076, upload_time = "2025-06-22T16:21:45.694Z" }, -] - -[[package]] -name = "seaborn" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "matplotlib" }, - { name = "numpy" }, - { name = "pandas" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload_time = "2024-01-25T13:21:52.551Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload_time = "2024-01-25T13:21:49.598Z" }, -] - -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, -] - -[[package]] -name = "simpleeval" -version = "1.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, -] - [[package]] name = "six" version = "1.17.0" @@ -2195,15 +1289,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, ] -[[package]] -name = "soupsieve" -version = "2.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, -] - [[package]] name = "stack-data" version = "0.6.3" @@ -2218,60 +1303,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, ] -[[package]] -name = "structlog" -version = "25.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, -] - -[[package]] -name = "tableschema-to-template" -version = "0.0.13" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonschema" }, - { name = "pyyaml" }, - { name = "xlsxwriter" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, -] - -[[package]] -name = "tabulate" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, -] - [[package]] name = "technologydata" source = { editable = "." } dependencies = [ - { name = "frictionless", extra = ["pandas"] }, - { name = "hdx-python-country" }, { name = "ipykernel" }, - { name = "matplotlib" }, { name = "mypy" }, { name = "pandas" }, - { name = "pint" }, { name = "pre-commit" }, - { name = "pydeflate" }, { name = "pytest" }, - { name = "python-calamine" }, + { name = "pytest-cov" }, + { name = "pytest-xdist" }, { name = "requests" }, - { name = "ruff" }, + { name = "reuse" }, { name = "savepagenow" }, - { name = "scipy" }, - { name = "seaborn" }, - { name = "tqdm" }, - { name = "ucumvert" }, ] [package.optional-dependencies] @@ -2287,10 +1332,7 @@ docs = [ [package.metadata] requires-dist = [ - { name = "frictionless", extras = ["pandas"], specifier = ">=5.18.0" }, - { name = "hdx-python-country", specifier = ">=3.9.4" }, { name = "ipykernel", specifier = ">=6.29.5" }, - { name = "matplotlib", specifier = ">=3.10.1" }, { name = "mkdocs-autolinks-plugin", marker = "extra == 'docs'", specifier = ">=0.7.1" }, { name = "mkdocs-git-revision-date-localized-plugin", marker = "extra == 'docs'", specifier = ">=1.4.7" }, { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.6.14" }, @@ -2300,37 +1342,23 @@ requires-dist = [ { name = "mkdocstrings-python", marker = "extra == 'docs'", specifier = ">=1.16.11" }, { name = "mypy", specifier = ">=1.15.0" }, { name = "pandas", specifier = ">=2.2.3" }, - { name = "pint", specifier = ">=0.24.4" }, { name = "pre-commit", specifier = ">=4.2.0" }, - { name = "pydeflate", specifier = ">=2.1.3" }, { name = "pytest", specifier = ">=8.3.5" }, - { name = "python-calamine", specifier = ">=0.3.1" }, + { name = "pytest-cov", specifier = ">=6.2.1" }, + { name = "pytest-xdist", specifier = ">=3.8.0" }, { name = "requests", specifier = ">=2.32.3" }, - { name = "ruff", specifier = ">=0.11.0" }, + { name = "reuse", specifier = ">=5.0.2" }, { name = "savepagenow", specifier = ">=1.3.0" }, - { name = "scipy", specifier = ">=1.15.2" }, - { name = "seaborn", specifier = ">=0.13.2" }, - { name = "tqdm", specifier = ">=4.67.1" }, - { name = "ucumvert", specifier = ">=0.2.1" }, ] provides-extras = ["docs"] [[package]] -name = "tenacity" -version = "9.1.2" +name = "tomlkit" +version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload_time = "2025-06-05T07:13:44.947Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, -] - -[[package]] -name = "text-unidecode" -version = "1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload_time = "2025-06-05T07:13:43.546Z" }, ] [[package]] @@ -2352,18 +1380,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" }, ] -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, -] - [[package]] name = "traitlets" version = "5.14.3" @@ -2373,21 +1389,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, ] -[[package]] -name = "typer" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload_time = "2025-05-26T14:30:31.824Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload_time = "2025-05-26T14:30:30.523Z" }, -] - [[package]] name = "typing-extensions" version = "4.14.1" @@ -2397,18 +1398,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, ] -[[package]] -name = "typing-inspection" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, -] - [[package]] name = "tzdata" version = "2025.2" @@ -2418,28 +1407,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, ] -[[package]] -name = "ucumvert" -version = "0.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lark" }, - { name = "pint" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d1/27/cfeeea46e92d30edd1f8938e7630798e92c2cc8dbb0493a26373d850b3c4/ucumvert-0.2.2.tar.gz", hash = "sha256:f6218839a36b0e74e671f16d1f9f4aa1a2b530527a3c126031515c13273b1343", size = 52281, upload_time = "2025-05-10T22:18:25.204Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/b5/be9107654e04f7bcc16138598f2bccfde20952dfe1115f5289b5a7c5717e/ucumvert-0.2.2-py3-none-any.whl", hash = "sha256:cd5b9e93f9dfc52d4dbe3f4e790d0b426934185823a611fd6898bb4e3d6f4c86", size = 53201, upload_time = "2025-05-10T22:18:23.304Z" }, -] - -[[package]] -name = "unidecode" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, -] - [[package]] name = "urllib3" version = "2.5.0" @@ -2449,15 +1416,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, ] -[[package]] -name = "validators" -version = "0.35.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, -] - [[package]] name = "virtualenv" version = "20.31.2" @@ -2496,20 +1454,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, ] -[[package]] -name = "wbgapi" -version = "1.0.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyyaml" }, - { name = "requests" }, - { name = "tabulate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, -] - [[package]] name = "wcwidth" version = "0.2.13" @@ -2518,66 +1462,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc wheels = [ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, ] - -[[package]] -name = "wheel" -version = "0.45.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, -] - -[[package]] -name = "win32-setctime" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, -] - -[[package]] -name = "xlrd" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, -] - -[[package]] -name = "xlrd3" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, -] - -[[package]] -name = "xlsx2csv" -version = "0.8.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, -] - -[[package]] -name = "xlsxwriter" -version = "3.2.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306, upload_time = "2025-06-17T08:59:14.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347, upload_time = "2025-06-17T08:59:13.453Z" }, -] - -[[package]] -name = "xlwt" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, -] From 3f69fb19c6df9bb0014cc9df3242a500d4dd466f Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:39:23 +0200 Subject: [PATCH 05/81] Unit-ful parameter (#15) * code: Flatten class structure by removing UnitValue * code: add reuse dependency * code: add tests for parameters.py * code: Require carrier for heating_value attribute * code: Add default values for optional attributes * code: Make sources for Parameter optional * code: Implement arithmetic operations on Parameters * code: Add start of custom unit registry and helpers * code: Move test into single file and linting * code: Add tests for extraction from pint.Unit objects * code: Add tests for currency conversion rates * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: Add tests for custom UnitRegistry * code: Rename currency code cache file * code: Dedicated registries for heating values and carriers * code: Add instructions files for GH copilot * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: Fix test using wrong ureg * code: use lru_cache * code: Add function to map from currency code to ISO3 * code: New frozendict dependency * code: remove unused import * code: add debug msgs * code: Fix usage of wrong registry for currency units * code: Ensure canonical names are used for units, carriers, hvs * code: Adjust test for canonical name usage * code: docstrings * doc: improve docstring * code: Disallow currency conversion in unit conversion * code: Name capture groups in regex * code: formatting * code: Fix test for disallowed currency conversion in .to * code: Draft currency conversion method * code: Rename arguments for consistency * code: Fix failing test due to wrong UnitRegistry being used * code: Add missing renames * code: Wait... didn't I already commit this? * code: Fix wrong dtype in function call * code: Fix issue with conversion rates * code: Fix alias for source arguments * code: Raise errors on invalid currency conversion calls * doc: Update docstream with more options * code: Fix tests to comply with new syntax * code: Bugfix wrong logic check in conversion rate function * code: Add dependency for pytest-xdist * code: Fix issue with cache when calling method repeadetly from different uregs * code: Fix mypy errors * code: Adjust ValueError msg for incompatible heating values * code: Add tests for heating value operations * code: Add test for carrier compatabilities * doc: Add draft doc for parameters.py * code: add stub for heating value conversion * code: add equality and power operations on parameters * code: remove decorator for updating pint attributes in favour of direct calls * code: Implement conversion between LHV and HHV * code: Bugfix incompatible carrier in dividing Parameter objects * code: Outsource HHVs and LHVs for energy carriers * doc: Update puml * doc: Add details on change_heating_value(...) function * code: fix wrong heating values in tests * code: Add simple combination logic for provenance/note/sources * code: start to solve mypy annotations * code: new update * code: in between commit * data: update solar_photovoltaics_example_03/technologies.json * data: update technologies.json * data: update example_04 data * code: update to parameter.py * code: remove any reference to UnitValue * code: switch off type checking for UnitRegistry * code: solve mypy comment in units.py * doc: update class-diagram * ci: ai-prototype and unit test fix * code: update parameter eq method * code: docstrings for Parameter methods and example_parameter * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * data: add input parameters.csv for currency_conversion * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code/data: add tests for change_currency * code: add extra check on magnitude * code: update change_currency * code: latest comments --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Fabrizio Finozzi --- .github/instructions/copilot-instructions.md | 43 + .github/workflows/ci.yaml | 4 +- REUSE.toml | 2 +- docs/CLAUDE.md | 26 - docs/class-diagram.puml | 49 +- docs/parameter.md | 137 +++ pyproject.toml | 5 + technologydata/__init__.py | 18 +- technologydata/constants/__init__.py | 12 + technologydata/constants/energy_density.py | 61 ++ technologydata/parameter.py | 652 ++++++++++++- technologydata/source.py | 11 +- technologydata/unit_value.py | 66 -- technologydata/utils/carriers.txt | 29 + technologydata/utils/heating_values.txt | 17 + technologydata/utils/units.py | 409 ++++++++ test/conftest.py | 15 + .../WB_CNY_2020/parameters.csv | 15 + .../WB_EUR_2020/parameters.csv | 15 + .../WB_USD_2020/parameters.csv | 15 + .../technologies.json | 66 +- .../technologies.json | 68 +- test/test_parameter.py | 717 ++++++++++++++ test/test_source.py | 2 +- test/test_units.py | 590 ++++++++++++ uv.lock | 905 ++++++++++++++++++ 26 files changed, 3710 insertions(+), 239 deletions(-) create mode 100644 .github/instructions/copilot-instructions.md delete mode 100644 docs/CLAUDE.md create mode 100644 docs/parameter.md create mode 100644 technologydata/constants/__init__.py create mode 100644 technologydata/constants/energy_density.py delete mode 100644 technologydata/unit_value.py create mode 100644 technologydata/utils/carriers.txt create mode 100644 technologydata/utils/heating_values.txt create mode 100644 technologydata/utils/units.py create mode 100644 test/test_data/currency_conversion/WB_CNY_2020/parameters.csv create mode 100644 test/test_data/currency_conversion/WB_EUR_2020/parameters.csv create mode 100644 test/test_data/currency_conversion/WB_USD_2020/parameters.csv create mode 100644 test/test_parameter.py create mode 100644 test/test_units.py diff --git a/.github/instructions/copilot-instructions.md b/.github/instructions/copilot-instructions.md new file mode 100644 index 00000000..a7a7955a --- /dev/null +++ b/.github/instructions/copilot-instructions.md @@ -0,0 +1,43 @@ + + +# Copilot Coding Agent Instructions for `technologydata` + +## Project Overview +- `technologydata` is a Python package for energy system modellers to screen, harmonize, and transform techno-economic input data for energy system models. +- Major use cases: data validation, harmonization, transformation to model-ready formats, and provenance/audit tracing. +- Core classes: `DataPackage`, `Technology`, `Parameter`, `Source`, and `SourceCollection` (see `technologydata/`). +- Data flows: Input data (JSON or DataFrame) β†’ `DataPackage`/`Technology` objects β†’ validation/transformation β†’ output for modeling/analysis. + +## Key Workflows +- **Install dependencies:** Use `uv` (see `pyproject.toml`, `uv.lock`). Example: `uv sync`. +- **Activate virtual environment:** Use `source .venv/bin/activate` before running commands. +- **Linting/formatting:** Use `ruff` (`ruff check .` and `ruff format .`). +- **Type checking:** Use `mypy`. +- **Testing:** Use `pytest` (tests in `test/`). Fixtures in `test/conftest.py`. Run: `pytest`. +- **Pre-commit hooks:** Set up with `pre-commit` using `.pre-commit-config.yaml`, use this preferably over using `mypy` and `ruff` manually. +- **Docs:** Built with `mkdocs` (see `docs/`). + +## Project-Specific Patterns +- **Validation:** Instantiating `Technology` or `DataPackage` triggers schema validation. Use `.check_consistency()` and `.calculate_parameters()` for further checks and derivations. +- **Parameter Derivation:** Use `.calculate_parameters()` to fill in missing values based on rules. +- **Unit Handling:** Uses `pint` for units and `pydeflate` for currency/inflation adjustments. Custom `UnitRegistry` in `technologydata/utils/units.py`. +- **Data Provenance:** Each `Parameter` and `Technology` tracks its source and transformation history. +- **Data Input:** Prefer JSON conforming to the internal schema. See `test/test_data/` for examples. + +## External Integrations +- `pydeflate` for currency/inflation +- `pint` for units +- `hdx.location.country` for country/currency codes +- `savepagenow` for web archiving + +## References +- Design: `docs/design.md` +- Class diagram: `docs/class-diagram.puml` +- Example data: `test/test_data/` + +--- +If any conventions or workflows are unclear, please ask for clarification or check `docs/design.md` for rationale and details. diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e5c703bb..d177761d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,9 +5,9 @@ name: Technologydata prototype CI on: push: - branches: [prototype] + branches: [ai-prototype] pull_request: - branches: [prototype] + branches: [ai-prototype] jobs: test: diff --git a/REUSE.toml b/REUSE.toml index a6ee5e76..79009ed1 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -10,6 +10,6 @@ SPDX-License-Identifier = "MIT" [[annotations]] -path = ["test/test_data/*/*"] +path = ["test/test_data/*/*", "test/test_data/*/*/*"] SPDX-FileCopyrightText = "The technology-data authors" SPDX-License-Identifier = "CC-BY-4.0" diff --git a/docs/CLAUDE.md b/docs/CLAUDE.md deleted file mode 100644 index 1713f9f3..00000000 --- a/docs/CLAUDE.md +++ /dev/null @@ -1,26 +0,0 @@ - -## General - -* Description of use cases in `docs/design.md` -* Class diagram in `docs/class-diagram.puml` - -## Tools - -* `ruff` for formatting and linting -* `uv` for package management with `pyproject.toml` for configuration and package metadata -* `pytest` for testing all classes and methods - * a `tests/conftest.py` for all the fixtures - * a `tests//input` and `tests//output` for input and output files -* `mypy` for type checking -* `pre-commit` for setting up linting, formatting and checking hooks, configured via `.pre-commit-config.yaml` -* `pydantic` for data validation -* `mkdocs` for documentation generation, configured via `docs/mkdocs.yaml` - -## Packages to depend on - -* `pydeflate` for currency conversions and inflation adjustments -* `pint` for unit conversions -* `savepagenow` for archiving web pages using the Wayback Machine diff --git a/docs/class-diagram.puml b/docs/class-diagram.puml index 3ddba2dd..403c59d3 100644 --- a/docs/class-diagram.puml +++ b/docs/class-diagram.puml @@ -4,16 +4,6 @@ SPDX-License-Identifier: MIT '/ @startuml Class Diagram -class UnitValue { - - value: float - - unit: str -} - -note left of UnitValue::unit - Unit should be able to accommodate any unit of measurement, - currencies+years, LHVs and different energy carriers. - e.g. EUR_2020, kWh_electricity, kWh_hydrogen_LHV -end note class Source { - name: str @@ -26,6 +16,12 @@ class Source { + ensure_in_wayback() + store_in_wayback() + retrieve_from_wayback() + + _get_save_path() + + _get_content_type() + + _download_file() + + __eq__(other) + + __hash__(other) + + __str__(other) } note right of Source::store_in_wayback @@ -38,17 +34,33 @@ note right of Source::retrieve_from_wayback end note class Parameter { - - quantity: UnitValue + - magnitude: float + - units: str + - carrier: str + - heating_value: str - provenance: str - note: str - sources: SourceCollection + - _pint_quantity: pint.Quantity + - _pint_carrier: pint.Unit + - _pint_heating_value: pint.Unit + + + _update_pint_attributes() + + _check_parameter_compatibility() + + change_currency() + + change_heating_value() + + to() + from_dict(): Parameter + + __add__(other: Parameter) + + __sub__(other: Parameter) + + __mul__(other: Parameter) + + __truediv__(other: Parameter) + + __pow__(other: Parameter) + + __eq__(other: Parameter) } -Parameter --> UnitValue : quantity - note right of Parameter - Encapsulates a value, its unit (via UnitValue, as quantity), + Encapsulates a value, its unit, data provenance (via sources). end note @@ -73,6 +85,8 @@ class Technology { - output-hydrogen: Parameter - output-electricity: Parameter + + __getitem__() + + __setitem__() + from_dict(): Technology + adjust_currency(): Technology // or inplace + adjust_region(): Technology // or inplace @@ -80,6 +94,7 @@ class Technology { + calculate_EAC(): Parameter // or inplace + calculate_efficiency(): Parameter // or inplace + calculate_specific_investment(): Parameter // or inplace + + check_consistency() } note right of Technology::inputs @@ -124,6 +139,8 @@ class TechnologyCollection { + to_dataframe(): pd.DataFrame + from_json(): TechnologyCollection + create_projection(): TechnologyCollection + + __iter__() + + __len__() ' TODO: Think about more methods here } @@ -149,6 +166,10 @@ class SourceCollection { + to_csv() + to_dataframe() + from_json() + + __iter__() + + __len__() + + __str__() + + get() } note left of SourceCollection::retrieve_all_from_wayback diff --git a/docs/parameter.md b/docs/parameter.md new file mode 100644 index 00000000..38ae2a9e --- /dev/null +++ b/docs/parameter.md @@ -0,0 +1,137 @@ + + +# `Parameter` Class Documentation + +## Overview + +The `Parameter` class in `technologydata` encapsulates a value, its unit, provenance, notes, sources, and additional attributes required to describe technology parameters, such as carrier and heating value. It is designed for use in energy system modeling workflows, supporting unit handling, currency/inflation adjustments, and provenance tracking. + +## Features + +- **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). +- **Currency Unit Convention**: Currency units must follow the pattern `XYZ_YYYY`, where `XYZ` is the 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code (e.g., `USD`, `EUR`, `CNY`) and `YYYY` is the 4-digit year (e.g., `USD_2020`). This allows for both currency and inflation adjustment. +- **Carrier and Heating Value**: Optionally specify an energy carrier (e.g., `H2`) and a heating value type (`LHV` or `HHV`). +- **Provenance and Notes**: Track the origin of the data and any additional notes. +- **Sources**: Attach a `SourceCollection` of references for traceability. +- **Unit Conversion**: Convert between compatible units (excluding currency conversion) using `.to()`. +- **Currency/Inflation Adjustment**: Convert between currencies and adjust for inflation using `.change_currency()`. +- **Arithmetic Operations**: Supports addition, subtraction, multiplication, and division with other `Parameter` objects, with compatibility checks for carrier and heating value. **Note:** Some operations will fail if heating values or carriers are incompatible, raising a `ValueError`. + +## Usage Examples + +### Creating a Parameter + +```python +from technologydata.parameter import Parameter +from technologydata.source import Source +from technologydata.source_collection import SourceCollection + +param = Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="Directly extracted from literature", + note="Estimated", + sources=SourceCollection(sources=[ + Source(name="Example Source", authors="some authors", title="Example Title") + ]), +) + +>>> param +Parameter(magnitude=1000.0, units='USD_2020/kW', carrier='H2', heating_value='LHV', provenance='literature', note='Estimated', sources=SourceCollection(sources=[Source(name='Example Source', authors='some authors', title='Example Title')])) +``` + +### Unit Conversion (excluding currency) + +```python +converted = param.to("USD_2020 / megawatt") +>>> print(converted.magnitude, converted.units) +1000000.0 USD_2020 / megawatt +``` + +### Currency and Inflation Adjustment + +```python +# Convert to EUR_2023 with inflation adjustment for Germany, using World Bank data +euro_param = param.change_currency("EUR_2023", "DEU", source="worldbank") +>>> print(euro_param.magnitude, euro_param.units) +950.0 EUR_2023 / kilowatt +``` + +### Arithmetic Operations + +```python +param2 = Parameter(magnitude=500, units="USD_2020/kW", carrier="H2", heating_value="LHV") +sum_param = param + param2 +>>> print(sum_param.magnitude, sum_param.units) +1500.0 USD_2020 / kilowatt +``` + +**Note:** If you try to add or subtract parameters with different carriers or heating values, a `ValueError` will be raised: + +```python +param_hhv = Parameter(magnitude=1, units="USD_2020/kW", carrier="H2", heating_value="HHV") +param + param_hhv +>>> # ValueError: Cannot add parameters with different heating values +``` + +## Notes on Currency Conversion and pydeflate + +- **pydeflate Integration**: Currency and inflation adjustments are performed using the `pydeflate` package. This package uses data from either the World Bank or the International Monetary Fund. In order to use `pydeflate` with currency codes, we make some opinioated assumptions about the mapping from currency codes to countries which should in most cases be correct, but may not always be accurate for all currencies or years. +- **Country Mapping**: To see which country was used for a given currency code during conversion, inspect the mapping in `pydeflate` or use the helper functions in `technologydata.utils.units` (e.g., `get_iso3_from_currency_code`). The country code you provide to `.change_currency()` determines the inflation adjustment, but the mapping from currency code to country is handled internally by pydeflate and may be checked in its documentation or by printing the mapping used in your environment. +- **Data availability**: Since we use World Bank or IMF data, the availability of currency conversion data may vary by year and currency, depending on the most recent publication. World Bank data is based on the [World Bank DataBank](https://databank.worldbank.org/home.aspx) and IMF data is based on the [World Economic Outlook](https://www.imf.org/en/Publications/WEO). If IMF data is used, this means that also short-term projections can be accessed, usually e.g. GDP deflators for up to 2 years into the future. +- **Updating Data**: If `pydeflate` notices that data is older than 50 days, it will display a warning. It will also periodically try to update the data automatically. More information on how to configure the update behaviour and caching locations for `pydeflate` are available in their [documentation](https://github.com/jm-rivera/pydeflate). + +## Handling different heating values + +Each `Parameter` can have a `heating_value` attribute, which can be either `LHV` (or allowed aliases like `lower_heating_value`, 'NCV', 'net_calorific_value') or `HHV` (or allowed aliases like `higher_heating_value`, 'GCV', 'gross_calorific_value'). +This attribute indicates the basis on which the energy content of the parameter is defined. +In operations between `Parameter` objects, the heating value is checked. +Only parameters with the same heating value can be used in arithmetic operations. + +The heating value can be changed using the `change_heating_value` method, which uses the `carrier` attribute of the `Parameter` to determine the conversion factor between LHV and HHV based on their energy densities. + +- **Supported Carriers:** The method currently supports conversion for common carriers such as hydrogen and methane. For any other carrier that is not implemented, a ratio of 1 is assumed. +- **Changing Heating Value +- **Adding Carriers:** New carriers can be added programmatically by extending the `EnergyDensityLHV` and `EnergyDensityHHV` dictionaries in the `technologydata.constants`. The LHV/HHV ratio is calculated based on these two dictionaries, so any new carrier must have both LHV and HHV energy densities defined. In addition the carrier name must be a valid dimensionality defined in `technologydata.utils.units.creg`. + +### Example: Converting Between LHV and HHV + +```python +from technologydata.parameter import Parameter + +# Create a parameter on LHV basis +param_lhv = Parameter(magnitude=33.33, units="kWh/kg", carrier="hydrogen", heating_value="LHV") +>>> print(param_lhv.magnitude, param_lhv.units, param_lhv.heating_value) +33.33 kWh/kg lower_heating_value + +# Convert to HHV basis +param_hhv = param_lhv.change_heating_value("HHV") +>>> print(param_hhv.magnitude, param_hhv.units, param_hhv.heating_value) +39.51 kWh/kg higher_heating_value + +# Convert back to LHV +param_lhv2 = param_hhv.change_heating_value("LHV") +>>> print(param_lhv2.magnitude, param_lhv2.units, param_lhv2.heating_value) +33.33 kWh/kg lower_heating_value + +# On mixed carriers +param_mixed = Parameter(magnitude=1/9, units="kWh/kg", carrier="hydrogen / water", heating_value="LHV") +param_mixed_hhv = param_mixed.change_heating_value("HHV") +>>> print(param_mixed_hhv.magnitude, param_mixed_hhv.units, param_mixed_hhv.heating_value) +0.13 kWh/kg higher_heating_value +``` + + +## Limitations & Missing Features + +- **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, the handling and merging of `provenance`, `note`, and `sources` is not yet implemented (see `TODO` comments in the code). +- **Unit Conversion**: The `.to()` method does not support currency conversion; use `.change_currency()` for that. +- **Partial Unit Compatibility**: Only certain combinations of units, carriers, and heating values are supported for arithmetic operations. +- **No Uncertainty Handling**: There is currently no support for uncertainty or error propagation. +- **No Serialization/Deserialization**: Direct methods for exporting/importing to/from JSON or DataFrame are not implemented in this class. diff --git a/pyproject.toml b/pyproject.toml index b6b18868..18199008 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,10 +27,15 @@ classifiers=[ ] requires-python = ">=3.12" dependencies = [ + "frozendict>=2.4.6", + "hdx-python-country>=3.9.6", "ipykernel>=6.29.5", # this one can go into optional as "dev" "mypy>=1.15.0", "pandas>=2.2.3", + "pint>=0.24.4", "pre-commit>=4.2.0", # this one can go into optional as "dev" + "pydantic>=2.11.7", + "pydeflate>=2.1.3", # this one can go into optional as "dev" "pytest>=8.3.5", # this one can go into optional as "dev" "pytest-cov>=6.2.1", # this one can go into optional as "dev" "pytest-xdist>=3.8.0", # this one can go into optional as "dev" diff --git a/technologydata/__init__.py b/technologydata/__init__.py index 20b78e28..1e2962ef 100644 --- a/technologydata/__init__.py +++ b/technologydata/__init__.py @@ -9,8 +9,16 @@ from technologydata.source_collection import SourceCollection from technologydata.technology import Technology from technologydata.technology_collection import TechnologyCollection -from technologydata.unit_value import UnitValue from technologydata.utils.commons import Commons, DateFormatEnum, FileExtensionEnum +from technologydata.utils.units import ( + CURRENCY_UNIT_PATTERN, + creg, + extract_currency_units, + get_conversion_rate, + get_iso3_from_currency_code, + hvreg, + ureg, +) __all__ = [ "Commons", @@ -22,5 +30,11 @@ "SourceCollection", "Technology", "TechnologyCollection", - "UnitValue", + "CURRENCY_UNIT_PATTERN", + "creg", + "extract_currency_units", + "get_conversion_rate", + "get_iso3_from_currency_code", + "hvreg", + "ureg", ] diff --git a/technologydata/constants/__init__.py b/technologydata/constants/__init__.py new file mode 100644 index 00000000..3c2b6ca2 --- /dev/null +++ b/technologydata/constants/__init__.py @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Provide classes and utilities for handling techno-economic data for energy system modeling.""" + +from technologydata.constants.energy_density import EnergyDensityHHV, EnergyDensityLHV + +__all__ = [ + "EnergyDensityHHV", + "EnergyDensityLHV", +] diff --git a/technologydata/constants/energy_density.py b/technologydata/constants/energy_density.py new file mode 100644 index 00000000..2c98b246 --- /dev/null +++ b/technologydata/constants/energy_density.py @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +""" +Energy density parameters for various carriers. + +This module defines dictionaries containing energy density parameters +for different fuel carriers, specifically focusing on lower heating value (LHV) +and higher heating value (HHV). Each entry maps a carrier name to a `Parameter` +object that includes magnitude, unit, and carrier type. + +Attributes +---------- +EnergyDensityLHV : dict[str, Parameter] + Dictionary mapping carrier names to their lower heating value (LHV) + parameters. + - Key: carrier name (e.g., 'hydrogen', 'methane') + - Value: Parameter object with magnitude, unit, and carrier info. + +EnergyDensityHHV : dict[str, Parameter] + Dictionary mapping carrier names to their higher heating value (HHV) + parameters. + - Key: carrier name (e.g., 'hydrogen', 'methane') + - Value: Parameter object with magnitude, unit, and carrier info. + +""" + +from technologydata import Parameter + +EnergyDensityLHV: dict[str, Parameter] = dict( + hydrogen=Parameter( + magnitude=119.6, + unit="GJ/t", + carrier="hydrogen", + # source= # TODO + ), + methane=Parameter( + magnitude=50.0, + unit="GJ/t", + carrier="methane", + # source= # TODO + ), + # Add more energy densities as needed +) + +EnergyDensityHHV: dict[str, Parameter] = dict( + hydrogen=Parameter( + magnitude=141.8, + unit="GJ/t", + carrier="hydrogen", + # source= # TODO + ), + methane=Parameter( + magnitude=55.5, + unit="GJ/t", + carrier="methane", + # source= # TODO + ), + # Add more energy densities as needed +) diff --git a/technologydata/parameter.py b/technologydata/parameter.py index feb4483a..82a747ce 100644 --- a/technologydata/parameter.py +++ b/technologydata/parameter.py @@ -7,78 +7,648 @@ Examples -------- ->>> from technologydata.unit_value import UnitValue >>> from technologydata.source import Source ->>> uv = UnitValue(value=1000, unit="EUR_2020/kW") +>>> uv = pint.Quantity(1000, "EUR_2020/kW") >>> src = Source(name="Example Source", authors="some authors", url="http://example.com") >>> param = Parameter(quantity=uv, provenance="literature", note="Estimated", sources=[src]) """ +import logging import typing +from typing import Annotated -import pydantic +import pint +from pydantic import BaseModel, Field, PrivateAttr +import technologydata from technologydata.source_collection import SourceCollection -from technologydata.unit_value import UnitValue +# from technologydata.utils.units import ( +# CURRENCY_UNIT_PATTERN, +# creg, +# extract_currency_units, +# get_conversion_rate, +# get_iso3_from_currency_code, +# hvreg, +# ureg, +# ) -# TODO rework class logic -class Parameter(pydantic.BaseModel): # type: ignore +logger = logging.getLogger(__name__) + + +class Parameter(BaseModel): # type: ignore """ - Encapsulate a value with its unit, provenance, notes, and sources. + Encapsulate a value with its unit, provenance, notes, sources, and more optional attributes required to describe technology parameters, like carrier, and heating value. Attributes ---------- - quantity : UnitValue - The value and its unit. + magnitude : float + The numerical value of the parameter. + units : Optional[str] + The unit of the parameter. + carrier : Optional[str] + The energy carrier. + heating_value : Optional[str] + The heating value type. provenance : Optional[str] Description of the data's provenance. note : Optional[str] Additional notes about the parameter. - sources : SourceCollection + sources : Optional[SourceCollection] List of sources for the parameter. """ - quantity: typing.Annotated[ - UnitValue, pydantic.Field(description="The value and its unit.") + magnitude: Annotated[ + float, Field(description="The numerical value of the parameter.") ] - provenance: typing.Annotated[ - str | None, pydantic.Field(description="Data provenance.") + units: Annotated[str | None, Field(description="The unit of the parameter.")] = None + carrier: Annotated[ + str | None, + Field(description="Carriers of the units, e.g. 'H2', 'el', 'H2O'."), ] = None - note: typing.Annotated[ - str | None, pydantic.Field(description="Additional notes.") + heating_value: Annotated[ + str | None, + Field(description="Heating value type for energy carriers ('LHV' or 'HHV')."), ] = None - sources: typing.Annotated[ - SourceCollection, pydantic.Field(description="Collection of Sources.") - ] + provenance: Annotated[str | None, Field(description="The data's provenance.")] = ( + None + ) + note: Annotated[str | None, Field(description="Additional notes.")] = None + sources: Annotated[ + SourceCollection, + Field(description="List of sources for this parameter."), + ] = SourceCollection(sources=[]) - @property - def value(self) -> float: + # Private attributes for derived pint objects + _pint_quantity: pint.Quantity = PrivateAttr(None) + _pint_carrier: pint.Unit = PrivateAttr(None) + _pint_heating_value: pint.Unit = PrivateAttr(None) + + def __init__(self, **data: float | str | SourceCollection | None) -> None: + """Initialize Parameter and update pint attributes.""" + # pint uses canonical names for units, carriers, and heating values + # Ensure the Parameter object is always created with these consistent names from pint + if "units" in data and data["units"] is not None: + technologydata.ureg.ensure_currency_is_unit(str(data["units"])) + data["units"] = str(technologydata.ureg.Unit(data["units"])) + if "carrier" in data and data["carrier"] is not None: + data["carrier"] = str(technologydata.creg.Unit(data["carrier"])) + if "heating_value" in data and data["heating_value"] is not None: + data["heating_value"] = str( + technologydata.hvreg.Unit(data["heating_value"]) + ) + + super().__init__(**data) + self._update_pint_attributes() + + def _update_pint_attributes(self) -> None: """ - The numerical value of the parameter. + Update internal pint attributes based on current object fields. + + This method initializes or updates the following attributes: + - `_pint_quantity`: a pint Quantity created from `magnitude` and `units`. + - `_pint_carrier`: a pint Unit created from `carrier`. + - `_pint_heating_value`: a pint Unit created from `heating_value`, if applicable. + + Notes + ----- + - Ensures that `units` are valid, especially for currency units. + - Raises a ValueError if `heating_value` is set without a valid `carrier`. + + """ + # Create a pint quantity from magnitude and units + if self.units: + # `units` may contain an undefined currency unit - ensure the ureg can handle it + technologydata.ureg.ensure_currency_is_unit(self.units) + + self._pint_quantity = technologydata.ureg.Quantity( + self.magnitude, self.units + ) + else: + self._pint_quantity = technologydata.ureg.Quantity(self.magnitude) + # Create the carrier as pint unit + if self.carrier: + self._pint_carrier = technologydata.creg.Unit(self.carrier) + else: + self._pint_carrier = None + + # Create the heating value as pint unit + if self.heating_value and self.carrier: + self._pint_heating_value = technologydata.hvreg.Unit(self.heating_value) + elif self.heating_value and not self.carrier: + raise ValueError( + "Heating value cannot be set without a carrier. Please provide a valid carrier." + ) + else: + self._pint_heating_value = None + + def to(self, units: str) -> "Parameter": + """Convert the parameter's quantity to new units.""" + self._update_pint_attributes() + + # Do not allow for currency conversion here, as it requires additional information + if technologydata.extract_currency_units( + self._pint_quantity.units + ) != technologydata.extract_currency_units(units): + raise NotImplementedError( + "Currency conversion is not supported in the `to` method. " + "Use `change_currency` for currency conversions." + ) + + self._pint_quantity = self._pint_quantity.to(units) + return Parameter( + magnitude=self._pint_quantity.magnitude, + units=str(self._pint_quantity.units), + carrier=self.carrier, + heating_value=self.heating_value, + provenance=self.provenance, + note=self.note, + sources=self.sources, + ) + + def change_currency( + self, to_currency: str, country: str, source: str = "worldbank" + ) -> "Parameter": + """ + Change the currency of the parameter. + + This allows for conversion to a different currency as well as for inflation adjustments. + To properly adjust for inflation, the function requires the `country` for which the inflation + adjustment should be applied for. + + Note that this will harmonise all currencies used in the parameter's units, + i.e. if the parameter `units` contains multiple different currencies, + all of them will be converted to the target currency. + + Parameters + ---------- + to_currency : str + The target currency unit to convert to, e.g. "USD_2020", "EUR_2024", "CNY_2022". + country : str + The country for which the inflation adjustment should be made for. + Must be the official ISO 3166-1 alpha-3 country code, e.g. "USA", "DEU", "CHN". + source : str, optional + The source of the inflation data, either "worldbank"/"wb" or "international_monetary_fund"/"imf". + Defaults to "worldbank". + Depending on the source, different years to adjust for inflation may be available. + + Returns + ------- + Parameter + A new Parameter object with the converted currency. + + Examples + -------- + >>> param.change_currency("USD_2024", "USA") + >>> param.change_currency("EUR_2020", "DEU", source="imf") + >>> param.change_currency("EUR_2023", "USA", source="worldbank") + + """ + self._update_pint_attributes() + + # Ensure the target currency is a valid unit + technologydata.ureg.ensure_currency_is_unit(to_currency) + + # Current unit and currency/currencies + from_units = self._pint_quantity.units + from_currencies = technologydata.extract_currency_units(from_units) + # Replace all currency units in the from_units with the target currency + to_units = technologydata.CURRENCY_UNIT_PATTERN.sub( + to_currency, str(from_units) + ) + + # Create a temporary context to which we add the conversion rates + # We use a temporary context to avoid polluting the global unit registry + # with potentially invalid or incomplete conversion rates that do not + # match the `country` and `source` parameters. + context = technologydata.ureg.Context() + + # Conversion rates are all relative to the reference currency + ref_currency = technologydata.ureg.get_reference_currency() + ref_currency_p = technologydata.CURRENCY_UNIT_PATTERN.match(ref_currency) + if ref_currency_p: + ref_iso3 = technologydata.get_iso3_from_currency_code( + ref_currency_p.group("cu_iso3") + ) + ref_year = ref_currency_p.group("year") + else: + raise ValueError( + f"Reference currency '{ref_currency}' does not match expected pattern." + ) + + # Get conversion rates for all involved currencies + currencies = set(from_currencies).union({to_currency}) + # Avoid recursion error in pint definition by re-adding the reference currency + currencies = currencies - {ref_currency} + + for currency in currencies: + from_currency_p = technologydata.CURRENCY_UNIT_PATTERN.match(currency) + if from_currency_p: + from_iso3 = technologydata.get_iso3_from_currency_code( + from_currency_p.group("cu_iso3") + ) + from_year = from_currency_p.group("year") + else: + raise ValueError( + f"Currency '{currency}' does not match expected pattern." + ) + + conversion_rate = technologydata.get_conversion_rate( + from_iso3=from_iso3, + from_year=from_year, + to_iso3=ref_iso3, + to_year=int(ref_year), + country=country, + source=source, + ) + + context.redefine(f"{currency} = {conversion_rate} * {ref_currency}") + + # Actual conversion using pint + quantity = self._pint_quantity.to(to_units, context) + + return Parameter( + magnitude=quantity.magnitude, + units=str(quantity.units), + carrier=self.carrier, + heating_value=self.heating_value, + provenance=self.provenance, + note=self.note, + sources=self.sources, + ) + + def change_heating_value(self, to_heating_value: str) -> "Parameter": + """ + Change the heating value of the parameter. + + This converts the parameter's heating value to another heating value, + e.g. from "LHV" to "HHV", by taking into account the parameter's carrier. + + Parameters + ---------- + to_heating_value : str + The target heating value to convert to, e.g. "LHV", "HHV". Returns ------- - float - The value. + Parameter + A new Parameter object with the converted heating value. + + Raises + ------ + ValueError + If the current parameter does not have a carrier or a heating value set, + + Examples + -------- + >>> Parameter(magnitude=1, units="kWh", carrier="H2", heating_value="LHV").change_heating_value("HHV") + """ - return self.quantity.value + if not self.carrier: + raise ValueError( + "Cannot change heating value without a carrier. Please provide a valid carrier." + ) + if not self.heating_value: + raise ValueError( + "Cannot change heating value without a current heating value. " + "Please provide a valid heating value." + ) + if to_heating_value == self.heating_value: + # No change needed, return the same parameter + return self + + self._update_pint_attributes() + + from technologydata.constants import EnergyDensityHHV, EnergyDensityLHV + + # Create a dictionary of heating value ratios based on energy densities + hv_ratios = dict() + lhvs = { + str(technologydata.creg.get_dimensionality(k)): v + for k, v in EnergyDensityLHV.items() + } + hhvs = { + str(technologydata.creg.get_dimensionality(k)): v + for k, v in EnergyDensityHHV.items() + } + for dimension in self._pint_carrier.dimensionality.keys(): + if dimension in lhvs and dimension in hhvs: + hv_ratios[dimension] = ( + hhvs[dimension].magnitude / lhvs[dimension].magnitude + ) + else: + logger.error( + f"No heating values found for '{dimension}' in EnergyDensityLHV or EnergyDensityHHV. " + f"Assuming a ratio of 1." + ) + hv_ratios[dimension] = 1.0 + + # When converting from HHV -> LHV, we need to multiply by the ratios + # When converting from LHV -> HHV, we need to divide by the ratios + # We modify the hv_ratios dictionary to match the conversion direction + if technologydata.hvreg.Unit(to_heating_value).is_compatible_with("HHV"): + hv_ratios = hv_ratios + elif technologydata.hvreg.Unit(to_heating_value).is_compatible_with("LHV"): + hv_ratios = {k: 1 / v for k, v in hv_ratios.items()} + + multiplier = 1 + for dim, exponent in self._pint_carrier.dimensionality.items(): + if dim not in hv_ratios: + raise NotImplementedError( + f"Heating value conversion not implemented for carrier dimension '{dim}'." + ) + # Adjust the hv_ratios for the exponent of the carrier + multiplier *= hv_ratios[dim] ** exponent - @property - def unit(self) -> str: + return Parameter( + magnitude=self.magnitude * multiplier, + units=self.units, + carrier=self.carrier, + heating_value=to_heating_value, + provenance=self.provenance, # TODO implement for this function + note=self.note, + sources=self.sources, + ) + + def _check_parameter_compatibility(self, other: "Parameter") -> None: """ - The unit of the parameter. + Check if two parameters are compatible in terms of units, carrier, and heating value. + + Parameters + ---------- + other : Parameter + The other Parameter instance to compare against. + + Raises + ------ + ValueError + If the carriers or heating values of the two parameters are not compatible. + The error message specifies which attribute differs. + + """ + if self._pint_carrier != other._pint_carrier: + raise ValueError( + f"Operation not permitted on parameters with different carriers: " + f"'{self._pint_carrier}' and '{other._pint_carrier}'." + ) + if self._pint_heating_value != other._pint_heating_value: + raise ValueError( + f"Operation not permitted on parameters with different heating values: " + f"'{self._pint_heating_value}' and '{other._pint_heating_value}'." + ) + + def __add__(self, other: "Parameter") -> "Parameter": + """ + Add this Parameter to another Parameter. + + Parameters + ---------- + other : Parameter + The Parameter instance to add. + + Returns + ------- + Parameter + A new Parameter instance representing the sum of the two parameters. + + Notes + ----- + This method checks for parameter compatibility before performing the addition. + The resulting Parameter retains the carrier, heating value, and combines provenance, + notes, and sources from both operands. + + """ + self._check_parameter_compatibility(other) + new_quantity = self._pint_quantity + other._pint_quantity + return Parameter( + magnitude=new_quantity.magnitude, + units=new_quantity.units, + carrier=self.carrier, + heating_value=self.heating_value, + provenance=(self.provenance or "") + + (other.provenance or ""), # TODO make nicer + note=(self.note or "") + (other.note or ""), # TODO make nicer + sources=SourceCollection( + sources=(self.sources.sources + other.sources.sources) + ), + ) + + def __sub__(self, other: "Parameter") -> "Parameter": + """ + Subtract another Parameter from this Parameter. + + Parameters + ---------- + other : Parameter + The Parameter instance to subtract. + + Returns + ------- + Parameter + A new Parameter instance representing the result of the subtraction. + + Notes + ----- + This method checks for parameter compatibility before performing the subtraction. + The resulting Parameter retains the carrier, heating value, and combines provenance, notes, and sources. + + """ + self._check_parameter_compatibility(other) + new_quantity = self._pint_quantity - other._pint_quantity + return Parameter( + magnitude=new_quantity.magnitude, + units=str(new_quantity.units), + carrier=self.carrier, + heating_value=self.heating_value, + provenance=(self.provenance or "") + + (other.provenance or ""), # TODO make nicer + note=(self.note or "") + (other.note or ""), # TODO make nicer + sources=SourceCollection( + sources=(self.sources.sources + other.sources.sources) + ), + ) + + def __truediv__(self, other: "Parameter") -> "Parameter": + """ + Divide this Parameter by another Parameter. + + Parameters + ---------- + other : Parameter + The Parameter instance to divide by. + + Returns + ------- + Parameter + A new Parameter instance representing the division result. + + Raises + ------ + ValueError + If the heating values of the two parameters are different. + + Notes + ----- + The method divides the quantities of the parameters and constructs a new Parameter. + It also handles the division of carriers and heating values if present. + + """ + # We don't check general compatibility here, as division is not a common operation for parameters. + # Only ensure that the heating values are compatible. + if self._pint_heating_value != other._pint_heating_value: + raise ValueError( + f"Cannot divide parameters with different heating values: " + f"{self._pint_heating_value} and {other._pint_heating_value}." + ) + + new_quantity = self._pint_quantity / other._pint_quantity + new_carrier = ( + self._pint_carrier / other._pint_carrier + if self._pint_carrier and other._pint_carrier + else None + ) + new_heating_value = ( + self._pint_heating_value / other._pint_heating_value + if self._pint_heating_value and other._pint_heating_value + else None + ) + + return Parameter( + magnitude=new_quantity.magnitude, + units=str(new_quantity.units), + carrier=new_carrier, + heating_value=new_heating_value, + provenance=(self.provenance or "") + + (other.provenance or ""), # TODO make nicer + note=(self.note or "") + (other.note or ""), # TODO make nicer + sources=SourceCollection( + sources=(self.sources.sources + other.sources.sources) + ), + ) + + def __mul__(self, other: "Parameter") -> "Parameter": + """ + Multiply two Parameter instances. + + Parameters + ---------- + other : Parameter + The other Parameter instance to multiply with. Returns ------- - str - The unit. + Parameter + A new Parameter instance representing the product of the two parameters. + + Raises + ------ + ValueError + If the heating values of the two parameters are not compatible (i.e., not equal). + + Notes + ----- + - Multiplication is only performed if the heating values are compatible. + - The method multiplies the underlying quantities and carriers (if present). + - The heating value of the resulting parameter is the product of the input heating values. + - Provenance, notes, and sources are combined from both parameters. + - Compatibility checks beyond heating values are not performed. + + """ + # We don't check general compatibility here, as multiplication is not a common operation for parameters. + # Only ensure that the heating values are compatible. + if self._pint_heating_value != other._pint_heating_value: + raise ValueError( + f"Cannot multiply parameters with different heating values: " + f"{self._pint_heating_value} and {other._pint_heating_value}." + ) + + new_quantity = self._pint_quantity * other._pint_quantity + new_carrier = ( + self._pint_carrier * other._pint_carrier + if self._pint_carrier and other._pint_carrier + else None + ) + + new_heating_value = self._pint_heating_value * other._pint_heating_value + return Parameter( + magnitude=new_quantity.magnitude, + units=str(new_quantity.units), + carrier=str(new_carrier), + heating_value=str(new_heating_value), + provenance=(self.provenance or "") + + (other.provenance or ""), # TODO make nicer + note=(self.note or "") + (other.note or ""), # TODO make nicer + sources=SourceCollection( + sources=(self.sources.sources + other.sources.sources) + ), + ) + def __eq__(self, other: object) -> bool: """ - return self.quantity.unit + Check for equality with another Parameter object. + + Compares all attributes of the current instance with those of the other object. + + Parameters + ---------- + other : object + The object to compare with. Expected to be an instance of Parameter. + + Returns + ------- + bool + True if all attributes are equal between self and other, False otherwise. + Returns False if other is not a Parameter instance. + + """ + if not isinstance(other, Parameter): + return NotImplemented + + self._update_pint_attributes() + other._update_pint_attributes() + + for field in self.__class__.model_fields.keys(): + value_self = getattr(self, field) + value_other = getattr(other, field) + if value_self != value_other: + return False + return True + + def __pow__(self, exponent: float | int) -> "Parameter": + """ + Raise the parameter's value to a specified power. + + Parameters + ---------- + exponent : float or int + The exponent to raise the parameter's value to. + + Returns + ------- + Parameter + A new Parameter instance with the value raised to the specified power. + + Notes + ----- + This method updates the internal pint attributes before applying the power operation. + If the parameter has a carrier, it is also raised to the specified power. + + """ + self._update_pint_attributes() + + new_quantity = self._pint_quantity**exponent + return Parameter( + magnitude=new_quantity.magnitude, + units=str(new_quantity.units), + carrier=self._pint_carrier**exponent if self._pint_carrier else None, + heating_value=self.heating_value, + provenance=self.provenance, + note=self.note, + sources=self.sources, + ) @classmethod def from_dict(cls, data: dict[str, typing.Any]) -> "Parameter": @@ -90,29 +660,33 @@ def from_dict(cls, data: dict[str, typing.Any]) -> "Parameter": cls : type The class to instantiate. data : dict - A dictionary containing the data to initialize the class instance. - Expected keys include: - - "quantity" (dict): A dictionary representing a UnitValue, parsed via `UnitValue.parse_obj()`. - - "provenance" (str or None): Optional provenance information. - - "note" (str or None): Optional notes. + A dictionary containing the data to initialize the class instance. Expected keys include: + - "magnitude" + - "units" + - "carrier" + - "heating_value" + - "provenance" + - "note" - "sources" (list): A list of source data dictionaries, to be converted into a SourceCollection. Returns ------- - instance : cls + Parameter An instance of the class initialized with the provided data. Notes ----- This method converts the "sources" list into a `SourceCollection` using `SourceCollection.from_json()`. - The "quantity" field is parsed into a `UnitValue` object using `UnitValue.parse_obj()`. """ # Convert sources list into SourceCollection sources_data = data.get("sources", []) sources = SourceCollection.from_json(from_str=sources_data) return cls( - quantity=UnitValue.model_validate(data["quantity"]), + magnitude=data.get("magnitude"), + units=data.get("units"), + carrier=data.get("carrier"), + heating_value=data.get("heating_value"), provenance=data.get("provenance"), note=data.get("note"), sources=sources, diff --git a/technologydata/source.py b/technologydata/source.py index 7bb369a0..03911d41 100644 --- a/technologydata/source.py +++ b/technologydata/source.py @@ -64,10 +64,9 @@ class Source(pydantic.BaseModel): # type: ignore def __eq__(self, other: object) -> bool: """ - Check for equality with another Source object based on non-None attributes. + Check for equality with another Source object. Compares all attributes of the current instance with those of the other object. - Only compares attributes that are not None in both instances. Parameters ---------- @@ -80,12 +79,10 @@ def __eq__(self, other: object) -> bool: True if all non-None attributes are equal between self and other, False otherwise. Returns False if other is not a Source instance. - Notes - ----- - This method considers only attributes that are not None in both objects. - If an attribute is None in either object, it is ignored in the comparison. - """ + if not isinstance(other, Source): + return NotImplemented + if not isinstance(other, Source): logger.error("The object is not a Source instance.") return False diff --git a/technologydata/unit_value.py b/technologydata/unit_value.py deleted file mode 100644 index a354a343..00000000 --- a/technologydata/unit_value.py +++ /dev/null @@ -1,66 +0,0 @@ -# SPDX-FileCopyrightText: The technology-data authors -# -# SPDX-License-Identifier: MIT -# TODO implement (Johannes) -""" -UnitValue class for representing a value with an associated unit. - -This class is designed to support flexible units, including energy carriers, currencies with years, and more. - -Examples --------- ->>> uv = UnitValue(value=100, unit="EUR_2020") ->>> uv.value -100 ->>> uv.unit -"EUR_2020" - -""" - -import typing - -import pint -import pydantic - -ureg = pint.UnitRegistry() - - -class UnitValue(pydantic.BaseModel): # type: ignore - """ - Represent a numerical value with an associated unit of measurement. - - Attributes - ---------- - value : float - The numerical value. - unit : str - The unit of measurement. - - """ - - value: typing.Annotated[float, pydantic.Field(description="The numerical value.")] - unit: typing.Annotated[str, pydantic.Field(description="The unit of measurement.")] - - def to(self, new_unit: str) -> "UnitValue": - """ - Convert the value to a new unit using pint. - - Parameters - ---------- - new_unit : str - The unit to convert to. - - Returns - ------- - UnitValue - A new UnitValue instance with the converted value and unit. - - Raises - ------ - pint.errors.DimensionalityError - If the units are not compatible. - - """ - q = self.value * ureg(self.unit) - q_converted = q.to(new_unit) - return UnitValue(value=q_converted.magnitude, unit=str(q_converted.units)) diff --git a/technologydata/utils/carriers.txt b/technologydata/utils/carriers.txt new file mode 100644 index 00000000..62c526e7 --- /dev/null +++ b/technologydata/utils/carriers.txt @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +# Definitions for the default carriers supported by the package. +# Each carrier is defined as an independent dimension. +# This way, pint allows for operations like division or multiplication, +# and at the same time prevents incompatible operations on these dimensions. +# +# See also: https://pint.readthedocs.io/en/latest/defining.html + + +# Format: +# = [] [= ] + +carbon = [carbon] = C +carbon_dioxide = [carbon_dioxide] = CO2 +carbon_monoxide = [carbon_monoxide] = CO +coal = [coal] +diesel = [diesel] +jet_fuel_a1 = [jet_fuel_a1] = JETA1 +electricity = [electricity] = e = el +hydrogen = [hydrogen] = H2 +methane = [methane] = CH4 +methanol = [methanol] = CH3OH = MeOH +natural_gas = [natural_gas] = NG +nitrogen = [nitrogen] = N2 +oxygen = [oxygen] = O2 +water = [water] = H2O diff --git a/technologydata/utils/heating_values.txt b/technologydata/utils/heating_values.txt new file mode 100644 index 00000000..8b2162db --- /dev/null +++ b/technologydata/utils/heating_values.txt @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +# Definitions for the default heating values supported by the package. +# Each heating value is defined as an independent dimension. +# This way, pint allows for operations like division or multiplication, +# and at the same time prevents incompatible operations on these dimensions. +# +# See also: https://pint.readthedocs.io/en/latest/defining.html + + +# Format: +# = [] [= ] + +lower_heating_value = [lower_heating_value] = LHV = NCV = net_calorific_value +higher_heating_value = [higher_heating_value] = HHV = GCV = gross_calorific_value diff --git a/technologydata/utils/units.py b/technologydata/utils/units.py new file mode 100644 index 00000000..78351a6c --- /dev/null +++ b/technologydata/utils/units.py @@ -0,0 +1,409 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT +"""Submodule containing pint.UnitRegistry subclasses and utility functions for handling units, conversions, and currency units.""" + +import json +import logging +import re +import typing +from functools import lru_cache +from pathlib import Path + +import pandas as pd +import pint +import pydeflate +from frozendict import frozendict +from hdx.location.country import Country +from platformdirs import user_cache_dir + +logger = logging.getLogger(__name__) + +CURRENCY_UNIT_PATTERN = re.compile(r"\b(?P[A-Z]{3})_(?P\d{4})\b") + +# Set up cache directory and file for currency codes +CACHE_DIR = Path(user_cache_dir("technologydata")) # TODO move to commons? +CACHE_DIR.mkdir(parents=True, exist_ok=True) # TODO move to commons? +CURRENCY_CODES_CACHE = CACHE_DIR / "iso3_to_currency_codes.json" + + +SPECIAL_CASES_CURRENCY_CODE_TO_ISO3 = frozendict( + { + # Multi-country currencies (return codes directly) + "EUR": "EUR", # Eurozone + # Single primary countries + "AUD": "AUS", # Australia + "CHF": "CHE", # Switzerland + "DKK": "DNK", # Denmark + "GBP": "GBR", # United Kingdom (largest GBP economy) + "ILS": "ISR", # Israel + "MAD": "MAR", # Morocco + "NOK": "NOR", # Norway + "NZD": "NZL", # New Zealand + "USD": "USA", # Dollar-ized economies + # Special regional cases with proxy selection criteria + "ANG": "CUW", # CuraΓ§ao (GDP-weighted proxy) + "XAF": "CAF", # Central African Republic (lowest inflation differential) + "XCD": "GRD", # Grenada (lowest inflation differential) + "XOF": "NER", # Niger (lowest inflation differential 2015-2023) + "XPF": "PYF", # French Polynesia (data availability) + } +) + + +def get_iso3_to_currency_codes( + refresh: bool = False, ignore_cache: bool = False +) -> dict[str, str]: + """ + Get all 3-letter currency codes from official UN data. + + Uses a persistent local cache to avoid unnecessary network requests. + + Parameters + ---------- + refresh : bool, optional + If True, the cache will be updated from the internet, by default False. + ignore_cache : bool, optional + If True, the cache will not be used and the data will always be fetched from the live feed. + + Returns + ------- + dict[str, str] + A dictionary mapping ISO3 country codes to their corresponding 3-letter currency codes. + + """ + currencies: dict[str, str] = {} + + if refresh: + logger.debug("Deleting existing currency codes cache to refresh it.") + CURRENCY_CODES_CACHE.unlink(missing_ok=True) + + if ignore_cache: + logger.debug("Ignoring cache and fetching live currency codes.") + currencies = Country.countriesdata()["currencies"] + elif not CURRENCY_CODES_CACHE.exists(): + logger.debug( + "Cache does not exist. Fetching live currency codes and creating cache." + ) + currencies = Country.countriesdata()["currencies"] + with open(CURRENCY_CODES_CACHE, "w") as f: + json.dump(currencies, f) + else: + logger.debug("Reading currency codes from cache.") + with open(CURRENCY_CODES_CACHE) as f: + currencies = json.load(f) + + return currencies + + +def extract_currency_units(units: str | pint.Unit) -> list[str]: + """ + Extract currency-like strings from a string or pint.Unit. + + Parameters + ---------- + units : str or pint.Unit + The units string or pint.Unit from which to extract currency-like strings. + + Returns + ------- + list[str] + A list of currency-like strings found in the input, formatted as "{3-letter currency code}_{year as YYYY}". + If no matches are found, an empty list is returned. + + Examples + -------- + >>> extract_currency_units("USD_2020/kW") + ["USD_2020"] + + >>> extract_currency_units("EUR_2015/USD_2020") + ["EUR_2015", "USD_2020"] + + """ + # Ensure that the input is a string + units = str(units) + + # Get the 3-letter currency codes for all officially recognized currencies + logger.debug("Retrieving all 3-letter currency codes from the `hdx-country`.") + all_currency_codes = set(get_iso3_to_currency_codes().values()) + + # Check if the units contain a currency-like string, defined as "{3-letter currency code}_{year as YYYY}" + matches = CURRENCY_UNIT_PATTERN.findall(units) + if len(matches) == 0: + logger.debug("No currency-like string found in the units.") + return [] + + # Extract the currency codes from the matches using the regex groups + logger.debug(f"Found currency-like strings in the units: {matches}") + currency_codes = {code for code, year in matches} + + # Ensure that all currency codes are legitimate 3-letter currency codes + invalid_codes = currency_codes - all_currency_codes + if invalid_codes: + invalid_currencies = [ + f"{code}_{year}" for code, year in matches if code in invalid_codes + ] + raise ValueError( + f"The following unit(s) appear to be currency units, but have invalid 3-letter currency codes: {', '.join(invalid_currencies)}. " + ) + + # Reconstruct currency units from the matches + matches = [f"{code}_{year}" for code, year in matches] + + return matches + + +@lru_cache +def get_conversion_rate( + from_iso3: str, + to_iso3: str, + country: str, + from_year: int, + to_year: int, + source: str = "worldbank", +) -> float: + """ + Get the conversion rate from one currency (year, ISO3) to another currency (year, ISO3) from pydeflate. + + Parameters + ---------- + from_iso3 : str + The ISO3 code of the country of the currency to convert from (e.g., 'USA' if the source currency is USD). + to_iso3 : str + The ISO3 code of the country of the currency to convert to (e.g., 'DEU' if the target currency is EUR). + country : str + The ISO3 code of the country to adjust for inflation. + from_year : int + The julian year (YYYY) of the source currency. + to_year : int + The julian year (YYYY) of the target currency. + source : str + The source of the inflation data ('worldbank'/'wb' or 'international_monetary_fund'/'imf'). + + """ + # Choose the deflation function based on the source + deflation_function = { + "worldbank": pydeflate.wb_gdp_deflate, + "wb": pydeflate.wb_gdp_deflate, + "international_monetary_fund": pydeflate.imf_gdp_deflate, + "imf": pydeflate.imf_gdp_deflate, + }[source] + + # Ensure that `country` is a valid ISO3 code; to_iso3 and from_iso3 should already have been parsed before the function was called + if country not in get_iso3_to_currency_codes().keys(): + raise ValueError(f"Unknown ISO3 code for `country`: {country}.") + + # pydeflate only operates on pandas.DataFrame + data = pd.DataFrame( + { + "iso3": [country], + "from_year": [from_year], + "value": [1], + } + ) + + # Deflate values include currency conversion + conversion_rates = deflation_function( + data, + source_currency=from_iso3, + target_currency=to_iso3, + id_column="iso3", + year_column="from_year", + base_year=to_year, + value_column="value", + target_value_column="new_value", + ) + + if conversion_rates.isna().any().any(): + raise ValueError( + f"Conversion rate from {from_iso3} ({from_year}) to {to_iso3} ({to_year}) with inflation rate for {country} not found. " + ) + + return float(conversion_rates.loc[0, "new_value"]) + + +@lru_cache +def get_iso3_from_currency_code( + currency_code: str, + special_cases: frozendict[str, str] = SPECIAL_CASES_CURRENCY_CODE_TO_ISO3, +) -> str: + """ + Get the ISO3 country code from a 3-letter currency code using official UN data and opinionated assumptions. + + Parameters + ---------- + currency_code : str + The 3-letter currency code (e.g., 'USD', 'EUR'). + special_cases : dict[str, str], optional + A dictionary mapping specific currency codes to their ISO3 country codes for special cases. + Defaults to `technologydata.utils.units.SPECIAL_CASES_CURRENCY_CODE_TO_ISO3`. + + Returns + ------- + str + The ISO 3166 alpha 3 country code of the `currency_code`. + + Raises + ------ + ValueError + If the currency code is not found in the official list of currencies. + + """ + # Build reverse mapping: currency code -> list of ISO3 codes + iso3_to_currency_codes = pd.DataFrame.from_dict( + get_iso3_to_currency_codes(), orient="index", columns=["currency"] + ) + iso3_to_currency_codes = iso3_to_currency_codes.reset_index(drop=False).rename( + columns={"index": "iso3"} + ) + currency_codes_to_iso3 = iso3_to_currency_codes.groupby("currency", as_index=False)[ + "iso3" + ].agg(list) + + # Handle special cases for specific currency codes + + # Remove all currencies that are in the special cases from the mapping + currency_codes_to_iso3 = currency_codes_to_iso3.loc[ + ~currency_codes_to_iso3["currency"].isin(special_cases.keys()) + ] + + # Mapping should now only contain unique currency codes to ISO3 codes mappings, safe to explode + currency_codes_to_iso3 = currency_codes_to_iso3.explode("iso3") + + # Add the special cases to the mapping + currency_codes_to_iso3 = pd.concat( + [ + currency_codes_to_iso3, + pd.DataFrame( + list(special_cases.items()), + columns=["currency", "iso3"], + ), + ], + ignore_index=False, + ) + + # Special cases should handle all non-unique currency codes, check to make sure + # and return the ones that are not handled in special cases + + if ( + duplicated_iso3 := currency_codes_to_iso3.explode("iso3")[ + "currency" + ].duplicated() + ).any(): + raise ValueError( + "Some currency codes are used by multiple ISO3 codes but are not handled in `special_cases` " + "and need to be added to the mapping: " + f"{currency_codes_to_iso3[duplicated_iso3]}" + ) + + currency_codes_to_iso3 = currency_codes_to_iso3.set_index("currency")[ + "iso3" + ].to_dict() + + try: + return str(currency_codes_to_iso3[currency_code]) + except KeyError as e: + raise ValueError( + f"Currency code '{currency_code}' not found in the list of currencies. " + "Please ensure it is a valid 3-letter currency code." + ) from e + + +class SpecialUnitRegistry(pint.UnitRegistry): # type: ignore + """A special pint.UnitRegistry subclass that includes methods for handling currency units and conversion using pydeflate.""" + + def __init__( + self, *args: tuple[typing.Any, ...], **kwargs: dict[str, typing.Any] + ) -> None: + """ + Initialize a SpecialUnitRegistry instance. + + This constructor creates a new `SpecialUnitRegistry` object, + inheriting all default behaviors from `pint.UnitRegistry`. + It also defines a reference currency unit (`USD_2020`) for + handling currency conversions and related operations. + + Parameters + ---------- + *args : tuple + Positional arguments passed to the base `pint.UnitRegistry` constructor. + **kwargs : dict + Keyword arguments passed to the base `pint.UnitRegistry` constructor. + + """ + # Use all defaults definitions from a standard pint.UnitRegistry + super().__init__(*args, **kwargs) + + # Define the reference currency unit + # This is the base currency unit that all other currency units will be defined relative to + # We use USD_2020 as the base currency unit because it is a currency that we can relate all other currencies to + self.define("USD_2020 = [currency]") + + def get_reference_currency(self) -> str: + """Get the reference currency from the unit registry.""" + reference_currency = [ + self._units[u].name + for u in self._units + if "[currency]" in self._units[u].reference + ] + if not reference_currency or len(reference_currency) != 1: + raise ValueError( + "The unit registry does not have a unique base currency defined as '[currency]'. Please define a base currency unit to proceed." + ) + + return str(reference_currency[0]) + + def ensure_currency_is_unit(self, units: str) -> None: + """ + Ensure that all currency units in the given string are valid units in the registry. + + Extracts all currency-like strings from the input and checks if they are defined + in the unit registry. If they are not defined, they are added as valid units + relative to the reference currency but without a conversion factor. + + Parameters + ---------- + units : str + The units string to check for currency units. + + Examples + -------- + >>> ureg.ensure_currency_is_unit("USD_2020/kW") + >>> ureg.ensure_currency_is_unit("EUR_2015/USD_2020") + + """ + logger.debug(f"Ensuring currency units of '{units}' are defined in `ureg`") + currency_units = extract_currency_units(units) + logger.debug(f"Found currency-like strings in the units: {currency_units}") + + if not currency_units: + # Nothing to do + return + + reference_currency = self.get_reference_currency() + logger.debug(f"Reference currency is '{reference_currency}'.") + + # Check if the currency unit is already defined in the unit registry + # if not, define it relative to the base currency USD_2015 + for currency_unit in currency_units: + if currency_unit in self._units: + logger.debug( + f"Currency unit '{currency_unit}' is already defined in the unit registry. Not redefining it." + ) + continue + + logger.debug( + f"Currency unit '{currency_unit}' not found in the unit registry. " + f"Defining it without a conversion factor relative to the base currency '{reference_currency}'." + ) + self.define(f"{currency_unit} = nan {reference_currency}") + + +# Unit registries used throughout the package for different purposes +ureg = SpecialUnitRegistry() # For handling units, conversions, and currency units +creg = pint.UnitRegistry( + filename=Path(__file__).parent / "carriers.txt" +) # For tracking carriers and ensuring compatibility between them +hvreg = pint.UnitRegistry( + filename=Path(__file__).parent / "heating_values.txt" +) # For tracking heating values and ensuring compatibility between them diff --git a/test/conftest.py b/test/conftest.py index a87b2dde..08d231e7 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -83,3 +83,18 @@ def example_source_collection( sources_params: list[dict[str, str]] = request.param sources = [create_source_from_params(params) for params in sources_params] return technologydata.SourceCollection(sources=sources) + + +@pytest.fixture(scope="function") # type: ignore +def example_parameter(request: pytest.FixtureRequest) -> technologydata.Parameter: + """Fixture to create an example parameter.""" + source_list = request.param.pop("parameter_sources", []) + return technologydata.Parameter( + magnitude=request.param.get("parameter_magnitude"), + units=request.param.get("parameter_units"), + carrier=request.param.get("parameter_carrier"), + heating_value=request.param.get("parameter_heating_value"), + provenance=request.param.get("parameter_provenance"), + note=request.param.get("parameter_note"), + sources=technologydata.SourceCollection(sources=source_list), + ) diff --git a/test/test_data/currency_conversion/WB_CNY_2020/parameters.csv b/test/test_data/currency_conversion/WB_CNY_2020/parameters.csv new file mode 100644 index 00000000..32fcd08f --- /dev/null +++ b/test/test_data/currency_conversion/WB_CNY_2020/parameters.csv @@ -0,0 +1,15 @@ +country,input_magnitude,input_units,reference_magnitude,reference_units,source +ITA,100.0,EUR_2020/MW,788.202952,CNY_2020/MW,worldbank +FRA,100.0,EUR_2015/MW,839.849719,CNY_2020/MW,worldbank +FRA,100.0,EUR_2020/MW,788.202952,CNY_2020/MW,worldbank +ITA,100.0,EUR_2015/MW,833.762573,CNY_2020/MW,worldbank +ITA,100.0,EUR_2020/MW,788.202952,CNY_2020/MW,worldbank +FRA,200.0,GBP_2020/MW,1769.428465,CNY_2020/MW,worldbank +ITA,300000.0,USD_2020,2070230.180835,CNY_2020,worldbank +FRA,100.0,USD_2015/MW,756.953548,CNY_2020/MW,worldbank +ITA,200.0,USD_2015/MW,1502.93445,CNY_2020/MW,worldbank +ITA,200.0,USD_2020/MW,1380.153454,CNY_2020/MW,worldbank +ITA,100000.0,USD_2015,751467.224787,CNY_2020,worldbank +ITA,200000.0,USD_2020,1380153.45389,CNY_2020,worldbank +USA,100.0,USD_2020/MW,690.076727,CNY_2020/MW,worldbank +ITA,230.0,USD_2023/MW,1510.563521,CNY_2020/MW,worldbank diff --git a/test/test_data/currency_conversion/WB_EUR_2020/parameters.csv b/test/test_data/currency_conversion/WB_EUR_2020/parameters.csv new file mode 100644 index 00000000..089332de --- /dev/null +++ b/test/test_data/currency_conversion/WB_EUR_2020/parameters.csv @@ -0,0 +1,15 @@ +country,input_magnitude,input_units,reference_magnitude,reference_units,source +ITA,100.0,EUR_2020/MW,100.0,EUR_2020/MW,worldbank +FRA,100.0,EUR_2015/MW,106.552471,EUR_2020/MW,worldbank +FRA,100.0,EUR_2020/MW,100.0,EUR_2020/MW,worldbank +ITA,100.0,EUR_2015/MW,105.780189,EUR_2020/MW,worldbank +ITA,100.0,EUR_2020/MW,100.0,EUR_2020/MW,worldbank +FRA,200.0,GBP_2020/MW,224.488942,EUR_2020/MW,worldbank +ITA,300000.0,USD_2020,262651.919096,EUR_2020,worldbank +FRA,100.0,USD_2015/MW,96.035361,EUR_2020/MW,worldbank +ITA,200.0,USD_2015/MW,190.678612,EUR_2020/MW,worldbank +ITA,200.0,USD_2020/MW,175.101279,EUR_2020/MW,worldbank +ITA,100000.0,USD_2015,95339.30618,EUR_2020,worldbank +ITA,200000.0,USD_2020,175101.279398,EUR_2020,worldbank +USA,100.0,USD_2020/MW,87.55064,EUR_2020/MW,worldbank +ITA,230.0,USD_2023/MW,191.64652,EUR_2020/MW,worldbank diff --git a/test/test_data/currency_conversion/WB_USD_2020/parameters.csv b/test/test_data/currency_conversion/WB_USD_2020/parameters.csv new file mode 100644 index 00000000..724641b0 --- /dev/null +++ b/test/test_data/currency_conversion/WB_USD_2020/parameters.csv @@ -0,0 +1,15 @@ +country,input_magnitude,input_units,reference_magnitude,reference_units,source +ITA,100.0,EUR_2020/MW,114.219611,USD_2020/MW,worldbank +FRA,100.0,EUR_2015/MW,121.703819,USD_2020/MW,worldbank +FRA,100.0,EUR_2020/MW,114.219611,USD_2020/MW,worldbank +ITA,100.0,EUR_2015/MW,120.821722,USD_2020/MW,worldbank +ITA,100.0,EUR_2020/MW,114.219611,USD_2020/MW,worldbank +FRA,200.0,GBP_2020/MW,256.410396,USD_2020/MW,worldbank +ITA,300000.0,USD_2020,300000.0,USD_2020,worldbank +FRA,100.0,USD_2015/MW,109.691217,USD_2020/MW,worldbank +ITA,200.0,USD_2015/MW,217.792372,USD_2020/MW,worldbank +ITA,200.0,USD_2020/MW,200.0,USD_2020/MW,worldbank +ITA,100000.0,USD_2015,108896.185841,USD_2020,worldbank +ITA,200000.0,USD_2020,200000.0,USD_2020,worldbank +USA,100.0,USD_2020/MW,100.0,USD_2020/MW,worldbank +ITA,230.0,USD_2023/MW,218.897908,USD_2020/MW,worldbank diff --git a/test/test_data/solar_photovoltaics_example_03/technologies.json b/test/test_data/solar_photovoltaics_example_03/technologies.json index be406154..f8acfc7d 100644 --- a/test/test_data/solar_photovoltaics_example_03/technologies.json +++ b/test/test_data/solar_photovoltaics_example_03/technologies.json @@ -7,10 +7,9 @@ "detailed_technology": "Si-HC", "parameters": { "capacity": { - "quantity": { - "value": 1, - "unit": "MW" - }, + "magnitude": 1.0, + "units": "MW", + "carrier": "electricity", "provenance": "Model calculation", "note": "Average capacity factor of 22% assumed", "sources": [ @@ -33,10 +32,9 @@ ] }, "investment": { - "quantity": { - "value": 500, - "unit": "EUR_2022/KW_el" - }, + "magnitude": 500, + "units": "EUR_2022/kW", + "carrier": "1/electricity", "provenance": "Industry report", "note": "Average overnight cost", "sources": [ @@ -59,10 +57,9 @@ ] }, "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" - }, + "magnitude": 0.95, + "units": "EUR_2022/W", + "carrier": "1/electricity", "provenance": "Derived", "note": "Calculated from investment/capacity", "sources": [ @@ -85,10 +82,8 @@ ] }, "lifetime": { - "quantity": { - "value": 30, - "unit": "years" - }, + "magnitude": 30, + "units": "years", "provenance": "Manufacturer specification", "note": "With performance degradation guarantee", "sources": [ @@ -111,10 +106,8 @@ ] }, "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" - }, + "magnitude": 5, + "units": "%", "provenance": "Financial analysis", "note": "Nominal weighted average cost of capital", "sources": [ @@ -146,10 +139,9 @@ "detailed_technology": "Si-HC", "parameters": { "capacity": { - "quantity": { - "value": 1.0, - "unit": "MW" - }, + "magnitude": 1.0, + "units": "MW", + "carrier": "electricity", "provenance": "Model calculation", "note": "Average capacity factor of 25% assumed", "sources": [ @@ -173,10 +165,9 @@ } }, "investment": { - "quantity": { - "value": 350, - "unit": "EUR_2022/KW_el" - }, + "magnitude": 350, + "units": "EUR_2022/kW", + "carrier": "1/electricity", "provenance": "Industry report", "note": "Average overnight cost for another tech", "sources": [ @@ -199,10 +190,9 @@ ] }, "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" - }, + "magnitude": 0.95, + "units": "EUR_2022/W", + "carrier": "1/electricity", "provenance": "Derived", "note": "Calculated from investment/capacity", "sources": [ @@ -225,10 +215,8 @@ ] }, "lifetime": { - "quantity": { - "value": 30, - "unit": "years" - }, + "magnitude": 30, + "units": "years", "provenance": "Manufacturer specification", "note": "With performance degradation guarantee", "sources": [ @@ -251,10 +239,8 @@ ] }, "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" - }, + "magnitude": 5, + "units": "%", "provenance": "Financial analysis", "note": "Nominal weighted average cost of capital", "sources": [ diff --git a/test/test_data/solar_photovoltaics_example_04/technologies.json b/test/test_data/solar_photovoltaics_example_04/technologies.json index b97485fd..dfa7eb50 100644 --- a/test/test_data/solar_photovoltaics_example_04/technologies.json +++ b/test/test_data/solar_photovoltaics_example_04/technologies.json @@ -7,10 +7,9 @@ "detailed_technology": "Si-HC", "parameters": { "capacity": { - "quantity": { - "value": 1, - "unit": "MW" - }, + "magnitude": 1, + "units": "MW", + "carrier": "electricity", "provenance": "Model calculation", "note": "Average capacity factor of 22% assumed", "sources": [ @@ -22,10 +21,9 @@ ] }, "investment": { - "quantity": { - "value": 500, - "unit": "EUR_2022/KW_el" - }, + "magnitude": 500, + "units": "EUR_2022/kW", + "carrier": "1/electricity", "provenance": "Industry report", "note": "Average overnight cost", "sources": [ @@ -37,10 +35,9 @@ ] }, "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" - }, + "magnitude": 0.95, + "units": "EUR_2022/W", + "carrier": "1/electricity", "provenance": "Derived", "note": "Calculated from investment/capacity", "sources": [ @@ -52,10 +49,8 @@ ] }, "lifetime": { - "quantity": { - "value": 30, - "unit": "years" - }, + "magnitude": 30, + "units": "years", "provenance": "Manufacturer specification", "note": "With performance degradation guarantee", "sources": [ @@ -67,10 +62,8 @@ ] }, "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" - }, + "magnitude": 5, + "units": "%", "provenance": "Financial analysis", "note": "Nominal weighted average cost of capital", "sources": [ @@ -91,10 +84,9 @@ "detailed_technology": "Si-HC", "parameters": { "capacity": { - "quantity": { - "value": 1.0, - "unit": "MW" - }, + "magnitude": 1.0, + "units": "MW", + "carrier": "electricity", "provenance": "Model calculation", "note": "Average capacity factor of 25% assumed", "sources": [ @@ -106,11 +98,10 @@ ] }, "investment": { - "quantity": { - "value": 350, - "unit": "EUR_2022/KW_el" - }, - "provenance": "Industry report", + "magnitude": 350, + "units": "EUR_2022/kW", + "carrier": "1/electricity", + "provenance": "Industry report", "note": "Average overnight cost for another tech", "sources": [ { @@ -121,10 +112,9 @@ ] }, "specific_investment": { - "quantity": { - "value": 0.95, - "unit": "USD/W" - }, + "magnitude": 0.95, + "units": "EUR_2022/W", + "carrier": "1/electricity", "provenance": "Derived", "note": "Calculated from investment/capacity", "sources": [ @@ -136,10 +126,8 @@ ] }, "lifetime": { - "quantity": { - "value": 30, - "unit": "years" - }, + "magnitude": 30, + "units": "years", "provenance": "Manufacturer specification", "note": "With performance degradation guarantee", "sources": [ @@ -151,10 +139,8 @@ ] }, "wacc": { - "quantity": { - "value": 0.05, - "unit": "fraction" - }, + "magnitude": 5, + "units": "%", "provenance": "Financial analysis", "note": "Nominal weighted average cost of capital", "sources": [ diff --git a/test/test_parameter.py b/test/test_parameter.py new file mode 100644 index 00000000..30cc6da5 --- /dev/null +++ b/test/test_parameter.py @@ -0,0 +1,717 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the initialization and methods of the Parameter class.""" + +import pathlib + +import numpy as np +import pandas as pd +import pint +import pytest + +import technologydata + +# from technologydata.utils.units import extract_currency_units, ureg + +path_cwd = pathlib.Path.cwd() + + +class TestParameter: + """Test suite for the Parameter class in the technologydata module.""" + + def test_parameter_creation(self) -> None: + """Test the creation of a Parameter instance with various units.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="literature", + note="Estimated", + sources=technologydata.SourceCollection( + sources=[ + technologydata.Source( + authors="some authors", + title="Example Title", + ) + ] + ), + ) + assert param.magnitude == 1000 + assert param.units == "USD_2020 / kilowatt" + assert param.provenance == "literature" + assert param.note == "Estimated" + assert param.sources is not None + + # Internal pint quantities + # pint autoconverts to the canonical name for the carrier and heating value + # so comparing with == "H2" would fail; instead check that the units are compatible + assert param._pint_quantity.units.is_compatible_with("USD_2020 / kW") + assert param._pint_carrier.is_compatible_with("H2") + assert param._pint_heating_value.is_compatible_with("LHV") + + def test_parameter_invalid_units(self) -> None: + """Test that an error is raised when invalid units are provided.""" + with pytest.raises(pint.errors.UndefinedUnitError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="INVALID_UNIT", + ) + assert "INVALID_UNIT" in str(excinfo.value) + + with pytest.raises(pint.errors.UndefinedUnitError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="INVALID_HEATING_VALUE", + ) + assert "INVALID_HEATING_VALUE" in str(excinfo.value) + + with pytest.raises(pint.errors.UndefinedUnitError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="INVALID_CARRIER", + ) + assert "INVALID_CARRIER" in str(excinfo.value) + + with pytest.raises(ValueError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + heating_value="LHV", + ) + assert "Heating value cannot be set without a carrier" in str(excinfo.value) + + def test_parameter_to_conversion_fail_on_currency_conversion(self) -> None: + """Test the unit conversion of a Parameter instance to fail on currency conversion.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + ) + with pytest.raises(NotImplementedError) as excinfo: + param.to("EUR_2025 / kilowatt") + assert "Currency conversion is not supported" in str(excinfo.value) + + def test_parameter_to_conversion(self) -> None: + """Test the conversion of a Parameter instance to different units.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + ) + + ref = technologydata.Parameter( + magnitude=param.magnitude * 1000, + units="USD_2020 / megawatt", + ) + + converted = param.to("USD_2020 / megawatt") + + assert isinstance(converted, technologydata.Parameter) + assert converted.units == ref.units + assert converted.magnitude == ref.magnitude + + def test_pint_attributes_update(self) -> None: + """Test that pint attributes are updated correctly when attributes change and a method that uses the pint fields is called.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="literature", + note="Estimated", + ) + # Change magnitude and units + param.magnitude = 2000 + param.units = "EUR_2025 / kilowatt" + param._update_pint_attributes() + assert param._pint_quantity.magnitude == 2000 + assert str(param._pint_quantity.units) == "EUR_2025 / kilowatt" + + # Change magnitude and units again and check if they are updated + # when calling a method that uses them + param.magnitude = 3000 + param.units = "USD_2020 / kWh" + param = param.to("USD_2020 / kWh") + assert param._pint_quantity.magnitude == 3000 + assert str(param._pint_quantity.units) == str( + technologydata.ureg.Unit("USD_2020 / kWh") + ) + + def test_parameter_change_currency(self) -> None: + """Test currency conversion with inflation adjustment.""" + param = technologydata.Parameter( + magnitude=1, + units="USD_2020/kW", + ) + + # Convert to EUR with inflation adjustment for Germany + converted = param.change_currency("EUR_2023", "DEU") + assert isinstance(converted, technologydata.Parameter) + assert converted.units is not None + assert "EUR_2023" in converted.units + assert converted._pint_quantity is not None + assert converted._pint_quantity.is_compatible_with("EUR_2023 / kW") + + # Check that magnitude changed due to currency conversion + assert not np.isnan(converted.magnitude) + assert converted.magnitude != param.magnitude + + def test_parameter_change_currency_explicit_source(self) -> None: + """Test currency conversion with explicit inflation data source.""" + param = technologydata.Parameter( + magnitude=1, + units="EUR_2019/MWh", + ) + + # Convert using IMF data source + converted = param.change_currency("USD_2022", "USA", source="worldbank") + assert isinstance(converted, technologydata.Parameter) + assert converted.units is not None + assert "USD_2022" in converted.units + assert converted._pint_quantity is not None + assert not np.isnan(converted.magnitude) + assert converted._pint_quantity.is_compatible_with("USD_2022 / MWh") + + def test_parameter_change_currency_different_source(self) -> None: + """Test currency conversion with different inflation data source.""" + param = technologydata.Parameter( + magnitude=1, + units="EUR_2019/MWh", + ) + + # Convert using IMF data source + converted = param.change_currency("USD_2022", "USA", source="imf") + assert isinstance(converted, technologydata.Parameter) + assert converted.units is not None + assert "USD_2022" in converted.units + assert converted._pint_quantity.is_compatible_with("USD_2022 / MWh") + + def test_parameter_change_currency_multiple_currencies(self) -> None: + """Test currency conversion when units contain multiple currencies.""" + param = technologydata.Parameter( + magnitude=1, + units="USD_2020 * EUR_2021 / kW", + ) + + # Convert all currencies to CNY_2023 + converted = param.change_currency("CNY_2023", "CHN") + assert isinstance(converted, technologydata.Parameter) + # Both USD_2020 and EUR_2021 should be replaced with CNY_2023 + assert converted.units is not None + assert "CNY_2023" in converted.units + assert "USD_2020" not in converted.units + assert "EUR_2021" not in converted.units + + def test_parameter_change_currency_same_currency(self) -> None: + """Test currency conversion to the same currency (inflation adjustment only).""" + param = technologydata.Parameter( + magnitude=1, + units="USD_2019/kW", + ) + + # Convert to USD but different year (inflation adjustment) + converted = param.change_currency("USD_2023", "USA") + assert isinstance(converted, technologydata.Parameter) + assert converted.units == "USD_2023 / kilowatt" + # Magnitude should change due to inflation adjustment + assert not np.isnan(converted.magnitude) + assert converted.magnitude != param.magnitude + + def test_parameter_no_currency_change(self) -> None: + """Test that no currency change occurs when the target currency is the same as the current one.""" + param = technologydata.Parameter( + magnitude=1, + units="USD_2020/kW", + ) + + # Convert to the same currency and year + converted = param.change_currency("USD_2020", "USA") + assert isinstance(converted, technologydata.Parameter) + assert converted._pint_quantity.is_compatible_with("USD_2020 / kW") + # Magnitude should remain unchanged + assert not np.isnan(converted.magnitude) + assert converted.magnitude == param.magnitude + + def test_parameter_change_currency_invalid_country(self) -> None: + """Test that invalid country codes raise appropriate errors.""" + param = technologydata.Parameter( + magnitude=1, + units="USD_2020/kW", + ) + + # Invalid country code should raise an error + with pytest.raises((ValueError, KeyError)): + param.change_currency("EUR_2023", "USB") + + def test_parameter_change_currency_invalid_source(self) -> None: + """Test that invalid inflation data sources raise appropriate errors.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + ) + + # Invalid source should raise an error + with pytest.raises(KeyError): + param.change_currency("EUR_2023", "DEU", source="invalid_source") + + def test_parameter_change_currency_no_units(self) -> None: + """Test currency conversion with parameter that has no units.""" + param = technologydata.Parameter( + magnitude=42, + ) + + # Should handle parameters without currency units gracefully + converted = param.change_currency("EUR_2023", "DEU") + assert isinstance(converted, technologydata.Parameter) + assert converted.magnitude == 42 + assert converted.units is None or "EUR_2023" not in str(converted.units) + + def test_parameter_unchanged_other_attributes(self) -> None: + """Test that other attributes remain unchanged after currency conversion.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="literature", + note="Estimated", + ) + + # Convert to EUR_2023 + converted = param.change_currency("EUR_2023", "DEU") + + # Check that other attributes remain unchanged + assert converted.carrier == param.carrier + assert converted.heating_value == param.heating_value + assert converted.provenance == param.provenance + assert converted.note == param.note + + def test_parameter_heating_value_compatibility(self) -> None: + """Test that we do not permit operations on mixed heating values.""" + param_lhv = technologydata.Parameter( + magnitude=1, + carrier="H2", + heating_value="LHV", + ) + param_hhv = technologydata.Parameter( + magnitude=1, + carrier="H2", + heating_value="HHV", + ) + + # Different error messages for + and - + with pytest.raises(ValueError) as excinfo: + param_lhv + param_hhv + assert ( + "Operation not permitted on parameters with different heating values" + in str(excinfo.value) + ) + with pytest.raises(ValueError) as excinfo: + param_lhv - param_hhv + assert ( + "Operation not permitted on parameters with different heating values" + in str(excinfo.value) + ) + + # Different error messages for * and / + with pytest.raises(ValueError) as excinfo: + param_lhv * param_hhv + assert "Cannot multiply parameters with different heating values" in str( + excinfo.value + ) + + with pytest.raises(ValueError) as excinfo: + param_lhv / param_hhv + assert "Cannot divide parameters with different heating values" in str( + excinfo.value + ) + + def test_parameter_carrier_compatibility(self) -> None: + """Test that we do only permit certain operations on mixed carriers.""" + param_h2 = technologydata.Parameter( + magnitude=1, + carrier="H2", + heating_value="LHV", + ) + param_ch4 = technologydata.Parameter( + magnitude=1, + carrier="CH4", + heating_value="LHV", + ) + + # Different error messages for + and - + with pytest.raises(ValueError) as excinfo: + param_h2 + param_ch4 + assert ( + "Operation not permitted on parameters with different carriers" + in str(excinfo.value) + ) + with pytest.raises(ValueError) as excinfo: + param_h2 - param_ch4 + assert ( + "Operation not permitted on parameters with different carriers" + in str(excinfo.value) + ) + + # * and / are permitted with different carriers and should yield mixed carriers + assert ( + param_h2 * param_ch4 + ).carrier == param_h2._pint_carrier * param_ch4._pint_carrier + assert ( + param_h2 / param_ch4 + ).carrier == param_h2._pint_carrier / param_ch4._pint_carrier + + def test_parameter_equality(self) -> None: + """Test equality comparison of Parameter objects.""" + # Create two identical parameters + param1 = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="literature", + note="Estimated", + sources=technologydata.SourceCollection( + sources=[ + technologydata.Source( + authors="some authors", + title="Example Title", + ) + ] + ), + ) + param2 = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="literature", + note="Estimated", + sources=technologydata.SourceCollection( + sources=[ + technologydata.Source( + authors="some authors", + title="Example Title", + ) + ] + ), + ) + + # Should be equal + assert param1 == param2 + assert param2 == param1 + + def test_parameter_equality_different_magnitude(self) -> None: + """Test that parameters with different magnitudes are not equal.""" + param1 = technologydata.Parameter(magnitude=1000, units="USD_2020/kW") + param2 = technologydata.Parameter(magnitude=2000, units="USD_2020/kW") + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_different_units(self) -> None: + """Test that parameters with different units are not equal.""" + param1 = technologydata.Parameter(magnitude=1000, units="USD_2020/kW") + param2 = technologydata.Parameter(magnitude=1000, units="EUR_2020/kW") + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_different_carrier(self) -> None: + """Test that parameters with different carriers are not equal.""" + param1 = technologydata.Parameter(magnitude=1000, carrier="H2") + param2 = technologydata.Parameter(magnitude=1000, carrier="CH4") + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_different_heating_value(self) -> None: + """Test that parameters with different heating values are not equal.""" + param1 = technologydata.Parameter( + magnitude=1000, carrier="H2", heating_value="LHV" + ) + param2 = technologydata.Parameter( + magnitude=1000, carrier="H2", heating_value="HHV" + ) + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_different_provenance(self) -> None: + """Test that parameters with different provenance are not equal.""" + param1 = technologydata.Parameter(magnitude=1000, provenance="literature") + param2 = technologydata.Parameter(magnitude=1000, provenance="expert_estimate") + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_different_note(self) -> None: + """Test that parameters with different notes are not equal.""" + param1 = technologydata.Parameter(magnitude=1000, note="Estimated") + param2 = technologydata.Parameter(magnitude=1000, note="Measured") + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_different_sources(self) -> None: + """Test that parameters with different sources are not equal.""" + source1 = technologydata.Source(authors="Author A", title="Title A") + source2 = technologydata.Source(authors="Author B", title="Title B") + + param1 = technologydata.Parameter( + magnitude=1000, sources=technologydata.SourceCollection(sources=[source1]) + ) + param2 = technologydata.Parameter( + magnitude=1000, sources=technologydata.SourceCollection(sources=[source2]) + ) + + assert param1 != param2 + assert param2 != param1 + + def test_parameter_equality_none_values(self) -> None: + """Test equality with None values for optional fields.""" + param1 = technologydata.Parameter(magnitude=1000) + param2 = technologydata.Parameter(magnitude=1000) + + # Both have None for optional fields, should be equal + assert param1 == param2 + + # One has None, the other has a value + param3 = technologydata.Parameter(magnitude=1000, units="USD_2020/kW") + assert param1 != param3 + assert param3 != param1 + + def test_parameter_equality_with_non_parameter(self) -> None: + """Test equality comparison with non-Parameter objects.""" + param = technologydata.Parameter(magnitude=1000) + + # Should return NotImplemented for non-Parameter objects + assert param.__eq__("not a parameter") == NotImplemented + assert param.__eq__(42) == NotImplemented + assert param.__eq__(None) == NotImplemented + + def test_parameter_equality_canonical_units(self) -> None: + """Test that parameters with equivalent but differently formatted units are equal.""" + # Units should be canonicalized during initialization + param1 = technologydata.Parameter(magnitude=1000, units="USD_2020/kW") + param2 = technologydata.Parameter(magnitude=1000, units="USD_2020/kilowatt") + + # Should be equal because units are canonicalized + assert param1 == param2 + assert param2 == param1 + + def test_parameter_equality_self_reference(self) -> None: + """Test that a parameter is equal to itself.""" + param = technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + carrier="H2", + heating_value="LHV", + provenance="literature", + note="Estimated", + ) + + assert param == param + + @pytest.mark.parametrize( + "example_parameter", + [ + { + "parameter_magnitude": 1000, + "parameter_units": "USD_2020/kW", + "parameter_carrier": "H2", + "parameter_heating_value": "LHV", + "parameter_provenance": "literature", + "parameter_note": "Estimated", + "parameter_sources": [ + technologydata.Source(title="title", authors="authors") + ], + } + ], + indirect=["example_parameter"], + ) # type: ignore + def test_example_parameter( + self, example_parameter: technologydata.Parameter + ) -> None: + """Test that the fixture example_parameter yields a parameter object.""" + assert isinstance(example_parameter, technologydata.Parameter) + + def test_parameter_pow_basic(self) -> None: + """Test integer exponentiation.""" + param = technologydata.Parameter(magnitude=2, units="kW") + result = param**3 + assert isinstance(result, technologydata.Parameter) + assert result.magnitude == 8 + assert result.units == "kilowatt ** 3" + + def test_parameter_pow_fractional(self) -> None: + """Test fractional exponentiation.""" + param = technologydata.Parameter(magnitude=9, units="m**2") + result = param**0.5 + assert pytest.approx(result.magnitude) == 3 + assert result.units == "meter" + + def test_parameter_pow_zero(self) -> None: + """Test zero exponent returns dimensionless.""" + param = technologydata.Parameter(magnitude=5, units="J") + result = param**0 + assert result.magnitude == 1 + assert result.units == "dimensionless" + + def test_parameter_pow_negative(self) -> None: + """Test negative exponentiation and unit handling.""" + param = technologydata.Parameter(magnitude=2, units="W") + result = param**-2 + assert pytest.approx(result.magnitude) == 0.25 + # Compare units using pint, not string equality + assert technologydata.ureg.Unit(result.units) == technologydata.ureg.Unit( + "watt ** -2" + ) + + def test_parameter_pow_carrier(self) -> None: + """Test that the carrier attribute is also affected.""" + param = technologydata.Parameter( + magnitude=3, + units="kg", + carrier="H2", + ) + result = param**2 + assert result.carrier == f"{param.carrier} ** 2" + + def test_parameter_pow_preserves_metadata(self) -> None: + """Test that metadata is preserved after exponentiation.""" + param = technologydata.Parameter( + magnitude=3, + units="kg", + carrier="H2", + heating_value="LHV", + provenance="test", + note="note", + ) + result = param**2 + assert result.carrier == f"{param.carrier} ** 2" + assert result.heating_value == param.heating_value + assert result.provenance == param.provenance + assert result.note == param.note + + def test_change_heating_value_h2_lhv_to_hhv(self) -> None: + """Test LHV to HHV conversion for H2.""" + p = technologydata.Parameter( + magnitude=119.6, + units="kilowatt_hour", + carrier="hydrogen", + heating_value="lower_heating_value", + ) + p2 = p.change_heating_value("higher_heating_value") + assert pytest.approx(p2.magnitude) == 141.8 + assert p2.heating_value == "higher_heating_value" + assert p2.carrier == "hydrogen" + assert p2.units == "kilowatt_hour" + + def test_change_heating_value_h2_hhv_to_lhv(self) -> None: + """Test HHV to LHV conversion for H2.""" + p = technologydata.Parameter( + magnitude=141.8, + units="kilowatt_hour", + carrier="hydrogen", + heating_value="higher_heating_value", + ) + p2 = p.change_heating_value("lower_heating_value") + assert pytest.approx(p2.magnitude) == 119.6 + assert p2.heating_value == "lower_heating_value" + assert p2.carrier == "hydrogen" + assert p2.units == "kilowatt_hour" + + def test_change_heating_value_ch4_lhv_to_hhv(self) -> None: + """Test LHV to HHV conversion for CH4.""" + p = technologydata.Parameter( + magnitude=10, + units="kilowatt_hour", + carrier="methane", + heating_value="lower_heating_value", + ) + p2 = p.change_heating_value("higher_heating_value") + assert pytest.approx(p2.magnitude) == 11.1 + assert p2.heating_value == "higher_heating_value" + assert p2.carrier == "methane" + assert p2.units == "kilowatt_hour" + + def test_change_heating_value_ch4_hhv_to_lhv(self) -> None: + """Test HHV to LHV conversion for CH4.""" + p = technologydata.Parameter( + magnitude=11.1, + units="kilowatt_hour", + carrier="methane", + heating_value="higher_heating_value", + ) + p2 = p.change_heating_value("lower_heating_value") + assert pytest.approx(p2.magnitude) == 10.0 + assert p2.heating_value == "lower_heating_value" + assert p2.carrier == "methane" + assert p2.units == "kilowatt_hour" + + def test_change_heating_value_no_carrier_in_units(self) -> None: + """Test conversion when carrier does not appear in units (should treat as 1 appearance).""" + p = technologydata.Parameter( + magnitude=1, + units="kilowatt_hour", + carrier="hydrogen", + heating_value="lower_heating_value", + ) + p2 = p.change_heating_value("higher_heating_value") + assert pytest.approx(p2.magnitude) == 1.418 / 1.196 + assert p2.heating_value == "higher_heating_value" + assert p2.carrier == "hydrogen" + assert p2.units == "kilowatt_hour" + + def test_change_heating_value_same_hv(self) -> None: + """Test that no conversion occurs if heating value is unchanged.""" + p = technologydata.Parameter( + magnitude=1, + units="kilowatt_hour", + carrier="hydrogen", + heating_value="lower_heating_value", + ) + p2 = p.change_heating_value("lower_heating_value") + assert p2.magnitude == 1 + assert p2.heating_value == "lower_heating_value" + + @pytest.mark.parametrize( + "folder_id", + ["WB_CNY_2020", "WB_EUR_2020", "WB_USD_2020"], + ) # type: ignore + def test_change_currency(self, folder_id: str) -> None: + """Validate the currency conversion rates.""" + input_path = pathlib.Path( + path_cwd, + "test", + "test_data", + "currency_conversion", + folder_id, + "parameters.csv", + ) + input_dataframe = pd.read_csv(input_path).reset_index() + for _, row in input_dataframe.iterrows(): + reference_param = technologydata.Parameter( + magnitude=np.round(row["reference_magnitude"], 2), + units=row["reference_units"], + ) + + output_param = technologydata.Parameter( + magnitude=row["input_magnitude"], + units=row["input_units"], + ).change_currency( + to_currency=technologydata.extract_currency_units( + row["reference_units"] + )[0], + country=row["country"], + source=row["source"], + ) + assert output_param.magnitude == pytest.approx( + reference_param.magnitude, rel=1e-2 + ) + assert output_param.units == reference_param.units diff --git a/test/test_source.py b/test/test_source.py index 3751b8e2..94c8db4d 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -150,7 +150,7 @@ def test_retrieve_from_wayback(example_source: technologydata.Source) -> None: def test_store_in_wayback() -> None: """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" - url_to_archive = "https://openenergytransition.org/outputs.html" + url_to_archive = "https://www.openenergytransition.org/outputs.html" archived_info = technologydata.Source.store_in_wayback(url_to_archive) # Check if archived_info is None diff --git a/test/test_units.py b/test/test_units.py new file mode 100644 index 00000000..e729a327 --- /dev/null +++ b/test/test_units.py @@ -0,0 +1,590 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT +"""Test the creation of custom units and handling of currencies using Pint.""" + +import json + +import pint +import pytest +from frozendict import frozendict + +from technologydata.utils.units import ( + CURRENCY_CODES_CACHE, + SPECIAL_CASES_CURRENCY_CODE_TO_ISO3, + SpecialUnitRegistry, + creg, + extract_currency_units, + get_conversion_rate, + get_iso3_from_currency_code, + get_iso3_to_currency_codes, + hvreg, +) + + +class TestExtractCurrencyUnits: + """Test cases for extract_currency_units function.""" + + def test_single_currency_unit(self) -> None: + """Test extraction of a single currency unit.""" + result = extract_currency_units("USD_2020/kW") + assert result == ["USD_2020"] + + def test_multiple_currency_units(self) -> None: + """Test extraction of multiple currency units.""" + result = extract_currency_units("EUR_2015/USD_2020") + assert set(result) == {"EUR_2015", "USD_2020"} + + def test_no_currency_units(self) -> None: + """Test that no currency units are extracted from non-currency strings.""" + result = extract_currency_units("kW/hour") + assert result == [] + + def test_empty_string(self) -> None: + """Test extraction from empty string.""" + result = extract_currency_units("") + assert result == [] + + def test_pint_unit(self) -> None: + """Test extraction from pint.Unit object.""" + ureg = pint.UnitRegistry() + ureg.define("USD_2020 = [currency]") + unit = ureg.Unit("USD_2020") + result = extract_currency_units(unit) + assert result == ["USD_2020"] + + ureg.define("USD_2020 = [currency]") + unit = ureg.Unit("USD_2020/kW") + result = extract_currency_units(unit) + assert result == ["USD_2020"] + + def test_pint_unit_input(self) -> None: + """Test that pint.Unit objects are properly converted to strings.""" + ureg = pint.UnitRegistry() + unit = ureg.parse_expression("kW") + result = extract_currency_units(unit) + assert result == [] + + def test_complex_unit_string(self) -> None: + """Test extraction from complex unit strings with multiple components.""" + result = extract_currency_units("USD_2020/kW/year") + assert result == ["USD_2020"] + + def test_invalid_year_format(self) -> None: + """Test that invalid year formats are not matched.""" + result = extract_currency_units("USD_20/kW") + assert result == [] + + result = extract_currency_units("USD_20200/kW") + assert result == [] + + def test_non_three_letter_codes(self) -> None: + """Test that non-three-letter codes are not matched.""" + result = extract_currency_units("US_2020/kW") + assert result == [] + + result = extract_currency_units("USDD_2020/kW") + assert result == [] + + def test_case_sensitivity(self) -> None: + """Test that currency codes must be uppercase.""" + result = extract_currency_units("usd_2020/kW") + assert result == [] + + def test_valid_currency_codes(self) -> None: + """Test that only valid currency codes are accepted.""" + result = extract_currency_units("USD_2020/kW") + assert result == ["USD_2020"] + + result = extract_currency_units("EUR_2015/kW") + assert result == ["EUR_2015"] + + with pytest.raises(ValueError): + extract_currency_units("EUA_2015/kW") + + def test_invalid_currency_codes_raise(self) -> None: + """Test that invalid currency codes raise ValueError.""" + with pytest.raises(ValueError): + extract_currency_units("XYZ_2020/kW") + + def test_duplicate_currency_units(self) -> None: + """Test that duplicate currency units are handled correctly.""" + result = extract_currency_units("USD_2020/USD_2020/EUR_2015") + assert result == ["USD_2020", "USD_2020", "EUR_2015"] + + def test_different_years_same_currency(self) -> None: + """Test extraction of same currency with different years.""" + result = extract_currency_units("USD_2020/USD_2015") + assert result == ["USD_2020", "USD_2015"] + + def test_mixed_valid_invalid_currencies(self) -> None: + """Test behavior with mix of valid and invalid currency codes.""" + with pytest.raises(ValueError): + extract_currency_units("USD_2020/XYZ_2021") + + +class TestGetIso3ToCurrencyCodes: + """Test cases for get_iso3_to_currency_codes function and whether the cache works correctly.""" + + def test_correct_currency_codes(self) -> None: + """Test that the function returns correct currency codes.""" + codes = get_iso3_to_currency_codes() + + # dtype check + assert isinstance(codes, dict) + + # check some known currency codes + assert "USD" in codes.values() + assert "EUR" in codes.values() + + # check wrong currency codes + assert "EUA" not in codes.values() # EUA is not a valid currency code + assert "usd" not in codes.values() # codes must be uppercase + + assert all(len(iso3) == 3 for iso3 in codes.keys()), ( + "All ISO3 codes should be 3 letters long" + ) + assert all(iso3.isupper() for iso3 in codes.keys()), ( + "All ISO3 codes should be uppercase" + ) + assert all([len(code) == 3 for code in codes.values() if code]), ( + "All currency codes should be 3 letters long" + ) + assert all([code.isupper() for code in codes.values() if code]), ( + "All currency codes should be uppercase" + ) + + def test_currency_cache_creates_and_reads(self) -> None: + """Test that the cache is properly created/read/ignored.""" + # Ensure the cache does not exist before the test + CURRENCY_CODES_CACHE.unlink(missing_ok=True) + + # First call should create cache + codes = get_iso3_to_currency_codes() + assert CURRENCY_CODES_CACHE.exists() + + # Second call should read from cache (simulate by modifying file) + dummy_data = {"FOO": "BAR"} + with open(CURRENCY_CODES_CACHE, "w") as f: + json.dump(dummy_data, f) + codes = get_iso3_to_currency_codes() + assert codes == dummy_data + + # Bypass cache to ensure it reads from the live feed (FOO should not be there) + codes = get_iso3_to_currency_codes(ignore_cache=True) + assert codes != dummy_data + + # Force refresh should overwrite cache + codes = get_iso3_to_currency_codes(refresh=True) + assert codes != dummy_data + + +class TestGetConversionRate: + """Test cases for get_conversion_rate function.""" + + def test_same_currency_same_year(self) -> None: + """Test conversion rate when currency and year are the same.""" + rate = get_conversion_rate( + from_iso3="USA", + to_iso3="USA", + country="USA", + from_year=2020, + to_year=2020, + ) + assert rate == pytest.approx(1.0, rel=1e-6) + + def test_different_years_same_currency(self) -> None: + """Test conversion rate with different years but same currency.""" + rate = get_conversion_rate( + from_iso3="USA", + to_iso3="USA", + country="USA", + from_year=2015, + to_year=2020, + ) + # Rate should not be 1.0 due to inflation adjustment + assert rate != 1.0 + assert isinstance(rate, float) + assert rate > 0 + + def test_different_currencies_same_year(self) -> None: + """Test conversion rate with different currencies but same year.""" + rate = get_conversion_rate( + from_iso3="USA", + to_iso3="DEU", + country="USA", + from_year=2020, + to_year=2020, + ) + # Rate should not be 1.0 due to currency conversion + assert rate != 1.0 + assert isinstance(rate, float) + assert rate > 0 + + def test_different_currencies_different_years(self) -> None: + """Test conversion rate with different currencies and years.""" + rate = get_conversion_rate( + from_iso3="USA", + to_iso3="DEU", + country="USA", + from_year=2015, + to_year=2020, + ) + assert isinstance(rate, float) + assert rate > 0 + + def test_worldbank_source(self) -> None: + """Test conversion rate using World Bank data source.""" + rate = get_conversion_rate( + from_iso3="USA", + to_iso3="USA", + country="USA", + from_year=2015, + to_year=2020, + source="worldbank", + ) + assert isinstance(rate, float) + assert rate > 0 + + def test_imf_source(self) -> None: + """Test conversion rate using IMF data source.""" + rate = get_conversion_rate( + from_iso3="USA", + to_iso3="USA", + country="USA", + from_year=2015, + to_year=2020, + source="international_monetary_fund", + ) + assert isinstance(rate, float) + assert rate > 0 + + def test_invalid_source_raises_keyerror(self) -> None: + """Test that invalid source raises KeyError.""" + with pytest.raises(KeyError): + get_conversion_rate( + from_iso3="USA", + to_iso3="USA", + country="USA", + from_year=2020, + to_year=2020, + source="invalid_source", + ) + + def test_caching_behavior(self) -> None: + """Test that function results are cached.""" + # Call function twice with same parameters + rate1 = get_conversion_rate( + from_iso3="USA", + to_iso3="DEU", + country="USA", + from_year=2018, + to_year=2019, + ) + rate2 = get_conversion_rate( + from_iso3="USA", + to_iso3="DEU", + country="USA", + from_year=2018, + to_year=2019, + ) + + # Results should be identical (cached) + assert rate1 == rate2 + + +class TestUnitRegistryGetReferenceCurrency: + """Test cases for UnitRegistry.get_reference_currency method.""" + + def test_single_reference_currency(self) -> None: + """Test that get_reference_currency returns the correct currency when one is defined.""" + ureg = SpecialUnitRegistry() + # UnitRegistry already defines USD_2020 as [currency] in __init__ + reference = ureg.get_reference_currency() + assert reference == "USD_2020" + + def test_no_reference_currency_raises_error(self) -> None: + """Test that ValueError is raised when no reference currency is defined.""" + # Use base pint registry without currency definitions + ureg = SpecialUnitRegistry() + + ureg.define( + "USD_2020 = [not_a_currency]" + ) # Overwrite the default currency definition to not be a currency + + with pytest.raises(ValueError, match="does not have a unique base currency"): + ureg.get_reference_currency() + + def test_multiple_reference_currencies_raises_error(self) -> None: + """Test that ValueError is raised when multiple currencies are defined.""" + ureg = SpecialUnitRegistry() + ureg.define("EUR_2015 = [currency]") + + with pytest.raises(ValueError, match="does not have a unique base currency"): + ureg.get_reference_currency() + + +class TestUnitRegistryEnsureCurrencyIsUnit: + """Test cases for UnitRegistry.ensure_currency_is_unit method.""" + + def test_no_currency_units_does_nothing(self) -> None: + """Test that method does nothing when no currency units are present.""" + ureg = SpecialUnitRegistry() + initial_units = set(ureg._units.keys()) + + ureg.ensure_currency_is_unit("kW/hour") + + # No new units should be added + assert set(ureg._units.keys()) == initial_units + + def test_empty_string_does_nothing(self) -> None: + """Test that method does nothing with empty string.""" + ureg = SpecialUnitRegistry() + initial_units = set(ureg._units.keys()) + + ureg.ensure_currency_is_unit("") + + # No new units should be added + assert set(ureg._units.keys()) == initial_units + + def test_already_defined_currency_not_redefined(self) -> None: + """Test that already defined currency units are not redefined.""" + ureg = SpecialUnitRegistry() + # USD_2020 is already defined in UnitRegistry.__init__ + + # Should not raise an error or redefine + ureg.ensure_currency_is_unit("USD_2020/kW") + + # Verify USD_2020 is still defined + assert "USD_2020" in ureg._units + + def test_new_currency_unit_gets_defined(self) -> None: + """Test that new currency units get defined relative to reference currency.""" + ureg = SpecialUnitRegistry() + + # EUR_2015 should not be defined initially + assert "EUR_2015" not in ureg._units + + ureg.ensure_currency_is_unit("EUR_2015/kW") + + # EUR_2015 should now be defined + assert "EUR_2015" in ureg._units + + # Verify it's defined relative to the reference currency (USD_2020) + eur_unit = ureg._units["EUR_2015"] + assert "USD_2020" in str(eur_unit) + + def test_multiple_currency_units_get_defined(self) -> None: + """Test that multiple new currency units get defined.""" + ureg = SpecialUnitRegistry() + + # Neither should be defined initially + assert "EUR_2015" not in ureg._units + assert "GBP_2018" not in ureg._units + + ureg.ensure_currency_is_unit("EUR_2015/GBP_2018/kW") + + # Both should now be defined + assert "EUR_2015" in ureg._units + assert "GBP_2018" in ureg._units + + def test_mix_of_existing_and_new_currencies(self) -> None: + """Test handling mix of existing and new currency units.""" + ureg = SpecialUnitRegistry() + + # USD_2020 already exists, CAD_2019 doesn't + assert "USD_2020" in ureg._units + assert "CAD_2019" not in ureg._units + + ureg.ensure_currency_is_unit("USD_2020/CAD_2019") + + # Both should be defined + assert "USD_2020" in ureg._units + assert "CAD_2019" in ureg._units + + def test_currency_defined_with_nan_conversion(self) -> None: + """Test that new currencies are defined with nan conversion factor.""" + ureg = SpecialUnitRegistry() + + ureg.ensure_currency_is_unit("JPY_2021/kW") + + # Verify JPY_2021 is defined with nan relative to reference currency + jpy_unit = ureg._units["JPY_2021"] + assert "nan" in str(jpy_unit) or "NaN" in str(jpy_unit).lower() + + def test_complex_unit_string_with_currency(self) -> None: + """Test handling of complex unit strings containing currencies.""" + ureg = SpecialUnitRegistry() + + assert "CHF_2022" not in ureg._units + + ureg.ensure_currency_is_unit("CHF_2022/kW/year") + + assert "CHF_2022" in ureg._units + + def test_same_currency_different_years(self) -> None: + """Test that same currency with different years creates separate units.""" + ureg = SpecialUnitRegistry() + + ureg.ensure_currency_is_unit("EUR_2015/EUR_2020") + + # Both year variants should be defined + assert "EUR_2015" in ureg._units + assert "EUR_2020" in ureg._units + + def test_invalid_currency_code_raises_error(self) -> None: + """Test that invalid currency codes raise ValueError.""" + ureg = SpecialUnitRegistry() + + with pytest.raises(ValueError, match="invalid 3-letter currency codes"): + ureg.ensure_currency_is_unit("XYZ_2020/kW") + + +class TestCarrierRegistry: + """Test cases for creg (carrier registry) functionality.""" + + def test_creg_registry_parses_carriers(self) -> None: + """Test that the carrier registry (creg) loads carrier units from carriers.txt and can create Quantities.""" + expected_carriers = [ + "electricity", + "hydrogen", + "natural_gas", + "coal", + "diesel", + ] + for carrier in expected_carriers: + assert carrier in creg, f"Carrier '{carrier}' not found in creg registry." + q = creg.Quantity(1, carrier) + assert q.units == creg.Unit(carrier) + + +class TestHeatingValueRegistry: + """Test cases for hvreg (heating value registry) functionality.""" + + def test_hvreg_registry_parses_heating_values(self) -> None: + """Test that heating value registry (hvreg) loads heating value units from heating_values.txt and can create Quantities.""" + expected_hvs = [ + "LHV", + "HHV", + "NCV", + "GCV", + ] + for fuel in expected_hvs: + assert fuel in hvreg, f"Fuel '{fuel}' not found in hvreg registry." + q = hvreg.Quantity(1, fuel) + assert q.units == hvreg.Unit(fuel) + + def test_hvreg_units_compatability(self) -> None: + """Test that the same heating values are compatible, but different hvs are not.""" + compatible_hvs = ( + ["LHV", "NCV", "lower_heating_value"], + ["HHV", "GCV", "higher_heating_value"], + ) + for hvs in compatible_hvs: + units = [hvreg.Unit(hv) for hv in hvs] + + # Check compatibility + assert all(units[0].is_compatible_with(u) for u in units[1:]), ( + f"Units {units} should be compatible." + ) + + +class TestGetIso3FromCurrencyCode: + """Test cases for get_iso3_from_currency_code function.""" + + def test_special_case_currencies(self) -> None: + """Test that special case currencies return correct ISO3 codes.""" + # Test some known special cases + assert get_iso3_from_currency_code("USD") == "USA" + assert get_iso3_from_currency_code("EUR") == "EUR" + assert get_iso3_from_currency_code("GBP") == "GBR" + assert get_iso3_from_currency_code("CHF") == "CHE" + assert get_iso3_from_currency_code("NOK") == "NOR" + + def test_regular_currency_codes(self) -> None: + """Test that regular (non-special case) currency codes work correctly.""" + # Test currencies that should have unique mappings + result = get_iso3_from_currency_code("JPY") + assert result == "JPN" + + result = get_iso3_from_currency_code("CAD") + assert result == "CAN" + + def test_invalid_currency_code_raises_error(self) -> None: + """Test that invalid currency codes raise ValueError.""" + with pytest.raises(ValueError, match="Currency code 'XYZ' not found"): + get_iso3_from_currency_code("XYZ") + + with pytest.raises(ValueError, match="Currency code 'INVALID' not found"): + get_iso3_from_currency_code("INVALID") + + def test_empty_currency_code_raises_error(self) -> None: + """Test that empty currency code raises ValueError.""" + with pytest.raises(ValueError, match="Currency code '' not found"): + get_iso3_from_currency_code("") + + def test_case_sensitivity(self) -> None: + """Test that currency codes are case sensitive.""" + # Valid uppercase + assert get_iso3_from_currency_code("USD") == "USA" + + # Invalid lowercase should raise error + with pytest.raises(ValueError, match="Currency code 'usd' not found"): + get_iso3_from_currency_code("usd") + + def test_empty_special_cases(self) -> None: + """Test behavior with empty special cases dictionary.""" + # With empty special cases, USD should not be handled specially + # This might raise an error if USD has multiple ISO3 mappings + + try: + result = get_iso3_from_currency_code("USD", special_cases=frozendict({})) + # If no error, USD has a unique mapping + assert isinstance(result, str) + assert len(result) == 3 + except ValueError as e: + # Expected if USD has multiple mappings and needs special handling + assert "Some currency codes are used by multiple ISO3 codes" in str(e) + + def test_function_caching(self) -> None: + """Test that function results are cached (via @lru_cache decorator).""" + # Call function twice with same parameters + result1 = get_iso3_from_currency_code("USD") + result2 = get_iso3_from_currency_code("USD") + + # Results should be identical (cached) + assert result1 == result2 + assert result1 == "USA" + + def test_return_type_is_string(self) -> None: + """Test that function always returns a string.""" + result = get_iso3_from_currency_code("USD") + assert isinstance(result, str) + assert len(result) == 3 # ISO3 codes are always 3 characters + assert result.isupper() # ISO3 codes are uppercase + + def test_all_special_cases_work(self) -> None: + """Test that all predefined special cases work correctly.""" + for ( + currency_code, + expected_iso3, + ) in SPECIAL_CASES_CURRENCY_CODE_TO_ISO3.items(): + result = get_iso3_from_currency_code(currency_code) + assert result == expected_iso3, f"Failed for {currency_code}" + + def test_duplicate_currency_handling_error(self) -> None: + """Test that currencies with multiple ISO3 codes raise appropriate error when not in special cases.""" + # This test verifies the error handling for currencies that appear in multiple countries + # but are not handled in special cases. The exact currencies that trigger this depend + # on the current UN data, so we test the error mechanism rather than specific currencies. + + # Use empty special cases to potentially trigger the duplicate handling error + try: + special_cases = SPECIAL_CASES_CURRENCY_CODE_TO_ISO3.delete( + "USD" + ) # Remove USD to force error + # Try a currency that might have multiple mappings + get_iso3_from_currency_code("XCD", special_cases=special_cases) + except ValueError as e: + # If it's a duplicate currency error, check the message format + assert "Some currency codes are used by multiple ISO3 codes" in str(e) diff --git a/uv.lock b/uv.lock index 91c5b29f..edc2b8ae 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,15 @@ version = 1 revision = 2 requires-python = ">=3.12" +[[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, upload_time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, +] + [[package]] name = "appnope" version = "0.1.4" @@ -52,6 +61,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, ] +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, +] + [[package]] name = "binaryornot" version = "0.4.4" @@ -306,6 +328,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload_time = "2024-10-09T18:35:44.272Z" }, ] +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, +] + [[package]] name = "execnet" version = "2.1.1" @@ -333,6 +364,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, ] +[[package]] +name = "flexcache" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, +] + +[[package]] +name = "flexparser" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, +] + +[[package]] +name = "frictionless" +version = "5.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "chardet" }, + { name = "humanize" }, + { name = "isodate" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "marko" }, + { name = "petl" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "python-slugify" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rfc3986" }, + { name = "simpleeval" }, + { name = "tabulate" }, + { name = "typer" }, + { name = "typing-extensions" }, + { name = "validators" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, +] + +[[package]] +name = "frozendict" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload_time = "2024-10-13T12:15:32.449Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload_time = "2024-10-13T12:15:26.839Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload_time = "2024-10-13T12:15:28.16Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload_time = "2024-10-13T12:15:29.495Z" }, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -381,6 +477,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload_time = "2025-04-23T11:29:07.145Z" }, ] +[[package]] +name = "hdx-python-country" +version = "3.9.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hdx-python-utilities" }, + { name = "libhxl" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/96/ac55b204699cd216a22a943f64aafac32bba818f624a5d44879d60368fad/hdx_python_country-3.9.6.tar.gz", hash = "sha256:7791f4b9c5ae3e62e82795c266a3ca6ee23c7bab706c91533844edf2ebd9bb18", size = 529232, upload_time = "2025-07-09T22:56:32.162Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/90/646b56ec12df459799510d6d0869ada210ad9f765ad104e50dae4867eb50/hdx_python_country-3.9.6-py3-none-any.whl", hash = "sha256:4c1833bdf3cbd14dfff0146e0bdcae5763931d344fce5f1b42493dc8751e3d4a", size = 55554, upload_time = "2025-07-09T22:56:30.128Z" }, +] + +[[package]] +name = "hdx-python-utilities" +version = "3.8.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frictionless" }, + { name = "ijson" }, + { name = "jsonlines" }, + { name = "loguru" }, + { name = "openpyxl" }, + { name = "pyphonetics" }, + { name = "python-dateutil" }, + { name = "ratelimit" }, + { name = "requests-file" }, + { name = "ruamel-yaml" }, + { name = "tableschema-to-template" }, + { name = "xlrd" }, + { name = "xlsx2csv" }, + { name = "xlwt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009, upload_time = "2025-05-14T02:31:28.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787, upload_time = "2025-05-14T02:31:26.794Z" }, +] + [[package]] name = "htmlmin2" version = "0.1.13" @@ -389,6 +524,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, ] +[[package]] +name = "humanize" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514, upload_time = "2025-04-30T11:51:07.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487, upload_time = "2025-04-30T11:51:06.468Z" }, +] + [[package]] name = "identify" version = "2.6.12" @@ -407,6 +551,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] +[[package]] +name = "ijson" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, +] + +[[package]] +name = "imf-reader" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "chardet" }, + { name = "pandas" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990, upload_time = "2025-02-06T09:16:10.723Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520, upload_time = "2025-02-06T09:16:09.042Z" }, +] + [[package]] name = "iniconfig" version = "2.1.0" @@ -473,6 +673,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, ] +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, +] + [[package]] name = "jedi" version = "0.19.2" @@ -497,12 +706,72 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "joblib" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload_time = "2025-05-23T12:04:37.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload_time = "2025-05-23T12:04:35.124Z" }, +] + [[package]] name = "jsmin" version = "3.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } +[[package]] +name = "jsonlines" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, +] + +[[package]] +name = "jsonpath-ng" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ply" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.24.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/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480, upload_time = "2025-05-26T18:48:10.459Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709, upload_time = "2025-05-26T18:48:08.417Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, +] + [[package]] name = "jupyter-client" version = "8.6.3" @@ -533,6 +802,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, ] +[[package]] +name = "libhxl" +version = "5.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpath-ng" }, + { name = "ply" }, + { name = "python-dateutil" }, + { name = "python-io-wrapper" }, + { name = "requests" }, + { name = "structlog" }, + { name = "unidecode" }, + { name = "urllib3" }, + { name = "wheel" }, + { name = "xlrd3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } + [[package]] name = "license-expression" version = "30.4.4" @@ -545,6 +832,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, ] +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, +] + [[package]] name = "markdown" version = "3.8.2" @@ -554,6 +854,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload_time = "2025-06-19T17:12:42.994Z" }, ] +[[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, upload_time = "2023-06-03T06:41:14.443Z" } +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, upload_time = "2023-06-03T06:41:11.019Z" }, +] + +[[package]] +name = "marko" +version = "2.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795, upload_time = "2025-06-13T03:25:50.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186, upload_time = "2025-06-13T03:25:49.858Z" }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -604,6 +925,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "mergedeep" version = "1.3.4" @@ -875,6 +1205,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376, upload_time = "2025-06-21T12:24:56.884Z" }, ] +[[package]] +name = "oda-reader" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "openpyxl" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630, upload_time = "2025-06-16T16:15:05.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314, upload_time = "2025-06-16T16:15:04.328Z" }, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -945,6 +1303,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, ] +[[package]] +name = "petl" +version = "1.7.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780, upload_time = "2025-04-04T23:54:50.921Z" } + [[package]] name = "pexpect" version = "4.9.0" @@ -957,6 +1321,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, ] +[[package]] +name = "pint" +version = "0.24.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flexcache" }, + { name = "flexparser" }, + { name = "platformdirs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload_time = "2024-11-07T16:29:46.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload_time = "2024-11-07T16:29:43.976Z" }, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -975,6 +1354,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "ply" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, +] + [[package]] name = "pre-commit" version = "4.2.0" @@ -1036,6 +1424,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, ] +[[package]] +name = "pyarrow" +version = "20.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, +] + [[package]] name = "pycparser" version = "2.22" @@ -1045,6 +1468,81 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, ] +[[package]] +name = "pydantic" +version = "2.11.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload_time = "2025-06-14T08:33:17.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload_time = "2025-06-14T08:33:14.905Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, +] + +[[package]] +name = "pydeflate" +version = "2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hdx-python-country" }, + { name = "imf-reader" }, + { name = "oda-reader" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "requests" }, + { name = "wbgapi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586, upload_time = "2025-06-03T09:38:12.25Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540, upload_time = "2025-06-03T09:38:10.858Z" }, +] + [[package]] name = "pygments" version = "2.19.2" @@ -1067,6 +1565,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143, upload_time = "2025-06-21T17:56:35.356Z" }, ] +[[package]] +name = "pyphonetics" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, +] + [[package]] name = "pytest" version = "8.4.1" @@ -1134,6 +1644,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, ] +[[package]] +name = "python-io-wrapper" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, +] + [[package]] name = "pytz" version = "2025.2" @@ -1224,6 +1752,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload_time = "2025-06-13T14:08:00.777Z" }, ] +[[package]] +name = "ratelimit" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, +] + [[package]] name = "requests" version = "2.32.4" @@ -1239,6 +1787,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" }, ] +[[package]] +name = "requests-file" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, +] + [[package]] name = "reuse" version = "5.0.2" @@ -1258,6 +1818,142 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309, upload_time = "2024-11-14T09:33:15.047Z" }, ] +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, +] + +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload_time = "2025-07-01T15:57:13.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload_time = "2025-07-01T15:54:15.734Z" }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload_time = "2025-07-01T15:54:16.922Z" }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload_time = "2025-07-01T15:54:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload_time = "2025-07-01T15:54:19.295Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload_time = "2025-07-01T15:54:20.858Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload_time = "2025-07-01T15:54:22.508Z" }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload_time = "2025-07-01T15:54:23.987Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload_time = "2025-07-01T15:54:25.073Z" }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload_time = "2025-07-01T15:54:26.225Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload_time = "2025-07-01T15:54:27.424Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload_time = "2025-07-01T15:54:29.93Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload_time = "2025-07-01T15:54:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload_time = "2025-07-01T15:54:32.195Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload_time = "2025-07-01T15:54:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload_time = "2025-07-01T15:54:34.755Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload_time = "2025-07-01T15:54:36.292Z" }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload_time = "2025-07-01T15:54:37.469Z" }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload_time = "2025-07-01T15:54:38.954Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload_time = "2025-07-01T15:54:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload_time = "2025-07-01T15:54:43.025Z" }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload_time = "2025-07-01T15:54:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload_time = "2025-07-01T15:54:46.043Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload_time = "2025-07-01T15:54:47.64Z" }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload_time = "2025-07-01T15:54:48.9Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload_time = "2025-07-01T15:54:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload_time = "2025-07-01T15:54:52.023Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload_time = "2025-07-01T15:54:53.692Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload_time = "2025-07-01T15:54:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload_time = "2025-07-01T15:54:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload_time = "2025-07-01T15:54:58.561Z" }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload_time = "2025-07-01T15:54:59.751Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload_time = "2025-07-01T15:55:00.898Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload_time = "2025-07-01T15:55:02.201Z" }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload_time = "2025-07-01T15:55:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload_time = "2025-07-01T15:55:05.398Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload_time = "2025-07-01T15:55:08.316Z" }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload_time = "2025-07-01T15:55:09.52Z" }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload_time = "2025-07-01T15:55:11.216Z" }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload_time = "2025-07-01T15:55:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload_time = "2025-07-01T15:55:14.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload_time = "2025-07-01T15:55:15.745Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload_time = "2025-07-01T15:55:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload_time = "2025-07-01T15:55:18.922Z" }, + { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload_time = "2025-07-01T15:55:20.399Z" }, + { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload_time = "2025-07-01T15:55:21.729Z" }, + { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload_time = "2025-07-01T15:55:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload_time = "2025-07-01T15:55:24.207Z" }, + { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload_time = "2025-07-01T15:55:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload_time = "2025-07-01T15:55:27.798Z" }, + { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload_time = "2025-07-01T15:55:29.057Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload_time = "2025-07-01T15:55:30.719Z" }, + { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload_time = "2025-07-01T15:55:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload_time = "2025-07-01T15:55:33.312Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload_time = "2025-07-01T15:55:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload_time = "2025-07-01T15:55:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload_time = "2025-07-01T15:55:37.483Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload_time = "2025-07-01T15:55:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload_time = "2025-07-01T15:55:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload_time = "2025-07-01T15:55:42.015Z" }, + { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload_time = "2025-07-01T15:55:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload_time = "2025-07-01T15:55:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload_time = "2025-07-01T15:55:47.098Z" }, + { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload_time = "2025-07-01T15:55:48.412Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload_time = "2025-07-01T15:55:49.816Z" }, + { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload_time = "2025-07-01T15:55:51.192Z" }, + { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload_time = "2025-07-01T15:55:52.541Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload_time = "2025-07-01T15:55:53.874Z" }, + { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload_time = "2025-07-01T15:55:55.167Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload_time = "2025-06-09T08:51:09.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload_time = "2025-06-09T08:51:06.348Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, +] + [[package]] name = "savepagenow" version = "1.3.0" @@ -1271,6 +1967,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "simpleeval" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1289,6 +2003,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, ] +[[package]] +name = "soupsieve" +version = "2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, +] + [[package]] name = "stack-data" version = "0.6.3" @@ -1303,14 +2026,51 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, ] +[[package]] +name = "structlog" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, +] + +[[package]] +name = "tableschema-to-template" +version = "0.0.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "pyyaml" }, + { name = "xlsxwriter" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, +] + [[package]] name = "technologydata" source = { editable = "." } dependencies = [ + { name = "frozendict" }, + { name = "hdx-python-country" }, { name = "ipykernel" }, { name = "mypy" }, { name = "pandas" }, + { name = "pint" }, { name = "pre-commit" }, + { name = "pydantic" }, + { name = "pydeflate" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "pytest-xdist" }, @@ -1332,6 +2092,8 @@ docs = [ [package.metadata] requires-dist = [ + { name = "frozendict", specifier = ">=2.4.6" }, + { name = "hdx-python-country", specifier = ">=3.9.6" }, { name = "ipykernel", specifier = ">=6.29.5" }, { name = "mkdocs-autolinks-plugin", marker = "extra == 'docs'", specifier = ">=0.7.1" }, { name = "mkdocs-git-revision-date-localized-plugin", marker = "extra == 'docs'", specifier = ">=1.4.7" }, @@ -1342,7 +2104,10 @@ requires-dist = [ { name = "mkdocstrings-python", marker = "extra == 'docs'", specifier = ">=1.16.11" }, { name = "mypy", specifier = ">=1.15.0" }, { name = "pandas", specifier = ">=2.2.3" }, + { name = "pint", specifier = ">=0.24.4" }, { name = "pre-commit", specifier = ">=4.2.0" }, + { name = "pydantic", specifier = ">=2.11.7" }, + { name = "pydeflate", specifier = ">=2.1.3" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-cov", specifier = ">=6.2.1" }, { name = "pytest-xdist", specifier = ">=3.8.0" }, @@ -1352,6 +2117,24 @@ requires-dist = [ ] provides-extras = ["docs"] +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, +] + [[package]] name = "tomlkit" version = "0.13.3" @@ -1389,6 +2172,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, ] +[[package]] +name = "typer" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload_time = "2025-05-26T14:30:31.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload_time = "2025-05-26T14:30:30.523Z" }, +] + [[package]] name = "typing-extensions" version = "4.14.1" @@ -1398,6 +2196,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, ] +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, +] + [[package]] name = "tzdata" version = "2025.2" @@ -1407,6 +2217,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, ] +[[package]] +name = "unidecode" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1416,6 +2235,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, ] +[[package]] +name = "validators" +version = "0.35.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, +] + [[package]] name = "virtualenv" version = "20.31.2" @@ -1454,6 +2282,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, ] +[[package]] +name = "wbgapi" +version = "1.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "requests" }, + { name = "tabulate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, +] + [[package]] name = "wcwidth" version = "0.2.13" @@ -1462,3 +2304,66 @@ sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc wheels = [ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, ] + +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, +] + +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, +] + +[[package]] +name = "xlrd" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, +] + +[[package]] +name = "xlrd3" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, +] + +[[package]] +name = "xlsx2csv" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, +] + +[[package]] +name = "xlsxwriter" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306, upload_time = "2025-06-17T08:59:14.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347, upload_time = "2025-06-17T08:59:13.453Z" }, +] + +[[package]] +name = "xlwt" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, +] From 105578b9b0015bde54366fc281d08ee5047c6273 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:44:47 +0200 Subject: [PATCH 06/81] code: add OOP to test suites (#21) --- test/test_commons.py | 258 +++++++++-------- test/test_datapackage.py | 38 +-- test/test_source.py | 366 ++++++++++++------------ test/test_source_collection.py | 445 +++++++++++++++-------------- test/test_technology_collection.py | 179 ++++++------ 5 files changed, 667 insertions(+), 619 deletions(-) diff --git a/test/test_commons.py b/test/test_commons.py index 95bf5ad8..c242f863 100644 --- a/test/test_commons.py +++ b/test/test_commons.py @@ -11,131 +11,143 @@ import technologydata -@pytest.mark.parametrize( - "input_datetime_string, date_format, expected_date", - [ - ( - "2025-05-20 14:45:00", - technologydata.DateFormatEnum.SOURCES_CSV, - "2025-05-20 14:45:00", - ), - ( - "20250520144500", - technologydata.DateFormatEnum.SOURCES_CSV, - "2025-05-20 14:45:00", - ), - ( - "2025-05-20 14:45:00", - technologydata.DateFormatEnum.WAYBACK, - "20250520144500", - ), - ("20250520144500", technologydata.DateFormatEnum.WAYBACK, "20250520144500"), - ("2025-05-20 14:45:00", technologydata.DateFormatEnum.NONE, ""), - ("invalid-date-string", technologydata.DateFormatEnum.SOURCES_CSV, ValueError), - ("2025/13/01", technologydata.DateFormatEnum.SOURCES_CSV, ValueError), - ], -) # type: ignore -def test_change_datetime_format( - input_datetime_string: str, - date_format: technologydata.DateFormatEnum, - expected_date: str | typing.Any, -) -> None: - """Check if the datetime is correctly transformed to a new format.""" - if expected_date is ValueError: - with pytest.raises(ValueError, match="Error during datetime formatting"): - technologydata.Commons.change_datetime_format( +class TestCommonsUtils: + """Test suite for the Commons utility functions in the technologydata module.""" + + @pytest.mark.parametrize( + "input_datetime_string, date_format, expected_date", + [ + ( + "2025-05-20 14:45:00", + technologydata.DateFormatEnum.SOURCES_CSV, + "2025-05-20 14:45:00", + ), + ( + "20250520144500", + technologydata.DateFormatEnum.SOURCES_CSV, + "2025-05-20 14:45:00", + ), + ( + "2025-05-20 14:45:00", + technologydata.DateFormatEnum.WAYBACK, + "20250520144500", + ), + ("20250520144500", technologydata.DateFormatEnum.WAYBACK, "20250520144500"), + ("2025-05-20 14:45:00", technologydata.DateFormatEnum.NONE, ""), + ( + "invalid-date-string", + technologydata.DateFormatEnum.SOURCES_CSV, + ValueError, + ), + ("2025/13/01", technologydata.DateFormatEnum.SOURCES_CSV, ValueError), + ], + ) # type: ignore + def test_change_datetime_format( + self, + input_datetime_string: str, + date_format: technologydata.DateFormatEnum, + expected_date: str | typing.Any, + ) -> None: + """Check if the datetime is correctly transformed to a new format.""" + if expected_date is ValueError: + with pytest.raises(ValueError, match="Error during datetime formatting"): + technologydata.Commons.change_datetime_format( + input_datetime_string, date_format + ) + else: + result = technologydata.Commons.change_datetime_format( input_datetime_string, date_format ) - else: - result = technologydata.Commons.change_datetime_format( - input_datetime_string, date_format - ) - assert result == expected_date - - -@pytest.mark.parametrize( - "input_string, expected_string", - [ - ( - "Hello, World! Welcome to Python @ 2023.", - "hello_world_welcome_to_python_2023", - ), - ( - " Special#Characters$Are%Fun! ", - "special_characters_are_fun", - ), - ( - "!!!LeadingAndTrailing!!!", - "leadingandtrailing", - ), - ], -) # type: ignore -def test_replace_special_characters( - input_string: str, - expected_string: str, -) -> None: - """Check if the special characters are removed from a string and the string is lowercased.""" - assert ( - technologydata.Commons.replace_special_characters(input_string) - == expected_string - ) + assert result == expected_date + @pytest.mark.parametrize( + "input_string, expected_string", + [ + ( + "Hello, World! Welcome to Python @ 2023.", + "hello_world_welcome_to_python_2023", + ), + ( + " Special#Characters$Are%Fun! ", + "special_characters_are_fun", + ), + ( + "!!!LeadingAndTrailing!!!", + "leadingandtrailing", + ), + ], + ) # type: ignore + def test_replace_special_characters( + self, + input_string: str, + expected_string: str, + ) -> None: + """Check if the special characters are removed from a string and the string is lowercased.""" + assert ( + technologydata.Commons.replace_special_characters(input_string) + == expected_string + ) -@pytest.mark.parametrize( - "input_string, expected_string", - [ - ("text/plain", ".txt"), - ("text/html", ".html"), - ("text/csv", ".csv"), - ("text/xml", ".xml"), - ("application/vnd.ms-excel", ".xls"), - ("application/vnd.oasis.opendocument.spreadsheet", ".ods"), - ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx"), - ("application/json", ".json"), - ("application/xml", ".xml"), - ("application/pdf", ".pdf"), - ("application/parquet", ".parquet"), - ("application/vdn.apache.parquet", ".parquet"), - ("application/x-rar-compressed", ".rar"), - ("application/vnd.rar", ".rar"), - ("application/zip", ".zip"), - ("application/x-zip-compressed", ".zip"), - ], -) # type: ignore -def test_get_extension( - input_string: str, - expected_string: str, -) -> None: - """Check if the correct file extension is associated to a given MIME type.""" - assert ( - technologydata.FileExtensionEnum.get_extension(input_string) == expected_string - ) - + @pytest.mark.parametrize( + "input_string, expected_string", + [ + ("text/plain", ".txt"), + ("text/html", ".html"), + ("text/csv", ".csv"), + ("text/xml", ".xml"), + ("application/vnd.ms-excel", ".xls"), + ("application/vnd.oasis.opendocument.spreadsheet", ".ods"), + ( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xlsx", + ), + ("application/json", ".json"), + ("application/xml", ".xml"), + ("application/pdf", ".pdf"), + ("application/parquet", ".parquet"), + ("application/vdn.apache.parquet", ".parquet"), + ("application/x-rar-compressed", ".rar"), + ("application/vnd.rar", ".rar"), + ("application/zip", ".zip"), + ("application/x-zip-compressed", ".zip"), + ], + ) # type: ignore + def test_get_extension( + self, + input_string: str, + expected_string: str, + ) -> None: + """Check if the correct file extension is associated to a given MIME type.""" + assert ( + technologydata.FileExtensionEnum.get_extension(input_string) + == expected_string + ) -@pytest.mark.parametrize( - "input_string, expected_string", - [ - ("https://example.com/file.txt", ".txt"), - ("https://example.com/file.html", ".html"), - ("https://example.com/file.csv", ".csv"), - ("https://example.com/file.xml", ".xml"), - ("https://example.com/file.xls", ".xls"), - ("https://example.com/file.ods", ".ods"), - ("https://example.com/file.xlsx", ".xlsx"), - ("https://example.com/file.json", ".json"), - ("https://example.com/file.pdf", ".pdf"), - ("https://example.com/file.parquet", ".parquet"), - ("https://example.com/file.rar", ".rar"), - ("https://example.com/file.zip", ".zip"), - ("https://example.com/file.unknown", None), - ], -) # type: ignore -def test_search_file_extension_in_url( - input_string: str, - expected_string: str, -) -> None: - """Check if the correct file extension is found in a given url.""" - assert ( - technologydata.FileExtensionEnum.search_file_extension_in_url(input_string) - == expected_string - ) + @pytest.mark.parametrize( + "input_string, expected_string", + [ + ("https://example.com/file.txt", ".txt"), + ("https://example.com/file.html", ".html"), + ("https://example.com/file.csv", ".csv"), + ("https://example.com/file.xml", ".xml"), + ("https://example.com/file.xls", ".xls"), + ("https://example.com/file.ods", ".ods"), + ("https://example.com/file.xlsx", ".xlsx"), + ("https://example.com/file.json", ".json"), + ("https://example.com/file.pdf", ".pdf"), + ("https://example.com/file.parquet", ".parquet"), + ("https://example.com/file.rar", ".rar"), + ("https://example.com/file.zip", ".zip"), + ("https://example.com/file.unknown", None), + ], + ) # type: ignore + def test_search_file_extension_in_url( + self, + input_string: str, + expected_string: str, + ) -> None: + """Check if the correct file extension is found in a given url.""" + assert ( + technologydata.FileExtensionEnum.search_file_extension_in_url(input_string) + == expected_string + ) diff --git a/test/test_datapackage.py b/test/test_datapackage.py index 5e84e940..d1611fe9 100644 --- a/test/test_datapackage.py +++ b/test/test_datapackage.py @@ -11,19 +11,25 @@ path_cwd = pathlib.Path.cwd() -def test_get_source_collection() -> None: - """Test how the sources attributes is extracted from a TechnologyCollection instance.""" - input_file = pathlib.Path( - path_cwd, - "test", - "test_data", - "solar_photovoltaics_example_03", - "technologies.json", - ) - technologies_collection = technologydata.TechnologyCollection.from_json(input_file) - data_package = technologydata.DataPackage( - technologies=technologies_collection, - ) - data_package.get_source_collection() - assert isinstance(data_package.sources, technologydata.SourceCollection) - assert len(data_package.sources) == 2 +class TestDatapackage: + """Test suite for the Datapackage class in the technologydata module.""" + + def test_get_source_collection(self) -> None: + """Test how the sources attributes is extracted from a TechnologyCollection instance.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + + technologies_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + data_package = technologydata.DataPackage( + technologies=technologies_collection, + ) + data_package.get_source_collection() + assert isinstance(data_package.sources, technologydata.SourceCollection) + assert len(data_package.sources) == 2 diff --git a/test/test_source.py b/test/test_source.py index 94c8db4d..c889b627 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -14,21 +14,67 @@ path_cwd = pathlib.Path.cwd() -@pytest.mark.parametrize( - "example_source, expected_equal", - [ - ( +class TestSource: + """Test suite for the Source class in the technologydata module.""" + + @pytest.mark.parametrize( + "example_source, expected_equal", + [ + ( + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https:download", + "source_url_archive": "http:/3273/download", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + False, # Expect not equal + ), + ( + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https:download", + "source_url_archive": "http:/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + True, # Expect equal + ), + ( + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + }, + False, # Expect not equal + ), + ], + indirect=["example_source"], + ) # type: ignore + def test_eq( + self, example_source: technologydata.Source, expected_equal: bool + ) -> None: + """Check if the override method __eq__ works as expected.""" + reference_source = technologydata.Source( + title="tech_data_generation", + authors="Danish Energy Agency", + url="https:download", + url_archive="http:/3273/download", + url_date="2025-05-06 16:02:04", + url_date_archive="2025-05-06 16:02:04", + ) + assert (example_source == reference_source) == expected_equal + + @pytest.mark.parametrize( + "example_source", + [ { "source_title": "atb_nrel", "source_authors": "NREL/ATB", - "source_url": "https:download", "source_url_archive": "http:/3273/download", - "source_url_date": "2025-05-22 15:08:02", "source_url_date_archive": "2025-05-22 15:08:02", }, - False, # Expect not equal - ), - ( { "source_title": "tech_data_generation", "source_authors": "Danish Energy Agency", @@ -37,184 +83,142 @@ "source_url_date": "2025-05-06 16:02:04", "source_url_date_archive": "2025-05-06 16:02:04", }, - True, # Expect equal - ), - ( + ], + indirect=["example_source"], + ) # type: ignore + def test_hash(self, example_source: technologydata.Source) -> None: + """Check if the override method __hash__ works as expected.""" + assert isinstance(hash(example_source), int) + + @pytest.mark.parametrize( + "example_source, expected_string", + [ + ( + { + "source_title": "OET project page", + "source_authors": "Open Energy Transition gGmbH", + "source_url": "https://outputs.html", + "source_url_archive": "https:archived.html", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + "'Open Energy Transition gGmbH': 'OET project page', from url 'https://outputs.html', last accessed on '2025-05-06 16:02:04', archived at 'https:archived.html', on '2025-05-06 16:02:04'.", + ) + ], + indirect=["example_source"], + ) # type: ignore + def test_str( + self, example_source: technologydata.Source, expected_string: str + ) -> None: + """Check if the override method __str__ works as expected.""" + # Ensure the snapshot is created + assert str(example_source) == expected_string + + @pytest.mark.parametrize( + "example_source", + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, { "source_title": "tech_data_generation", "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", }, - False, # Expect not equal - ), - ], - indirect=["example_source"], -) # type: ignore -def test_eq(example_source: technologydata.Source, expected_equal: bool) -> None: - """Check if the override method __eq__ works as expected.""" - reference_source = technologydata.Source( - title="tech_data_generation", - authors="Danish Energy Agency", - url="https:download", - url_archive="http:/3273/download", - url_date="2025-05-06 16:02:04", - url_date_archive="2025-05-06 16:02:04", - ) - assert (example_source == reference_source) == expected_equal - - -@pytest.mark.parametrize( - "example_source", - [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url_archive": "http:/3273/download", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https:download", - "source_url_archive": "http:/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, - ], - indirect=["example_source"], -) # type: ignore -def test_hash(example_source: technologydata.Source) -> None: - """Check if the override method __hash__ works as expected.""" - assert isinstance(hash(example_source), int) - - -@pytest.mark.parametrize( - "example_source, expected_string", - [ - ( + ], + indirect=["example_source"], + ) # type: ignore + def test_retrieve_from_wayback(self, example_source: technologydata.Source) -> None: + """Check if the example source is downloaded from the Internet Archive Wayback Machine.""" + storage_path = example_source.retrieve_from_wayback(path_cwd) + # Check if storage_paths is not None and is a list + assert storage_path is not None, "Expected a valid storage path, but got None." + assert isinstance(storage_path, pathlib.Path), ( + "Expected storage_path to be a pathlib.Path." + ) + assert storage_path is not None, "Expected a valid storage path, but got None." + assert storage_path.is_file(), ( + f"Expected {storage_path} to be a file, but it does not exist." + ) + # Delete the downloaded file + storage_path.unlink(missing_ok=True) + + def test_store_in_wayback(self) -> None: + """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" + url_to_archive = "https://www.openenergytransition.org/outputs.html" + archived_info = technologydata.Source.store_in_wayback(url_to_archive) + + # Check if archived_info is None + assert archived_info is not None, "archived_info should not be None" + + archived_url, new_capture, output_timestamp = archived_info + + assert "https://web.archive.org/web/" in archived_url + assert url_to_archive in archived_url + assert isinstance(new_capture, bool) + + assert output_timestamp is not None, "output_timestamp should not be None" + try: + datetime.datetime.strptime( + output_timestamp, technologydata.DateFormatEnum.SOURCES_CSV + ) + except ValueError: + pytest.fail("Valid date-time string did not match the format") + + @pytest.mark.parametrize( + "example_source", + [ { "source_title": "OET project page", "source_authors": "Open Energy Transition gGmbH", - "source_url": "https://outputs.html", - "source_url_archive": "https:archived.html", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", + "source_url": "https://openenergytransition.org/outputs.html", }, - "'Open Energy Transition gGmbH': 'OET project page', from url 'https://outputs.html', last accessed on '2025-05-06 16:02:04', archived at 'https:archived.html', on '2025-05-06 16:02:04'.", - ) - ], - indirect=["example_source"], -) # type: ignore -def test_str(example_source: technologydata.Source, expected_string: str) -> None: - """Check if the override method __str__ works as expected.""" - # Ensure the snapshot is created - assert str(example_source) == expected_string - - -@pytest.mark.parametrize( - "example_source", - [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_date": "2025-05-22 15:08:02", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https://ens.dk/media/3273/download", - "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, - ], - indirect=["example_source"], -) # type: ignore -def test_retrieve_from_wayback(example_source: technologydata.Source) -> None: - """Check if the example source is downloaded from the Internet Archive Wayback Machine.""" - storage_path = example_source.retrieve_from_wayback(path_cwd) - # Check if storage_paths is not None and is a list - assert storage_path is not None, "Expected a valid storage path, but got None." - assert isinstance(storage_path, pathlib.Path), ( - "Expected storage_path to be a pathlib.Path." - ) - assert storage_path is not None, "Expected a valid storage path, but got None." - assert storage_path.is_file(), ( - f"Expected {storage_path} to be a file, but it does not exist." - ) - # Delete the downloaded file - storage_path.unlink(missing_ok=True) - - -def test_store_in_wayback() -> None: - """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" - url_to_archive = "https://www.openenergytransition.org/outputs.html" - archived_info = technologydata.Source.store_in_wayback(url_to_archive) - - # Check if archived_info is None - assert archived_info is not None, "archived_info should not be None" - - archived_url, new_capture, output_timestamp = archived_info - - assert "https://web.archive.org/web/" in archived_url - assert url_to_archive in archived_url - assert isinstance(new_capture, bool) - - assert output_timestamp is not None, "output_timestamp should not be None" - try: - datetime.datetime.strptime( - output_timestamp, technologydata.DateFormatEnum.SOURCES_CSV + ], + indirect=["example_source"], + ) # type: ignore + def test_ensure_in_wayback(self, example_source: technologydata.Source) -> None: + """Check if the snapshot URL is created correctly.""" + # Ensure the snapshot is created + example_source.ensure_in_wayback() + assert example_source.url_date_archive is not None + assert example_source.url_archive is not None + + @pytest.mark.parametrize( + "url_archived, source_path, source_title, expected_path", + [ + ( + "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + path_cwd, + "title", + pathlib.Path(path_cwd, "title.pdf"), + ), + ( + "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + path_cwd, + "title", + pathlib.Path(path_cwd, "title.parquet"), + ), + ], + ) # type: ignore + def test_get_save_path( + self, + url_archived: str, + source_path: pathlib.Path, + source_title: str, + expected_path: pathlib.Path, + ) -> None: + """Check if the path where to store the file to download follows the requested pattern.""" + assert ( + technologydata.Source._get_save_path( + url_archived, source_path, source_title + ) + == expected_path ) - except ValueError: - pytest.fail("Valid date-time string did not match the format") - - -@pytest.mark.parametrize( - "example_source", - [ - { - "source_title": "OET project page", - "source_authors": "Open Energy Transition gGmbH", - "source_url": "https://openenergytransition.org/outputs.html", - }, - ], - indirect=["example_source"], -) # type: ignore -def test_ensure_in_wayback(example_source: technologydata.Source) -> None: - """Check if the snapshot URL is created correctly.""" - # Ensure the snapshot is created - example_source.ensure_in_wayback() - assert example_source.url_date_archive is not None - assert example_source.url_archive is not None - - -@pytest.mark.parametrize( - "url_archived, source_path, source_title, expected_path", - [ - ( - "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - path_cwd, - "title", - pathlib.Path(path_cwd, "title.pdf"), - ), - ( - "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - path_cwd, - "title", - pathlib.Path(path_cwd, "title.parquet"), - ), - ], -) # type: ignore -def test_get_save_path( - url_archived: str, - source_path: pathlib.Path, - source_title: str, - expected_path: pathlib.Path, -) -> None: - """Check if the path where to store the file to download follows the requested pattern.""" - assert ( - technologydata.Source._get_save_path(url_archived, source_path, source_title) - == expected_path - ) diff --git a/test/test_source_collection.py b/test/test_source_collection.py index fd75356b..62e95a42 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -14,236 +14,253 @@ path_cwd = pathlib.Path.cwd() -@pytest.mark.parametrize( - "example_source_collection, expected_string", - [ - ( +class TestSourceCollection: + """Test suite for the SourceCollection class in the technologydata module.""" + + @pytest.mark.parametrize( + "example_source_collection, expected_string", + [ + ( + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url_date": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + "SourceCollection with 2 sources: " + "'NREL/ATB': 'atb_nrel', last accessed on '2025-05-22 15:08:02', " + "'Danish Energy Agency': 'tech_data_generation', on '2025-05-06 16:02:04'.", + ), + ], + indirect=["example_source_collection"], + ) # type: ignore + def test_str( + self, + example_source_collection: technologydata.SourceCollection, + expected_string: str, + ) -> None: + """Check if the example source collection is cast to string as expected.""" + assert str(example_source_collection) == expected_string + + @pytest.mark.parametrize( + "example_source_collection", + [ + [ + { + "source_title": "Source 1", + "source_authors": "Author 1", + }, + { + "source_title": "Source 2", + "source_authors": "Author 2", + }, + ] + ], + indirect=["example_source_collection"], + ) # type: ignore + def test_example_source_collection( + self, + example_source_collection: technologydata.SourceCollection, + ) -> None: + """Check if the example source collection is instantiated correctly.""" + # Check that the returned object is a SourceCollection + assert isinstance(example_source_collection, technologydata.SourceCollection) + + # Check the number of sources + assert len(example_source_collection.sources) == 2 + + # Check the titles of the sources + assert example_source_collection.sources[0].title == "Source 1" + assert example_source_collection.sources[1].title == "Source 2" + assert example_source_collection.sources[0].authors == "Author 1" + assert example_source_collection.sources[1].authors == "Author 2" + + @pytest.mark.parametrize( + "example_source_collection", + [ [ { "source_title": "atb_nrel", "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", }, { "source_title": "tech_data_generation", "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", "source_url_date_archive": "2025-05-06 16:02:04", }, ], - "SourceCollection with 2 sources: " - "'NREL/ATB': 'atb_nrel', last accessed on '2025-05-22 15:08:02', " - "'Danish Energy Agency': 'tech_data_generation', on '2025-05-06 16:02:04'.", - ), - ], - indirect=["example_source_collection"], -) # type: ignore -def test_str( - example_source_collection: technologydata.SourceCollection, expected_string: str -) -> None: - """Check if the example source collection is cast to string as expected.""" - assert str(example_source_collection) == expected_string - - -@pytest.mark.parametrize( - "example_source_collection", - [ - [ - { - "source_title": "Source 1", - "source_authors": "Author 1", - }, - { - "source_title": "Source 2", - "source_authors": "Author 2", - }, - ] - ], - indirect=["example_source_collection"], -) # type: ignore -def test_example_source_collection( - example_source_collection: technologydata.SourceCollection, -) -> None: - """Check if the example source collection is instantiated correctly.""" - # Check that the returned object is a SourceCollection - assert isinstance(example_source_collection, technologydata.SourceCollection) - - # Check the number of sources - assert len(example_source_collection.sources) == 2 - - # Check the titles of the sources - assert example_source_collection.sources[0].title == "Source 1" - assert example_source_collection.sources[1].title == "Source 2" - assert example_source_collection.sources[0].authors == "Author 1" - assert example_source_collection.sources[1].authors == "Author 2" - - -@pytest.mark.parametrize( - "example_source_collection", - [ - [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_date": "2025-05-22 15:08:02", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https://ens.dk/media/3273/download", - "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, ], - ], - indirect=["example_source_collection"], -) # type: ignore -def test_retrieve_all_from_wayback( - example_source_collection: technologydata.SourceCollection, -) -> None: - """Check if the example source collection is downloaded from the Internet Archive Wayback Machine.""" - storage_paths = example_source_collection.retrieve_all_from_wayback(path_cwd) - - # Check if storage_paths is not None and is a list - assert storage_paths is not None, "Expected storage_paths to be not None." - assert isinstance(storage_paths, list), "Expected storage_paths to be a list." - - # Filter out None values and check the remaining paths - valid_paths = [path for path in storage_paths if path is not None] - - assert all(isinstance(path, pathlib.Path) for path in valid_paths), ( - f"Expected all elements in {valid_paths} to be instances of pathlib.Path." - ) - assert all(path.is_file() for path in valid_paths), ( - f"Expected all elements in {valid_paths} to be a file, but it does not exist." - ) - - # Delete the downloaded files - for path in valid_paths: - path.unlink(missing_ok=True) - - -@pytest.mark.parametrize( - "example_source_collection", - [ + indirect=["example_source_collection"], + ) # type: ignore + def test_retrieve_all_from_wayback( + self, + example_source_collection: technologydata.SourceCollection, + ) -> None: + """Check if the example source collection is downloaded from the Internet Archive Wayback Machine.""" + storage_paths = example_source_collection.retrieve_all_from_wayback(path_cwd) + + # Check if storage_paths is not None and is a list + assert storage_paths is not None, "Expected storage_paths to be not None." + assert isinstance(storage_paths, list), "Expected storage_paths to be a list." + + # Filter out None values and check the remaining paths + valid_paths = [path for path in storage_paths if path is not None] + + assert all(isinstance(path, pathlib.Path) for path in valid_paths), ( + f"Expected all elements in {valid_paths} to be instances of pathlib.Path." + ) + assert all(path.is_file() for path in valid_paths), ( + f"Expected all elements in {valid_paths} to be a file, but it does not exist." + ) + + # Delete the downloaded files + for path in valid_paths: + path.unlink(missing_ok=True) + + @pytest.mark.parametrize( + "example_source_collection", [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_date": "2025-05-22 15:08:02", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https://ens.dk/media/3273/download", - "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], ], - ], - indirect=["example_source_collection"], -) # type: ignore -def test_to_csv(example_source_collection: technologydata.SourceCollection) -> None: - """Check if the example source collection is exported to CSV.""" - output_file = pathlib.Path(path_cwd, "export.csv") - example_source_collection.to_csv(path_or_buf=output_file) - assert output_file.is_file() - output_file.unlink(missing_ok=True) - - -@pytest.mark.parametrize( - "example_source_collection", - [ + indirect=["example_source_collection"], + ) # type: ignore + def test_to_csv( + self, example_source_collection: technologydata.SourceCollection + ) -> None: + """Check if the example source collection is exported to CSV.""" + output_file = pathlib.Path(path_cwd, "export.csv") + example_source_collection.to_csv(path_or_buf=output_file) + assert output_file.is_file() + output_file.unlink(missing_ok=True) + + @pytest.mark.parametrize( + "example_source_collection", [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_date": "2025-05-22 15:08:02", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https://ens.dk/media/3273/download", - "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], ], - ], - indirect=["example_source_collection"], -) # type: ignore -def test_to_json(example_source_collection: technologydata.SourceCollection) -> None: - """Check if the example source collection is exported to JSON.""" - output_file = pathlib.Path(path_cwd, "sources.json") - schema_file = pathlib.Path(path_cwd, "sources.schema.json") - example_source_collection.to_json(pathlib.Path(output_file)) - assert output_file.is_file() - assert schema_file.is_file() - output_file.unlink(missing_ok=True) - schema_file.unlink(missing_ok=True) - - -@pytest.mark.parametrize( - "example_source_collection", - [ + indirect=["example_source_collection"], + ) # type: ignore + def test_to_json( + self, example_source_collection: technologydata.SourceCollection + ) -> None: + """Check if the example source collection is exported to JSON.""" + output_file = pathlib.Path(path_cwd, "sources.json") + schema_file = pathlib.Path(path_cwd, "sources.schema.json") + example_source_collection.to_json(pathlib.Path(output_file)) + assert output_file.is_file() + assert schema_file.is_file() + output_file.unlink(missing_ok=True) + schema_file.unlink(missing_ok=True) + + @pytest.mark.parametrize( + "example_source_collection", [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_date": "2025-05-22 15:08:02", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https://ens.dk/media/3273/download", - "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], ], - ], - indirect=["example_source_collection"], -) # type: ignore -def test_to_dataframe( - example_source_collection: technologydata.SourceCollection, -) -> None: - """Check if the example source collection is exported to pandas dataframe.""" - assert isinstance(example_source_collection.to_dataframe(), pandas.DataFrame) - - -def test_from_json() -> None: - """Check if the example source collection is imported from JSON.""" - input_file = pathlib.Path( - path_cwd, "test", "test_data", "solar_photovoltaics_example_03", "sources.json" - ) - source_collection = technologydata.SourceCollection.from_json(file_path=input_file) - assert isinstance(source_collection, technologydata.SourceCollection) - assert len(source_collection) == 2 - - -@pytest.mark.parametrize( - "title_pattern, authors_pattern", - [["ATB", "nrel"], ["TECH_DATA", "danish"]], -) # type: ignore -def test_get(title_pattern: str, authors_pattern: str) -> None: - """Check if the example source collection is filtered as requested.""" - input_file = pathlib.Path( - path_cwd, "test", "test_data", "solar_photovoltaics_example_03", "sources.json" - ) - - source_collection = technologydata.SourceCollection.from_json(file_path=input_file) - result = source_collection.get(title=title_pattern, authors=authors_pattern) - assert len(result.sources) == 1 + indirect=["example_source_collection"], + ) # type: ignore + def test_to_dataframe( + self, + example_source_collection: technologydata.SourceCollection, + ) -> None: + """Check if the example source collection is exported to pandas dataframe.""" + assert isinstance(example_source_collection.to_dataframe(), pandas.DataFrame) + + def test_from_json(self) -> None: + """Check if the example source collection is imported from JSON.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "sources.json", + ) + source_collection = technologydata.SourceCollection.from_json( + file_path=input_file + ) + assert isinstance(source_collection, technologydata.SourceCollection) + assert len(source_collection) == 2 + + @pytest.mark.parametrize( + "title_pattern, authors_pattern", + [["ATB", "nrel"], ["TECH_DATA", "danish"]], + ) # type: ignore + def test_get(self, title_pattern: str, authors_pattern: str) -> None: + """Check if the example source collection is filtered as requested.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "sources.json", + ) + + source_collection = technologydata.SourceCollection.from_json( + file_path=input_file + ) + result = source_collection.get(title=title_pattern, authors=authors_pattern) + assert len(result.sources) == 1 diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index 3e1e7fb5..2c129f9e 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -14,93 +14,102 @@ path_cwd = pathlib.Path.cwd() -def test_to_csv() -> None: - """Check if the example technology collection is exported to CSV.""" - input_file = pathlib.Path( - path_cwd, - "test", - "test_data", - "solar_photovoltaics_example_03", - "technologies.json", - ) - technology_collection = technologydata.TechnologyCollection.from_json(input_file) - output_file = pathlib.Path(path_cwd, "technologies.csv") - technology_collection.to_csv(path_or_buf=output_file) - assert output_file.is_file() - output_file.unlink(missing_ok=True) +class TestTechnologyCollection: + """Test suite for the TechnologyCollection class in the technologydata module.""" + def test_to_csv(self) -> None: + """Check if the example technology collection is exported to CSV.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + output_file = pathlib.Path(path_cwd, "technologies.csv") + technology_collection.to_csv(path_or_buf=output_file) + assert output_file.is_file() + output_file.unlink(missing_ok=True) -def test_to_dataframe() -> None: - """Check if the example technology collection is exported to pandas dataframe.""" - input_file = pathlib.Path( - path_cwd, - "test", - "test_data", - "solar_photovoltaics_example_03", - "technologies.json", - ) - technology_collection = technologydata.TechnologyCollection.from_json(input_file) - assert isinstance(technology_collection.to_dataframe(), pandas.DataFrame) + def test_to_dataframe(self) -> None: + """Check if the example technology collection is exported to pandas dataframe.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + assert isinstance(technology_collection.to_dataframe(), pandas.DataFrame) + def test_to_json(self) -> None: + """Check if the example technology collection is exported to JSON.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + output_file = pathlib.Path(path_cwd, "technologies.json") + schema_file = pathlib.Path(path_cwd, "technologies.schema.json") + technology_collection.to_json(pathlib.Path(output_file)) + assert output_file.is_file() + assert schema_file.is_file() + output_file.unlink(missing_ok=True) + schema_file.unlink(missing_ok=True) -def test_to_json() -> None: - """Check if the example technology collection is exported to JSON.""" - input_file = pathlib.Path( - path_cwd, - "test", - "test_data", - "solar_photovoltaics_example_03", - "technologies.json", - ) - technology_collection = technologydata.TechnologyCollection.from_json(input_file) - output_file = pathlib.Path(path_cwd, "technologies.json") - schema_file = pathlib.Path(path_cwd, "technologies.schema.json") - technology_collection.to_json(pathlib.Path(output_file)) - assert output_file.is_file() - assert schema_file.is_file() - output_file.unlink(missing_ok=True) - schema_file.unlink(missing_ok=True) + def test_from_json(self) -> None: + """Check if the example technology collection is imported from JSON.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + assert isinstance(technology_collection, technologydata.TechnologyCollection) + assert len(technology_collection) == 2 - -def test_from_json() -> None: - """Check if the example technology collection is imported from JSON.""" - input_file = pathlib.Path( - path_cwd, - "test", - "test_data", - "solar_photovoltaics_example_03", - "technologies.json", - ) - technology_collection = technologydata.TechnologyCollection.from_json(input_file) - assert isinstance(technology_collection, technologydata.TechnologyCollection) - assert len(technology_collection) == 2 - - -@pytest.mark.parametrize( - "name, region, year, case, detailed_technology", - [ - ["Solar photovoltaics", "DEU", 2022, "example-scenario", "Si-HC"], - ["Solar photovoltaics", "DEU", 2022, "example-project", "Si-HC"], - ], -) # type: ignore -def test_get( - name: str, region: str, year: int, case: str, detailed_technology: str -) -> None: - """Check if the example technology collection is filtered as requested.""" - input_file = pathlib.Path( - path_cwd, - "test", - "test_data", - "solar_photovoltaics_example_03", - "technologies.json", - ) - technologies_collection = technologydata.TechnologyCollection.from_json(input_file) - result = technologies_collection.get( - name=name, - region=region, - year=year, - case=case, - detailed_technology=detailed_technology, - ) - assert isinstance(result, technologydata.TechnologyCollection) - assert len(result.technologies) == 1 + @pytest.mark.parametrize( + "name, region, year, case, detailed_technology", + [ + ["Solar photovoltaics", "DEU", 2022, "example-scenario", "Si-HC"], + ["Solar photovoltaics", "DEU", 2022, "example-project", "Si-HC"], + ], + ) # type: ignore + def test_get( + self, name: str, region: str, year: int, case: str, detailed_technology: str + ) -> None: + """Check if the example technology collection is filtered as requested.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example_03", + "technologies.json", + ) + technologies_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + result = technologies_collection.get( + name=name, + region=region, + year=year, + case=case, + detailed_technology=detailed_technology, + ) + assert isinstance(result, technologydata.TechnologyCollection) + assert len(result.technologies) == 1 From fe3cfcc5316718b7458e6caae9efd8efa19932a0 Mon Sep 17 00:00:00 2001 From: euronion Date: Mon, 18 Aug 2025 18:21:50 +0200 Subject: [PATCH 07/81] code: Switch to src layout --- pyproject.toml | 9 +++++++++ {technologydata => src/technologydata}/__init__.py | 0 .../technologydata}/constants/__init__.py | 0 .../technologydata}/constants/energy_density.py | 0 {technologydata => src/technologydata}/datapackage.py | 0 {technologydata => src/technologydata}/parameter.py | 0 {technologydata => src/technologydata}/source.py | 0 .../technologydata}/source_collection.py | 0 {technologydata => src/technologydata}/technology.py | 0 .../technologydata}/technology_collection.py | 0 {technologydata => src/technologydata}/utils/__init__.py | 0 .../technologydata}/utils/carriers.txt | 0 {technologydata => src/technologydata}/utils/commons.py | 0 .../technologydata}/utils/heating_values.txt | 0 {technologydata => src/technologydata}/utils/units.py | 0 15 files changed, 9 insertions(+) rename {technologydata => src/technologydata}/__init__.py (100%) rename {technologydata => src/technologydata}/constants/__init__.py (100%) rename {technologydata => src/technologydata}/constants/energy_density.py (100%) rename {technologydata => src/technologydata}/datapackage.py (100%) rename {technologydata => src/technologydata}/parameter.py (100%) rename {technologydata => src/technologydata}/source.py (100%) rename {technologydata => src/technologydata}/source_collection.py (100%) rename {technologydata => src/technologydata}/technology.py (100%) rename {technologydata => src/technologydata}/technology_collection.py (100%) rename {technologydata => src/technologydata}/utils/__init__.py (100%) rename {technologydata => src/technologydata}/utils/carriers.txt (100%) rename {technologydata => src/technologydata}/utils/commons.py (100%) rename {technologydata => src/technologydata}/utils/heating_values.txt (100%) rename {technologydata => src/technologydata}/utils/units.py (100%) diff --git a/pyproject.toml b/pyproject.toml index 18199008..d257613e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,9 @@ docs = [ ] [tool.pytest.ini_options] +pythonpath = [ + "src", +] testpaths = "test" addopts = "--cov=technologydata --cov-report=term" filterwarnings = [ @@ -79,6 +82,12 @@ version_scheme = "no-guess-dev" [tool.setuptools.packages.find] include = ["technologydata"] +# code coverage settings +[tool.coverage.run] +source = [ + "src/technologydata", +] + # Static type checker settings [tool.mypy] diff --git a/technologydata/__init__.py b/src/technologydata/__init__.py similarity index 100% rename from technologydata/__init__.py rename to src/technologydata/__init__.py diff --git a/technologydata/constants/__init__.py b/src/technologydata/constants/__init__.py similarity index 100% rename from technologydata/constants/__init__.py rename to src/technologydata/constants/__init__.py diff --git a/technologydata/constants/energy_density.py b/src/technologydata/constants/energy_density.py similarity index 100% rename from technologydata/constants/energy_density.py rename to src/technologydata/constants/energy_density.py diff --git a/technologydata/datapackage.py b/src/technologydata/datapackage.py similarity index 100% rename from technologydata/datapackage.py rename to src/technologydata/datapackage.py diff --git a/technologydata/parameter.py b/src/technologydata/parameter.py similarity index 100% rename from technologydata/parameter.py rename to src/technologydata/parameter.py diff --git a/technologydata/source.py b/src/technologydata/source.py similarity index 100% rename from technologydata/source.py rename to src/technologydata/source.py diff --git a/technologydata/source_collection.py b/src/technologydata/source_collection.py similarity index 100% rename from technologydata/source_collection.py rename to src/technologydata/source_collection.py diff --git a/technologydata/technology.py b/src/technologydata/technology.py similarity index 100% rename from technologydata/technology.py rename to src/technologydata/technology.py diff --git a/technologydata/technology_collection.py b/src/technologydata/technology_collection.py similarity index 100% rename from technologydata/technology_collection.py rename to src/technologydata/technology_collection.py diff --git a/technologydata/utils/__init__.py b/src/technologydata/utils/__init__.py similarity index 100% rename from technologydata/utils/__init__.py rename to src/technologydata/utils/__init__.py diff --git a/technologydata/utils/carriers.txt b/src/technologydata/utils/carriers.txt similarity index 100% rename from technologydata/utils/carriers.txt rename to src/technologydata/utils/carriers.txt diff --git a/technologydata/utils/commons.py b/src/technologydata/utils/commons.py similarity index 100% rename from technologydata/utils/commons.py rename to src/technologydata/utils/commons.py diff --git a/technologydata/utils/heating_values.txt b/src/technologydata/utils/heating_values.txt similarity index 100% rename from technologydata/utils/heating_values.txt rename to src/technologydata/utils/heating_values.txt diff --git a/technologydata/utils/units.py b/src/technologydata/utils/units.py similarity index 100% rename from technologydata/utils/units.py rename to src/technologydata/utils/units.py From 0f0b43af9d123c99e8248b884d73db81539068dd Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Tue, 19 Aug 2025 11:06:36 +0200 Subject: [PATCH 08/81] code: update unit test in test_source.py --- test/test_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_source.py b/test/test_source.py index c889b627..038dfe8f 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -153,7 +153,7 @@ def test_retrieve_from_wayback(self, example_source: technologydata.Source) -> N def test_store_in_wayback(self) -> None: """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" - url_to_archive = "https://www.openenergytransition.org/outputs.html" + url_to_archive = "https://openenergytransition.org/outputs.html" archived_info = technologydata.Source.store_in_wayback(url_to_archive) # Check if archived_info is None From 69c8f96b23fe971205906a3daa017c70c641dc6b Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 21 Aug 2025 10:46:31 +0200 Subject: [PATCH 09/81] Make development dependencies optional (#34) * code: Separate development dependencies from necessary dependencies * doc: Add note on installing dev depenencies * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: Fix packaging and pytest issues * doc: Update installation details * doc: Add copyright statement --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/contributing.md | 35 + pyproject.toml | 27 +- uv.lock | 1619 +++++++++++++++++++++--------------------- 3 files changed, 868 insertions(+), 813 deletions(-) create mode 100644 docs/contributing.md diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 00000000..b6c74006 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,35 @@ + +# Contributing + +## Development dependencies + +To contribute to this project, you will need to install the development dependencies. +These dependencies include everything needed for development, testing and building the documentation of the project. + +To install the development dependencies, run the following command inside the project directory: + +```bash +uv sync +``` + +The development dependencies include `ipykernel` to support Jupyter notebooks and integration into e.g. VS Code. + +To view the full list of development dependencies, you can check the `pyproject.toml` file under the `[dependency-groups]` section as `dev` and `docs`, which are both included in the `default-groups`. + +## Testing + +To run all tests in parallel, you can use the following command: + +```bash +pytest -n auto +``` + +Some tests may not be thread-safe and therefore fail unexpectedly when run in parallel. +If you encounter such issues, you can run the tests sequentially by omitting the `-n auto` option: + +```bash +pytest +``` diff --git a/pyproject.toml b/pyproject.toml index d257613e..70a7b3a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,18 +29,12 @@ requires-python = ">=3.12" dependencies = [ "frozendict>=2.4.6", "hdx-python-country>=3.9.6", - "ipykernel>=6.29.5", # this one can go into optional as "dev" "mypy>=1.15.0", "pandas>=2.2.3", "pint>=0.24.4", - "pre-commit>=4.2.0", # this one can go into optional as "dev" "pydantic>=2.11.7", - "pydeflate>=2.1.3", # this one can go into optional as "dev" - "pytest>=8.3.5", # this one can go into optional as "dev" - "pytest-cov>=6.2.1", # this one can go into optional as "dev" - "pytest-xdist>=3.8.0", # this one can go into optional as "dev" + "pydeflate>=2.1.3", "requests>=2.32.3", - "reuse>=5.0.2", "savepagenow>=1.3.0", ] @@ -50,7 +44,19 @@ Source = "https://github.com/PyPSA/technology-data" BugTracker = "https://github.com/PyPSA/technology-data/issues" Changelog = "https://github.com/PyPSA/technology-data/releases" -[project.optional-dependencies] +# https://docs.astral.sh/uv/concepts/projects/dependencies/#dependency-groups +# editable install of package and non-packaged dependencies +[dependency-groups] +dev = [ + "ipykernel>=6.29.5", + "pre-commit>=4.2.0", + "pytest>=8.4.1", + "pytest-cov>=6.2.1", + "pytest-xdist>=3.8.0", + "reuse>=5.0.2", + "technologydata", +] + docs = [ "mkdocs-autolinks-plugin>=0.7.1", "mkdocs-git-revision-date-localized-plugin>=1.4.7", @@ -75,11 +81,16 @@ filterwarnings = [ # Setuptools_scm settings [tool.uv] package = true +default-groups = ["dev", "docs"] + +[tool.uv.sources] +technologydata = { workspace = true } [tool.setuptools_scm] version_scheme = "no-guess-dev" [tool.setuptools.packages.find] +where = ["src"] include = ["technologydata"] # code coverage settings diff --git a/uv.lock b/uv.lock index edc2b8ae..223004a8 100644 --- a/uv.lock +++ b/uv.lock @@ -1,64 +1,64 @@ version = 1 -revision = 2 +revision = 1 requires-python = ">=3.12" [[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, upload_time = "2024-05-20T21:33:25.928Z" } +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, upload_time = "2024-05-20T21:33:24.1Z" }, + { 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 = "appnope" version = "0.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } +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, upload_time = "2024-02-06T09:43:09.663Z" }, + { 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 = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } +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, upload_time = "2024-11-30T04:30:10.946Z" }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] [[package]] name = "backrefs" version = "5.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload_time = "2025-06-22T19:34:13.97Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857 } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload_time = "2025-06-22T19:34:05.252Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload_time = "2025-06-22T19:34:06.743Z" }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload_time = "2025-06-22T19:34:08.172Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload_time = "2025-06-22T19:34:09.68Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload_time = "2025-06-22T19:34:11.037Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267 }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072 }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947 }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843 }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762 }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265 }, ] [[package]] @@ -69,9 +69,9 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, ] [[package]] @@ -81,27 +81,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload_time = "2017-08-03T15:55:25.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054 } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload_time = "2017-08-03T15:55:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006 }, ] [[package]] name = "boolean-py" version = "5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577 }, ] [[package]] name = "certifi" version = "2025.7.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386, upload_time = "2025-07-09T02:13:58.874Z" } +sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386 } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230, upload_time = "2025-07-09T02:13:57.007Z" }, + { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230 }, ] [[package]] @@ -111,83 +111,83 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, +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/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, upload_time = "2023-08-12T20:38:17.776Z" } +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, upload_time = "2023-08-12T20:38:16.269Z" }, + { 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 = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936 }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790 }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924 }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626 }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567 }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957 }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408 }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399 }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815 }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537 }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565 }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357 }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776 }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, ] [[package]] @@ -197,18 +197,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload_time = "2025-05-20T23:19:49.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload_time = "2025-05-20T23:19:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +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, upload_time = "2022-10-25T02:36:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] @@ -218,150 +218,150 @@ 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, upload_time = "2024-03-12T16:53:41.133Z" } +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, upload_time = "2024-03-12T16:53:39.226Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, ] [[package]] name = "coverage" version = "7.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938, upload_time = "2025-07-27T14:13:39.045Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934, upload_time = "2025-07-27T14:11:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173, upload_time = "2025-07-27T14:11:38.005Z" }, - { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190, upload_time = "2025-07-27T14:11:39.887Z" }, - { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618, upload_time = "2025-07-27T14:11:41.841Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081, upload_time = "2025-07-27T14:11:43.705Z" }, - { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990, upload_time = "2025-07-27T14:11:45.244Z" }, - { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191, upload_time = "2025-07-27T14:11:47.093Z" }, - { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400, upload_time = "2025-07-27T14:11:48.643Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338, upload_time = "2025-07-27T14:11:50.258Z" }, - { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125, upload_time = "2025-07-27T14:11:52.034Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523, upload_time = "2025-07-27T14:11:53.965Z" }, - { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960, upload_time = "2025-07-27T14:11:55.959Z" }, - { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220, upload_time = "2025-07-27T14:11:57.899Z" }, - { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772, upload_time = "2025-07-27T14:12:00.422Z" }, - { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116, upload_time = "2025-07-27T14:12:03.099Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554, upload_time = "2025-07-27T14:12:04.668Z" }, - { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766, upload_time = "2025-07-27T14:12:06.234Z" }, - { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735, upload_time = "2025-07-27T14:12:08.305Z" }, - { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118, upload_time = "2025-07-27T14:12:09.903Z" }, - { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381, upload_time = "2025-07-27T14:12:11.535Z" }, - { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152, upload_time = "2025-07-27T14:12:13.182Z" }, - { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559, upload_time = "2025-07-27T14:12:14.807Z" }, - { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677, upload_time = "2025-07-27T14:12:16.68Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899, upload_time = "2025-07-27T14:12:18.758Z" }, - { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140, upload_time = "2025-07-27T14:12:20.357Z" }, - { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005, upload_time = "2025-07-27T14:12:22.007Z" }, - { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143, upload_time = "2025-07-27T14:12:23.746Z" }, - { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735, upload_time = "2025-07-27T14:12:25.73Z" }, - { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871, upload_time = "2025-07-27T14:12:27.767Z" }, - { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692, upload_time = "2025-07-27T14:12:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059, upload_time = "2025-07-27T14:12:31.076Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150, upload_time = "2025-07-27T14:12:32.746Z" }, - { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014, upload_time = "2025-07-27T14:12:34.406Z" }, - { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951, upload_time = "2025-07-27T14:12:36.069Z" }, - { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229, upload_time = "2025-07-27T14:12:37.759Z" }, - { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738, upload_time = "2025-07-27T14:12:39.453Z" }, - { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045, upload_time = "2025-07-27T14:12:41.387Z" }, - { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666, upload_time = "2025-07-27T14:12:43.056Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692, upload_time = "2025-07-27T14:12:44.83Z" }, - { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536, upload_time = "2025-07-27T14:12:46.527Z" }, - { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954, upload_time = "2025-07-27T14:12:49.279Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616, upload_time = "2025-07-27T14:12:51.214Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412, upload_time = "2025-07-27T14:12:53.429Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776, upload_time = "2025-07-27T14:12:55.482Z" }, - { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698, upload_time = "2025-07-27T14:12:57.225Z" }, - { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902, upload_time = "2025-07-27T14:12:59.071Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230, upload_time = "2025-07-27T14:13:01.248Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194, upload_time = "2025-07-27T14:13:03.247Z" }, - { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316, upload_time = "2025-07-27T14:13:04.957Z" }, - { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794, upload_time = "2025-07-27T14:13:06.715Z" }, - { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869, upload_time = "2025-07-27T14:13:08.933Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765, upload_time = "2025-07-27T14:13:10.778Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420, upload_time = "2025-07-27T14:13:12.882Z" }, - { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536, upload_time = "2025-07-27T14:13:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190, upload_time = "2025-07-27T14:13:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597, upload_time = "2025-07-27T14:13:37.221Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934 }, + { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173 }, + { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190 }, + { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618 }, + { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081 }, + { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990 }, + { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191 }, + { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400 }, + { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338 }, + { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125 }, + { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523 }, + { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960 }, + { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220 }, + { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772 }, + { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116 }, + { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554 }, + { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766 }, + { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735 }, + { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118 }, + { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381 }, + { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152 }, + { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559 }, + { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677 }, + { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899 }, + { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140 }, + { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005 }, + { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143 }, + { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735 }, + { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871 }, + { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692 }, + { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059 }, + { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150 }, + { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014 }, + { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951 }, + { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229 }, + { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738 }, + { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045 }, + { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666 }, + { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692 }, + { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536 }, + { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954 }, + { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616 }, + { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412 }, + { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776 }, + { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698 }, + { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902 }, + { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230 }, + { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194 }, + { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316 }, + { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794 }, + { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869 }, + { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765 }, + { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420 }, + { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536 }, + { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190 }, + { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597 }, ] [[package]] name = "csscompressor" version = "0.9.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808 } [[package]] name = "debugpy" version = "1.8.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload_time = "2025-04-10T19:46:10.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload_time = "2025-04-10T19:46:26.044Z" }, - { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload_time = "2025-04-10T19:46:27.464Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload_time = "2025-04-10T19:46:29.467Z" }, - { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload_time = "2025-04-10T19:46:31.538Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload_time = "2025-04-10T19:46:32.96Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload_time = "2025-04-10T19:46:34.336Z" }, - { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload_time = "2025-04-10T19:46:36.199Z" }, - { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload_time = "2025-04-10T19:46:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload_time = "2025-04-10T19:46:54.077Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268 }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077 }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127 }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249 }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676 }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514 }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756 }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119 }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230 }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, ] [[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, upload_time = "2024-10-09T18:35:47.551Z" } +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, upload_time = "2024-10-09T18:35:44.272Z" }, + { 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 = "et-xmlfile" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, ] [[package]] name = "executing" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload_time = "2025-01-22T15:41:29.403Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload_time = "2025-01-22T15:41:25.929Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, ] [[package]] name = "filelock" version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, ] [[package]] @@ -371,9 +371,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816 } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263 }, ] [[package]] @@ -383,9 +383,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625 }, ] [[package]] @@ -413,20 +413,20 @@ dependencies = [ { name = "typing-extensions" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615 }, ] [[package]] name = "frozendict" version = "2.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload_time = "2024-10-13T12:15:32.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload_time = "2024-10-13T12:15:26.839Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload_time = "2024-10-13T12:15:28.16Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload_time = "2024-10-13T12:15:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148 }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146 }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146 }, ] [[package]] @@ -436,9 +436,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload_time = "2022-05-02T15:47:16.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload_time = "2022-05-02T15:47:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, ] [[package]] @@ -448,9 +448,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, ] [[package]] @@ -460,9 +460,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload_time = "2025-01-02T07:32:43.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload_time = "2025-01-02T07:32:40.731Z" }, + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, ] [[package]] @@ -472,9 +472,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137, upload_time = "2025-04-23T11:29:09.147Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137 } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload_time = "2025-04-23T11:29:07.145Z" }, + { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303 }, ] [[package]] @@ -486,9 +486,9 @@ dependencies = [ { name = "libhxl" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/96/ac55b204699cd216a22a943f64aafac32bba818f624a5d44879d60368fad/hdx_python_country-3.9.6.tar.gz", hash = "sha256:7791f4b9c5ae3e62e82795c266a3ca6ee23c7bab706c91533844edf2ebd9bb18", size = 529232, upload_time = "2025-07-09T22:56:32.162Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/96/ac55b204699cd216a22a943f64aafac32bba818f624a5d44879d60368fad/hdx_python_country-3.9.6.tar.gz", hash = "sha256:7791f4b9c5ae3e62e82795c266a3ca6ee23c7bab706c91533844edf2ebd9bb18", size = 529232 } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/90/646b56ec12df459799510d6d0869ada210ad9f765ad104e50dae4867eb50/hdx_python_country-3.9.6-py3-none-any.whl", hash = "sha256:4c1833bdf3cbd14dfff0146e0bdcae5763931d344fce5f1b42493dc8751e3d4a", size = 55554, upload_time = "2025-07-09T22:56:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/45/90/646b56ec12df459799510d6d0869ada210ad9f765ad104e50dae4867eb50/hdx_python_country-3.9.6-py3-none-any.whl", hash = "sha256:4c1833bdf3cbd14dfff0146e0bdcae5763931d344fce5f1b42493dc8751e3d4a", size = 55554 }, ] [[package]] @@ -511,9 +511,9 @@ dependencies = [ { name = "xlsx2csv" }, { name = "xlwt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009, upload_time = "2025-05-14T02:31:28.578Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009 } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787, upload_time = "2025-05-14T02:31:26.794Z" }, + { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787 }, ] [[package]] @@ -521,75 +521,75 @@ name = "htmlmin2" version = "0.1.13" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, + { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486 }, ] [[package]] name = "humanize" version = "4.12.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514, upload_time = "2025-04-30T11:51:07.98Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487, upload_time = "2025-04-30T11:51:06.468Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487 }, ] [[package]] name = "identify" version = "2.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload_time = "2025-05-23T20:37:53.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload_time = "2025-05-23T20:37:51.495Z" }, + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145 }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } +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, upload_time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] name = "ijson" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212 }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175 }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011 }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094 }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903 }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339 }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580 }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280 }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512 }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081 }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216 }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170 }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013 }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564 }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917 }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897 }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711 }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691 }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738 }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512 }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074 }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694 }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390 }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140 }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739 }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338 }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515 }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081 }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253 }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816 }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760 }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948 }, ] [[package]] @@ -602,18 +602,18 @@ dependencies = [ { name = "pandas" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990, upload_time = "2025-02-06T09:16:10.723Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520, upload_time = "2025-02-06T09:16:09.042Z" }, + { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520 }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] [[package]] @@ -635,9 +635,9 @@ dependencies = [ { 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, upload_time = "2024-07-01T14:07:22.543Z" } +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, upload_time = "2024-07-01T14:07:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, ] [[package]] @@ -656,9 +656,9 @@ dependencies = [ { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload_time = "2025-07-01T11:11:30.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338 } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload_time = "2025-07-01T11:11:27.85Z" }, + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021 }, ] [[package]] @@ -668,18 +668,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, ] [[package]] @@ -689,9 +689,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } +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, upload_time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, ] [[package]] @@ -701,25 +701,25 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] name = "joblib" version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload_time = "2025-05-23T12:04:37.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload_time = "2025-05-23T12:04:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746 }, ] [[package]] name = "jsmin" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925 } [[package]] name = "jsonlines" @@ -728,9 +728,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701 }, ] [[package]] @@ -740,9 +740,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838 } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105 }, ] [[package]] @@ -755,9 +755,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480, upload_time = "2025-05-26T18:48:10.459Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709, upload_time = "2025-05-26T18:48:08.417Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709 }, ] [[package]] @@ -767,9 +767,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513 } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 }, ] [[package]] @@ -783,9 +783,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } +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, upload_time = "2024-09-17T10:44:15.218Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, ] [[package]] @@ -797,9 +797,9 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload_time = "2025-05-27T07:38:16.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, ] [[package]] @@ -818,7 +818,7 @@ dependencies = [ { name = "wheel" }, { name = "xlrd3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736 } [[package]] name = "license-expression" @@ -827,9 +827,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload_time = "2025-07-22T11:13:32.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402 } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615 }, ] [[package]] @@ -840,18 +840,18 @@ dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, ] [[package]] name = "markdown" version = "3.8.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071, upload_time = "2025-06-19T17:12:44.483Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071 } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload_time = "2025-06-19T17:12:42.994Z" }, + { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827 }, ] [[package]] @@ -861,56 +861,56 @@ 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, upload_time = "2023-06-03T06:41:14.443Z" } +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, upload_time = "2023-06-03T06:41:11.019Z" }, + { 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 = "marko" version = "2.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795, upload_time = "2025-06-13T03:25:50.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186, upload_time = "2025-06-13T03:25:49.858Z" }, + { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186 }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, +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/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]] @@ -920,27 +920,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } +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, upload_time = "2024-04-15T13:44:43.265Z" }, + { 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 = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +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, upload_time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload_time = "2021-02-05T18:55:30.623Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload_time = "2021-02-05T18:55:29.583Z" }, + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, ] [[package]] @@ -962,9 +962,9 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload_time = "2024-08-30T12:24:06.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload_time = "2024-08-30T12:24:05.054Z" }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, ] [[package]] @@ -974,9 +974,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload_time = "2023-08-04T14:42:25.67Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload_time = "2023-08-04T14:42:23.955Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235 }, ] [[package]] @@ -988,9 +988,9 @@ dependencies = [ { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/0c/c9826f35b99c67fa3a7cddfa094c1a6c43fafde558c309c6e4403e5b37dc/mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749", size = 54961, upload_time = "2025-05-20T13:09:09.886Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/0c/c9826f35b99c67fa3a7cddfa094c1a6c43fafde558c309c6e4403e5b37dc/mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749", size = 54961 } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/dc/fc063b78f4b769d1956319351704e23ebeba1e9e1d6a41b4b602325fd7e4/mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13", size = 24969, upload_time = "2025-05-20T13:09:08.237Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/fc063b78f4b769d1956319351704e23ebeba1e9e1d6a41b4b602325fd7e4/mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13", size = 24969 }, ] [[package]] @@ -1002,9 +1002,9 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload_time = "2023-11-20T17:51:09.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload_time = "2023-11-20T17:51:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, ] [[package]] @@ -1017,9 +1017,9 @@ dependencies = [ { name = "mkdocs" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload_time = "2025-05-28T18:26:20.697Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473 } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload_time = "2025-05-28T18:26:18.907Z" }, + { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382 }, ] [[package]] @@ -1039,18 +1039,18 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/c1/f804ba2db2ddc2183e900befe7dad64339a34fa935034e1ab405289d0a97/mkdocs_material-9.6.15.tar.gz", hash = "sha256:64adf8fa8dba1a17905b6aee1894a5aafd966d4aeb44a11088519b0f5ca4f1b5", size = 3951836, upload_time = "2025-07-01T10:14:15.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/c1/f804ba2db2ddc2183e900befe7dad64339a34fa935034e1ab405289d0a97/mkdocs_material-9.6.15.tar.gz", hash = "sha256:64adf8fa8dba1a17905b6aee1894a5aafd966d4aeb44a11088519b0f5ca4f1b5", size = 3951836 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/30/dda19f0495a9096b64b6b3c07c4bfcff1c76ee0fc521086d53593f18b4c0/mkdocs_material-9.6.15-py3-none-any.whl", hash = "sha256:ac969c94d4fe5eb7c924b6d2f43d7db41159ea91553d18a9afc4780c34f2717a", size = 8716840, upload_time = "2025-07-01T10:14:13.18Z" }, + { url = "https://files.pythonhosted.org/packages/1d/30/dda19f0495a9096b64b6b3c07c4bfcff1c76ee0fc521086d53593f18b4c0/mkdocs_material-9.6.15-py3-none-any.whl", hash = "sha256:ac969c94d4fe5eb7c924b6d2f43d7db41159ea91553d18a9afc4780c34f2717a", size = 8716840 }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload_time = "2023-11-22T19:09:45.208Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload_time = "2023-11-22T19:09:43.465Z" }, + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, ] [[package]] @@ -1063,9 +1063,9 @@ dependencies = [ { name = "jsmin" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366, upload_time = "2024-01-29T16:11:32.982Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723, upload_time = "2024-01-29T16:11:31.851Z" }, + { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723 }, ] [[package]] @@ -1075,9 +1075,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791, upload_time = "2024-11-18T13:15:13.977Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791 } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717, upload_time = "2024-11-18T13:15:12.286Z" }, + { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717 }, ] [[package]] @@ -1092,9 +1092,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686, upload_time = "2025-03-31T08:33:11.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686 } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075, upload_time = "2025-03-31T08:33:09.661Z" }, + { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075 }, ] [[package]] @@ -1106,9 +1106,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ed/b886f8c714fd7cccc39b79646b627dbea84cd95c46be43459ef46852caf0/mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d", size = 206065, upload_time = "2025-06-03T12:52:49.276Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ed/b886f8c714fd7cccc39b79646b627dbea84cd95c46be43459ef46852caf0/mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d", size = 206065 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/dd/a24ee3de56954bfafb6ede7cd63c2413bb842cc48eb45e41c43a05a33074/mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374", size = 124287, upload_time = "2025-06-03T12:52:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/3b/dd/a24ee3de56954bfafb6ede7cd63c2413bb842cc48eb45e41c43a05a33074/mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374", size = 124287 }, ] [[package]] @@ -1120,89 +1120,89 @@ dependencies = [ { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload_time = "2025-06-16T16:51:35.145Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493, upload_time = "2025-06-16T16:47:01.683Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687, upload_time = "2025-06-16T16:48:19.367Z" }, - { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723, upload_time = "2025-06-16T16:49:20.912Z" }, - { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980, upload_time = "2025-06-16T16:37:40.929Z" }, - { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328, upload_time = "2025-06-16T16:34:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321, upload_time = "2025-06-16T16:48:58.823Z" }, - { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480, upload_time = "2025-06-16T16:47:56.205Z" }, - { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538, upload_time = "2025-06-16T16:46:43.92Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839, upload_time = "2025-06-16T16:36:28.039Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634, upload_time = "2025-06-16T16:50:34.441Z" }, - { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584, upload_time = "2025-06-16T16:34:54.857Z" }, - { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886, upload_time = "2025-06-16T16:36:43.589Z" }, - { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923, upload_time = "2025-06-16T16:48:02.366Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493 }, + { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687 }, + { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723 }, + { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980 }, + { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328 }, + { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321 }, + { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480 }, + { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839 }, + { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634 }, + { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584 }, + { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886 }, + { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923 }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, ] [[package]] name = "nest-asyncio" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload_time = "2024-01-21T14:25:19.227Z" } +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, upload_time = "2024-01-21T14:25:17.223Z" }, + { 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, upload_time = "2024-06-04T18:44:11.171Z" } +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, upload_time = "2024-06-04T18:44:08.352Z" }, + { 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 = "numpy" version = "2.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372, upload_time = "2025-06-21T12:28:33.469Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664, upload_time = "2025-06-21T12:15:30.845Z" }, - { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078, upload_time = "2025-06-21T12:15:52.23Z" }, - { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554, upload_time = "2025-06-21T12:16:01.434Z" }, - { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560, upload_time = "2025-06-21T12:16:11.895Z" }, - { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638, upload_time = "2025-06-21T12:16:32.611Z" }, - { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729, upload_time = "2025-06-21T12:16:57.439Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330, upload_time = "2025-06-21T12:17:20.638Z" }, - { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734, upload_time = "2025-06-21T12:17:47.938Z" }, - { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411, upload_time = "2025-06-21T12:17:58.475Z" }, - { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973, upload_time = "2025-06-21T12:18:17.601Z" }, - { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491, upload_time = "2025-06-21T12:18:33.585Z" }, - { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381, upload_time = "2025-06-21T12:19:04.103Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726, upload_time = "2025-06-21T12:19:25.599Z" }, - { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145, upload_time = "2025-06-21T12:19:34.782Z" }, - { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409, upload_time = "2025-06-21T12:19:45.228Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630, upload_time = "2025-06-21T12:20:06.544Z" }, - { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546, upload_time = "2025-06-21T12:20:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538, upload_time = "2025-06-21T12:20:54.322Z" }, - { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327, upload_time = "2025-06-21T12:21:21.053Z" }, - { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330, upload_time = "2025-06-21T12:25:07.447Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565, upload_time = "2025-06-21T12:25:26.444Z" }, - { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262, upload_time = "2025-06-21T12:25:42.196Z" }, - { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593, upload_time = "2025-06-21T12:21:51.664Z" }, - { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523, upload_time = "2025-06-21T12:22:13.583Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993, upload_time = "2025-06-21T12:22:22.53Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652, upload_time = "2025-06-21T12:22:33.629Z" }, - { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561, upload_time = "2025-06-21T12:22:55.056Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349, upload_time = "2025-06-21T12:23:20.53Z" }, - { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053, upload_time = "2025-06-21T12:23:43.697Z" }, - { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184, upload_time = "2025-06-21T12:24:10.708Z" }, - { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678, upload_time = "2025-06-21T12:24:21.596Z" }, - { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697, upload_time = "2025-06-21T12:24:40.644Z" }, - { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376, upload_time = "2025-06-21T12:24:56.884Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664 }, + { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078 }, + { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554 }, + { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560 }, + { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638 }, + { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729 }, + { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330 }, + { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734 }, + { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411 }, + { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973 }, + { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491 }, + { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381 }, + { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726 }, + { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145 }, + { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409 }, + { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630 }, + { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546 }, + { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538 }, + { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327 }, + { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330 }, + { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565 }, + { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262 }, + { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593 }, + { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523 }, + { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993 }, + { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652 }, + { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561 }, + { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349 }, + { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053 }, + { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184 }, + { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678 }, + { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697 }, + { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376 }, ] [[package]] @@ -1216,9 +1216,9 @@ dependencies = [ { name = "pyarrow" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630, upload_time = "2025-06-16T16:15:05.49Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314, upload_time = "2025-06-16T16:15:04.328Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314 }, ] [[package]] @@ -1228,27 +1228,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "et-xmlfile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] [[package]] name = "paginate" version = "0.5.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload_time = "2024-08-25T14:17:24.139Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload_time = "2024-08-25T14:17:22.55Z" }, + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, ] [[package]] @@ -1261,53 +1261,53 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload_time = "2025-07-07T19:20:04.079Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload_time = "2025-07-07T19:18:52.054Z" }, - { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload_time = "2025-07-07T19:18:54.785Z" }, - { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload_time = "2025-07-07T19:18:57.045Z" }, - { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload_time = "2025-07-07T19:18:59.771Z" }, - { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload_time = "2025-07-07T19:19:02.944Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload_time = "2025-07-07T19:19:06.82Z" }, - { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload_time = "2025-07-07T19:19:09.589Z" }, - { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload_time = "2025-07-07T19:19:12.245Z" }, - { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload_time = "2025-07-07T19:19:14.612Z" }, - { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload_time = "2025-07-07T19:19:16.857Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload_time = "2025-07-07T19:19:19.265Z" }, - { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload_time = "2025-07-07T19:19:21.547Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload_time = "2025-07-07T19:19:23.939Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload_time = "2025-07-07T19:19:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload_time = "2025-07-07T19:19:26.362Z" }, - { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload_time = "2025-07-07T19:19:29.157Z" }, - { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload_time = "2025-07-07T19:19:31.436Z" }, - { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload_time = "2025-07-07T19:19:34.267Z" }, - { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload_time = "2025-07-07T19:19:36.856Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload_time = "2025-07-07T19:19:39.999Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172 }, + { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365 }, + { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411 }, + { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013 }, + { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210 }, + { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571 }, + { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601 }, + { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393 }, + { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750 }, + { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004 }, + { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869 }, + { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218 }, + { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763 }, + { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482 }, + { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159 }, + { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287 }, + { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381 }, + { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998 }, + { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705 }, + { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044 }, ] [[package]] name = "parso" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload_time = "2024-04-05T09:43:55.897Z" } +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, upload_time = "2024-04-05T09:43:53.299Z" }, + { 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 = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, ] [[package]] name = "petl" version = "1.7.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780, upload_time = "2025-04-04T23:54:50.921Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780 } [[package]] name = "pexpect" @@ -1316,9 +1316,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } +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, upload_time = "2023-11-25T06:56:14.81Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, ] [[package]] @@ -1331,36 +1331,36 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload_time = "2024-11-07T16:29:46.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload_time = "2024-11-07T16:29:43.976Z" }, + { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029 }, ] [[package]] name = "platformdirs" version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload_time = "2025-05-07T22:47:42.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload_time = "2025-05-07T22:47:40.376Z" }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, ] [[package]] name = "ply" version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567 }, ] [[package]] @@ -1374,9 +1374,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload_time = "2025-03-18T21:35:20.987Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload_time = "2025-03-18T21:35:19.343Z" }, + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707 }, ] [[package]] @@ -1386,86 +1386,86 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload_time = "2025-04-15T09:18:47.731Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload_time = "2025-04-15T09:18:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, ] [[package]] name = "psutil" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload_time = "2025-02-13T21:54:07.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload_time = "2025-02-13T21:54:12.36Z" }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload_time = "2025-02-13T21:54:16.07Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload_time = "2025-02-13T21:54:18.662Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload_time = "2025-02-13T21:54:21.811Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload_time = "2025-02-13T21:54:24.68Z" }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload_time = "2025-02-13T21:54:34.31Z" }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload_time = "2025-02-13T21:54:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } +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, upload_time = "2020-12-28T15:15:28.35Z" }, + { 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, upload_time = "2024-07-21T12:58:21.801Z" } +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, upload_time = "2024-07-21T12:58:20.04Z" }, + { 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 = "pyarrow" version = "20.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067 }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128 }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890 }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775 }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231 }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639 }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549 }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216 }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496 }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501 }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895 }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322 }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441 }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027 }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473 }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897 }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847 }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219 }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957 }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972 }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434 }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648 }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853 }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743 }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441 }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279 }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982 }, ] [[package]] name = "pycparser" version = "2.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload_time = "2024-03-30T13:22:22.564Z" } +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, upload_time = "2024-03-30T13:22:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, ] [[package]] @@ -1478,9 +1478,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload_time = "2025-06-14T08:33:17.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload_time = "2025-06-14T08:33:14.905Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 }, ] [[package]] @@ -1490,39 +1490,39 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, ] [[package]] @@ -1538,18 +1538,18 @@ dependencies = [ { name = "requests" }, { name = "wbgapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586, upload_time = "2025-06-03T09:38:12.25Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586 } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540, upload_time = "2025-06-03T09:38:10.858Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540 }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] @@ -1560,9 +1560,9 @@ dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197, upload_time = "2025-06-21T17:56:36.974Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197 } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143, upload_time = "2025-06-21T17:56:35.356Z" }, + { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143 }, ] [[package]] @@ -1572,9 +1572,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729 }, ] [[package]] @@ -1588,9 +1588,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload_time = "2025-06-18T05:48:06.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload_time = "2025-06-18T05:48:03.955Z" }, + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 }, ] [[package]] @@ -1602,9 +1602,9 @@ dependencies = [ { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload_time = "2025-06-12T10:47:47.684Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload_time = "2025-06-12T10:47:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644 }, ] [[package]] @@ -1615,9 +1615,9 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload_time = "2025-07-01T13:30:59.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload_time = "2025-07-01T13:30:56.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, ] [[package]] @@ -1627,9 +1627,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +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, upload_time = "2024-03-01T18:36:18.57Z" }, + { 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]] @@ -1639,16 +1639,16 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload_time = "2025-03-11T12:27:27.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, + { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453 }, ] [[package]] name = "python-io-wrapper" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271 } [[package]] name = "python-slugify" @@ -1657,18 +1657,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] [[package]] @@ -1676,38 +1676,38 @@ name = "pywin32" version = "310" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, - { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, - { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, - { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, +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/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]] @@ -1717,9 +1717,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload_time = "2025-05-13T15:24:01.64Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload_time = "2025-05-13T15:23:59.629Z" }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722 }, ] [[package]] @@ -1729,34 +1729,34 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload_time = "2025-06-13T14:09:07.087Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload_time = "2025-06-13T14:07:31.676Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload_time = "2025-06-13T14:07:33.104Z" }, - { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload_time = "2025-06-13T14:07:34.831Z" }, - { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload_time = "2025-06-13T14:07:36.553Z" }, - { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload_time = "2025-06-13T14:07:38.21Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload_time = "2025-06-13T14:07:39.599Z" }, - { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload_time = "2025-06-13T14:07:41.027Z" }, - { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload_time = "2025-06-13T14:07:42.533Z" }, - { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload_time = "2025-06-13T14:07:43.843Z" }, - { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload_time = "2025-06-13T14:07:45.51Z" }, - { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826, upload_time = "2025-06-13T14:07:46.881Z" }, - { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283, upload_time = "2025-06-13T14:07:49.562Z" }, - { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567, upload_time = "2025-06-13T14:07:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681, upload_time = "2025-06-13T14:07:52.77Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148, upload_time = "2025-06-13T14:07:54.178Z" }, - { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768, upload_time = "2025-06-13T14:07:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199, upload_time = "2025-06-13T14:07:57.166Z" }, - { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439, upload_time = "2025-06-13T14:07:58.959Z" }, - { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload_time = "2025-06-13T14:08:00.777Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438 }, + { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095 }, + { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826 }, + { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750 }, + { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357 }, + { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281 }, + { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110 }, + { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297 }, + { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203 }, + { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927 }, + { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826 }, + { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283 }, + { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567 }, + { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681 }, + { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148 }, + { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768 }, + { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199 }, + { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439 }, + { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933 }, ] [[package]] name = "ratelimit" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251 } [[package]] name = "referencing" @@ -1767,9 +1767,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, ] [[package]] @@ -1782,9 +1782,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload_time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, ] [[package]] @@ -1794,9 +1794,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244 }, ] [[package]] @@ -1813,18 +1813,18 @@ dependencies = [ { name = "python-debian" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/43/35421efe0e69823787b331362e11cc16bb697cd6f19cbed284d421615f14/reuse-5.0.2.tar.gz", hash = "sha256:878016ae5dd29c10bad4606d6676c12a268c12aa9fcfea66403598e16eed085c", size = 358798, upload_time = "2024-11-14T09:33:17.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/43/35421efe0e69823787b331362e11cc16bb697cd6f19cbed284d421615f14/reuse-5.0.2.tar.gz", hash = "sha256:878016ae5dd29c10bad4606d6676c12a268c12aa9fcfea66403598e16eed085c", size = 358798 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309, upload_time = "2024-11-14T09:33:15.047Z" }, + { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309 }, ] [[package]] name = "rfc3986" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326 }, ] [[package]] @@ -1835,85 +1835,85 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, ] [[package]] name = "rpds-py" version = "0.26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload_time = "2025-07-01T15:57:13.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload_time = "2025-07-01T15:54:15.734Z" }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload_time = "2025-07-01T15:54:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload_time = "2025-07-01T15:54:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload_time = "2025-07-01T15:54:19.295Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload_time = "2025-07-01T15:54:20.858Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload_time = "2025-07-01T15:54:22.508Z" }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload_time = "2025-07-01T15:54:23.987Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload_time = "2025-07-01T15:54:25.073Z" }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload_time = "2025-07-01T15:54:26.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload_time = "2025-07-01T15:54:27.424Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload_time = "2025-07-01T15:54:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload_time = "2025-07-01T15:54:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload_time = "2025-07-01T15:54:32.195Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload_time = "2025-07-01T15:54:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload_time = "2025-07-01T15:54:34.755Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload_time = "2025-07-01T15:54:36.292Z" }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload_time = "2025-07-01T15:54:37.469Z" }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload_time = "2025-07-01T15:54:38.954Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload_time = "2025-07-01T15:54:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload_time = "2025-07-01T15:54:43.025Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload_time = "2025-07-01T15:54:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload_time = "2025-07-01T15:54:46.043Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload_time = "2025-07-01T15:54:47.64Z" }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload_time = "2025-07-01T15:54:48.9Z" }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload_time = "2025-07-01T15:54:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload_time = "2025-07-01T15:54:52.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload_time = "2025-07-01T15:54:53.692Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload_time = "2025-07-01T15:54:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload_time = "2025-07-01T15:54:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload_time = "2025-07-01T15:54:58.561Z" }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload_time = "2025-07-01T15:54:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload_time = "2025-07-01T15:55:00.898Z" }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload_time = "2025-07-01T15:55:02.201Z" }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload_time = "2025-07-01T15:55:03.698Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload_time = "2025-07-01T15:55:05.398Z" }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload_time = "2025-07-01T15:55:08.316Z" }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload_time = "2025-07-01T15:55:09.52Z" }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload_time = "2025-07-01T15:55:11.216Z" }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload_time = "2025-07-01T15:55:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload_time = "2025-07-01T15:55:14.486Z" }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload_time = "2025-07-01T15:55:15.745Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload_time = "2025-07-01T15:55:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload_time = "2025-07-01T15:55:18.922Z" }, - { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload_time = "2025-07-01T15:55:20.399Z" }, - { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload_time = "2025-07-01T15:55:21.729Z" }, - { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload_time = "2025-07-01T15:55:22.918Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload_time = "2025-07-01T15:55:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload_time = "2025-07-01T15:55:25.554Z" }, - { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload_time = "2025-07-01T15:55:27.798Z" }, - { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload_time = "2025-07-01T15:55:29.057Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload_time = "2025-07-01T15:55:30.719Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload_time = "2025-07-01T15:55:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload_time = "2025-07-01T15:55:33.312Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload_time = "2025-07-01T15:55:34.933Z" }, - { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload_time = "2025-07-01T15:55:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload_time = "2025-07-01T15:55:37.483Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload_time = "2025-07-01T15:55:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload_time = "2025-07-01T15:55:40.175Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload_time = "2025-07-01T15:55:42.015Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload_time = "2025-07-01T15:55:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload_time = "2025-07-01T15:55:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload_time = "2025-07-01T15:55:47.098Z" }, - { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload_time = "2025-07-01T15:55:48.412Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload_time = "2025-07-01T15:55:49.816Z" }, - { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload_time = "2025-07-01T15:55:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload_time = "2025-07-01T15:55:52.541Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload_time = "2025-07-01T15:55:53.874Z" }, - { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload_time = "2025-07-01T15:55:55.167Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933 }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447 }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711 }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865 }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763 }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651 }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079 }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379 }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033 }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639 }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105 }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272 }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995 }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198 }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917 }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073 }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214 }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113 }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189 }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998 }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903 }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785 }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329 }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875 }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636 }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663 }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428 }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571 }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475 }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692 }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415 }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783 }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844 }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105 }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440 }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759 }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032 }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416 }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049 }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428 }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524 }, + { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292 }, + { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334 }, + { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875 }, + { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993 }, + { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683 }, + { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825 }, + { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292 }, + { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435 }, + { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410 }, + { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724 }, + { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285 }, + { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459 }, + { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083 }, + { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291 }, + { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445 }, + { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206 }, + { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330 }, + { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254 }, + { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094 }, + { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889 }, + { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301 }, + { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891 }, + { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044 }, + { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774 }, + { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886 }, + { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027 }, + { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821 }, ] [[package]] @@ -1923,35 +1923,35 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload_time = "2025-06-09T08:51:09.828Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511 } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload_time = "2025-06-09T08:51:06.348Z" }, + { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570 }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, ] [[package]] @@ -1962,54 +1962,54 @@ dependencies = [ { name = "click" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload_time = "2023-07-01T13:31:49.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649 }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, ] [[package]] name = "simpleeval" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762 }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +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, upload_time = "2024-12-04T17:35:26.475Z" }, + { 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 = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, ] [[package]] @@ -2021,18 +2021,18 @@ dependencies = [ { name = "executing" }, { name = "pure-eval" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } +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, upload_time = "2023-09-30T13:58:03.53Z" }, + { 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 = "structlog" version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720 }, ] [[package]] @@ -2044,18 +2044,18 @@ dependencies = [ { name = "pyyaml" }, { name = "xlsxwriter" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860 }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, ] [[package]] @@ -2064,22 +2064,25 @@ source = { editable = "." } dependencies = [ { name = "frozendict" }, { name = "hdx-python-country" }, - { name = "ipykernel" }, { name = "mypy" }, { name = "pandas" }, { name = "pint" }, - { name = "pre-commit" }, { name = "pydantic" }, { name = "pydeflate" }, + { name = "requests" }, + { name = "savepagenow" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ipykernel" }, + { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "pytest-xdist" }, - { name = "requests" }, { name = "reuse" }, - { name = "savepagenow" }, + { name = "technologydata" }, ] - -[package.optional-dependencies] docs = [ { name = "mkdocs-autolinks-plugin" }, { name = "mkdocs-git-revision-date-localized-plugin" }, @@ -2094,82 +2097,88 @@ docs = [ requires-dist = [ { name = "frozendict", specifier = ">=2.4.6" }, { name = "hdx-python-country", specifier = ">=3.9.6" }, - { name = "ipykernel", specifier = ">=6.29.5" }, - { name = "mkdocs-autolinks-plugin", marker = "extra == 'docs'", specifier = ">=0.7.1" }, - { name = "mkdocs-git-revision-date-localized-plugin", marker = "extra == 'docs'", specifier = ">=1.4.7" }, - { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.6.14" }, - { name = "mkdocs-minify-plugin", marker = "extra == 'docs'", specifier = ">=0.8.0" }, - { name = "mkdocs-open-in-new-tab", marker = "extra == 'docs'", specifier = ">=1.0.8" }, - { name = "mkdocstrings", marker = "extra == 'docs'", specifier = ">=0.29.1" }, - { name = "mkdocstrings-python", marker = "extra == 'docs'", specifier = ">=1.16.11" }, { name = "mypy", specifier = ">=1.15.0" }, { name = "pandas", specifier = ">=2.2.3" }, { name = "pint", specifier = ">=0.24.4" }, - { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pydantic", specifier = ">=2.11.7" }, { name = "pydeflate", specifier = ">=2.1.3" }, - { name = "pytest", specifier = ">=8.3.5" }, + { name = "requests", specifier = ">=2.32.3" }, + { name = "savepagenow", specifier = ">=1.3.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "pre-commit", specifier = ">=4.2.0" }, + { name = "pytest", specifier = ">=8.4.1" }, { name = "pytest-cov", specifier = ">=6.2.1" }, { name = "pytest-xdist", specifier = ">=3.8.0" }, - { name = "requests", specifier = ">=2.32.3" }, { name = "reuse", specifier = ">=5.0.2" }, - { name = "savepagenow", specifier = ">=1.3.0" }, + { name = "technologydata", editable = "." }, +] +docs = [ + { name = "mkdocs-autolinks-plugin", specifier = ">=0.7.1" }, + { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.4.7" }, + { name = "mkdocs-material", specifier = ">=9.6.14" }, + { name = "mkdocs-minify-plugin", specifier = ">=0.8.0" }, + { name = "mkdocs-open-in-new-tab", specifier = ">=1.0.8" }, + { name = "mkdocstrings", specifier = ">=0.29.1" }, + { name = "mkdocstrings-python", specifier = ">=1.16.11" }, ] -provides-extras = ["docs"] [[package]] name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, ] [[package]] name = "tomlkit" version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload_time = "2025-06-05T07:13:44.947Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload_time = "2025-06-05T07:13:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, ] [[package]] name = "tornado" version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload_time = "2025-05-22T18:15:38.788Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload_time = "2025-05-22T18:15:20.862Z" }, - { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload_time = "2025-05-22T18:15:22.591Z" }, - { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload_time = "2025-05-22T18:15:24.027Z" }, - { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload_time = "2025-05-22T18:15:25.735Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload_time = "2025-05-22T18:15:27.499Z" }, - { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload_time = "2025-05-22T18:15:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload_time = "2025-05-22T18:15:31.038Z" }, - { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload_time = "2025-05-22T18:15:32.426Z" }, - { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload_time = "2025-05-22T18:15:34.205Z" }, - { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload_time = "2025-05-22T18:15:36.1Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } +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, upload_time = "2024-04-19T11:11:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, ] [[package]] @@ -2182,18 +2191,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload_time = "2025-05-26T14:30:31.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload_time = "2025-05-26T14:30:30.523Z" }, + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317 }, ] [[package]] name = "typing-extensions" version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload_time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 }, ] [[package]] @@ -2203,45 +2212,45 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] [[package]] name = "unidecode" version = "1.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837 }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, ] [[package]] name = "validators" version = "0.35.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712 }, ] [[package]] @@ -2253,33 +2262,33 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload_time = "2025-05-08T17:58:23.811Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload_time = "2025-05-08T17:58:21.15Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982 }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] [[package]] @@ -2291,79 +2300,79 @@ dependencies = [ { name = "requests" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385 }, ] [[package]] name = "wcwidth" version = "0.2.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } +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, upload_time = "2024-01-06T02:10:55.763Z" }, + { 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 = "wheel" version = "0.45.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494 }, ] [[package]] name = "win32-setctime" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, ] [[package]] name = "xlrd" version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555 }, ] [[package]] name = "xlrd3" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268 }, ] [[package]] name = "xlsx2csv" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904 }, ] [[package]] name = "xlsxwriter" version = "3.2.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306, upload_time = "2025-06-17T08:59:14.619Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347, upload_time = "2025-06-17T08:59:13.453Z" }, + { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347 }, ] [[package]] name = "xlwt" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929 } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981 }, ] From 6dcd24a3d2c30cc36f5737132cccc1158833ebaf Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 21 Aug 2025 14:43:47 +0200 Subject: [PATCH 10/81] code: Harmonise type hints (#36) --- src/technologydata/datapackage.py | 8 +++--- src/technologydata/parameter.py | 23 ++++++++--------- src/technologydata/source.py | 24 ++++++++---------- src/technologydata/source_collection.py | 13 +++++----- src/technologydata/technology.py | 28 +++++++++------------ src/technologydata/technology_collection.py | 10 ++++---- src/technologydata/utils/commons.py | 4 +-- src/technologydata/utils/units.py | 6 ++--- 8 files changed, 54 insertions(+), 62 deletions(-) diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index ca450ff0..d52e8361 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -13,7 +13,7 @@ import logging import pathlib -import typing +from typing import Annotated, Self import pydantic @@ -36,11 +36,11 @@ class DataPackage(pydantic.BaseModel): # type: ignore """ - technologies: typing.Annotated[ + technologies: Annotated[ TechnologyCollection | None, pydantic.Field(description="List of Technology objects."), ] = None - sources: typing.Annotated[ + sources: Annotated[ SourceCollection | None, pydantic.Field(description="List of Source objects.") ] = None @@ -70,7 +70,7 @@ def get_source_collection(self) -> None: self.sources = SourceCollection(sources=list(sources_set)) @classmethod - def from_json(cls, path_to_folder: pathlib.Path | str) -> "DataPackage": + def from_json(cls, path_to_folder: pathlib.Path | str) -> Self: """ Load a DataPackage from a JSON file. diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 82a747ce..338634fc 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -15,8 +15,7 @@ """ import logging -import typing -from typing import Annotated +from typing import Annotated, Any, Self import pint from pydantic import BaseModel, Field, PrivateAttr @@ -144,7 +143,7 @@ def _update_pint_attributes(self) -> None: else: self._pint_heating_value = None - def to(self, units: str) -> "Parameter": + def to(self, units: str) -> Self: """Convert the parameter's quantity to new units.""" self._update_pint_attributes() @@ -170,7 +169,7 @@ def to(self, units: str) -> "Parameter": def change_currency( self, to_currency: str, country: str, source: str = "worldbank" - ) -> "Parameter": + ) -> Self: """ Change the currency of the parameter. @@ -279,7 +278,7 @@ def change_currency( sources=self.sources, ) - def change_heating_value(self, to_heating_value: str) -> "Parameter": + def change_heating_value(self, to_heating_value: str) -> Self: """ Change the heating value of the parameter. @@ -373,7 +372,7 @@ def change_heating_value(self, to_heating_value: str) -> "Parameter": sources=self.sources, ) - def _check_parameter_compatibility(self, other: "Parameter") -> None: + def _check_parameter_compatibility(self, other: Self) -> None: """ Check if two parameters are compatible in terms of units, carrier, and heating value. @@ -400,7 +399,7 @@ def _check_parameter_compatibility(self, other: "Parameter") -> None: f"'{self._pint_heating_value}' and '{other._pint_heating_value}'." ) - def __add__(self, other: "Parameter") -> "Parameter": + def __add__(self, other: Self) -> Self: """ Add this Parameter to another Parameter. @@ -436,7 +435,7 @@ def __add__(self, other: "Parameter") -> "Parameter": ), ) - def __sub__(self, other: "Parameter") -> "Parameter": + def __sub__(self, other: Self) -> Self: """ Subtract another Parameter from this Parameter. @@ -471,7 +470,7 @@ def __sub__(self, other: "Parameter") -> "Parameter": ), ) - def __truediv__(self, other: "Parameter") -> "Parameter": + def __truediv__(self, other: Self) -> Self: """ Divide this Parameter by another Parameter. @@ -529,7 +528,7 @@ def __truediv__(self, other: "Parameter") -> "Parameter": ), ) - def __mul__(self, other: "Parameter") -> "Parameter": + def __mul__(self, other: Self) -> Self: """ Multiply two Parameter instances. @@ -617,7 +616,7 @@ def __eq__(self, other: object) -> bool: return False return True - def __pow__(self, exponent: float | int) -> "Parameter": + def __pow__(self, exponent: float | int) -> Self: """ Raise the parameter's value to a specified power. @@ -651,7 +650,7 @@ def __pow__(self, exponent: float | int) -> "Parameter": ) @classmethod - def from_dict(cls, data: dict[str, typing.Any]) -> "Parameter": + def from_dict(cls, data: dict[str, Any]) -> Self: """ Create an instance of the class from a dictionary. diff --git a/src/technologydata/source.py b/src/technologydata/source.py index 03911d41..c7e3643a 100644 --- a/src/technologydata/source.py +++ b/src/technologydata/source.py @@ -15,7 +15,7 @@ import logging import pathlib -import typing +from typing import Annotated, Any import pydantic import requests @@ -47,18 +47,16 @@ class Source(pydantic.BaseModel): # type: ignore """ - title: typing.Annotated[str, pydantic.Field(description="Title of the source.")] - authors: typing.Annotated[str, pydantic.Field(description="Authors of the source.")] - url: typing.Annotated[ - str | None, pydantic.Field(description="URL of the source.") - ] = None - url_archive: typing.Annotated[ - str | None, pydantic.Field(description="Archived URL.") - ] = None - url_date: typing.Annotated[ + title: Annotated[str, pydantic.Field(description="Title of the source.")] + authors: Annotated[str, pydantic.Field(description="Authors of the source.")] + url: Annotated[str | None, pydantic.Field(description="URL of the source.")] = None + url_archive: Annotated[str | None, pydantic.Field(description="Archived URL.")] = ( + None + ) + url_date: Annotated[ str | None, pydantic.Field(description="Date the URL was accessed.") ] = None - url_date_archive: typing.Annotated[ + url_date_archive: Annotated[ str | None, pydantic.Field(description="Date the URL was archived.") ] = None @@ -191,7 +189,7 @@ def ensure_in_wayback(self) -> None: @staticmethod def store_in_wayback( url_to_archive: str, - ) -> tuple[typing.Any, bool | None, str | None] | None: + ) -> tuple[Any, bool | None, str | None] | None: """ Store a snapshot of the given URL on the Wayback Machine and extract the timestamp. @@ -355,7 +353,7 @@ def _get_save_path( return None @staticmethod - def _get_content_type(url_archived: str) -> typing.Any: + def _get_content_type(url_archived: str) -> Any: """ Fetch the content type of the archived URL. diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index 702c4f96..31c4e7b4 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -8,7 +8,8 @@ import json import pathlib import re -import typing +from collections.abc import Iterator +from typing import Annotated, Any, Self import pandas import pydantic @@ -27,11 +28,11 @@ class SourceCollection(pydantic.BaseModel): # type: ignore """ - sources: typing.Annotated[ + sources: Annotated[ list[Source], pydantic.Field(description="List of Source objects.") ] - def __iter__(self) -> typing.Iterator["Source"]: + def __iter__(self) -> Iterator["Source"]: """ Return an iterator over the list of Source objects. @@ -68,7 +69,7 @@ def __str__(self) -> str: sources_str = ", ".join(str(source) for source in self.sources) return f"SourceCollection with {len(self.sources)} sources: {sources_str}" - def get(self, title: str, authors: str) -> "SourceCollection": + def get(self, title: str, authors: str) -> Self: """ Filter sources based on regex patterns for non-optional attributes. @@ -206,8 +207,8 @@ def to_json( def from_json( cls, file_path: pathlib.Path | str | None = None, - from_str: list[dict[str, typing.Any]] | None = None, - ) -> "SourceCollection": + from_str: list[dict[str, Any]] | None = None, + ) -> Self: """ Import the SourceCollection from a JSON file. diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 2963a968..771b0e7b 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -7,7 +7,7 @@ """Technology class for representing a technology with parameters and transformation methods.""" -import typing +from typing import Annotated, Any, Self import pydantic @@ -35,17 +35,15 @@ class Technology(pydantic.BaseModel): # type: ignore """ - name: typing.Annotated[str, pydantic.Field(description="Name of the technology.")] - region: typing.Annotated[str, pydantic.Field(description="Region identifier.")] - year: typing.Annotated[int, pydantic.Field(description="Year of the data.")] - parameters: typing.Annotated[ + name: Annotated[str, pydantic.Field(description="Name of the technology.")] + region: Annotated[str, pydantic.Field(description="Region identifier.")] + year: Annotated[int, pydantic.Field(description="Year of the data.")] + parameters: Annotated[ dict[str, Parameter], pydantic.Field(default_factory=dict, description="Parameters."), ] - case: typing.Annotated[ - str, pydantic.Field(description="Case or scenario identifier.") - ] - detailed_technology: typing.Annotated[ + case: Annotated[str, pydantic.Field(description="Case or scenario identifier.")] + detailed_technology: Annotated[ str, pydantic.Field(description="Detailed technology name.") ] @@ -95,9 +93,7 @@ def check_consistency(self) -> bool: missing = [p for p in required if p not in self.parameters] return len(missing) == 0 - def calculate_parameters( - self, parameters: typing.Any | None = None - ) -> "Technology": + def calculate_parameters(self, parameters: Any | None = None) -> Self: """ Calculate missing or derived parameters. @@ -115,7 +111,7 @@ def calculate_parameters( # Placeholder: implement calculation logic as needed return self - def adjust_currency(self, target_currency: str) -> "Technology": + def adjust_currency(self, target_currency: str) -> Self: """ Adjust all currency parameters to a target currency. @@ -133,7 +129,7 @@ def adjust_currency(self, target_currency: str) -> "Technology": # Placeholder: implement currency adjustment logic return self - def adjust_region(self, target_region: str) -> "Technology": + def adjust_region(self, target_region: str) -> Self: """ Adjust technology parameters to match a different region. @@ -151,7 +147,7 @@ def adjust_region(self, target_region: str) -> "Technology": # Placeholder: implement region adjustment logic return self - def adjust_scale(self, scaling_factor: float) -> "Technology": + def adjust_scale(self, scaling_factor: float) -> Self: """ Scale parameter values by a scaling factor. @@ -170,7 +166,7 @@ def adjust_scale(self, scaling_factor: float) -> "Technology": return self @classmethod - def from_dict(cls, data: dict[str, typing.Any]) -> "Technology": + def from_dict(cls, data: dict[str, Any]) -> Self: """ Create an instance of the class from a dictionary. diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index 4d28dd1b..85dd3f61 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -8,8 +8,8 @@ import json import pathlib import re -import typing from collections.abc import Iterator +from typing import Annotated, Self import pandas import pydantic @@ -28,11 +28,11 @@ class TechnologyCollection(pydantic.BaseModel): # type: ignore """ - technologies: typing.Annotated[ + technologies: Annotated[ list[Technology], pydantic.Field(description="List of Technology objects.") ] - def __iter__(self) -> Iterator["Technology"]: + def __iter__(self) -> Iterator[Technology]: """ Return an iterator over the list of Technology objects. @@ -58,7 +58,7 @@ def __len__(self) -> int: def get( self, name: str, region: str, year: int, case: str, detailed_technology: str - ) -> "TechnologyCollection": + ) -> Self: """ Filter technologies based on regex patterns for non-optional attributes. @@ -200,7 +200,7 @@ def to_json( jsonfile.write(json_data) @classmethod - def from_json(cls, file_path: pathlib.Path | str) -> "TechnologyCollection": + def from_json(cls, file_path: pathlib.Path | str) -> Self: """ Load a TechnologyCollection instance from a JSON file. diff --git a/src/technologydata/utils/commons.py b/src/technologydata/utils/commons.py index cb9b2cf1..9e91398f 100644 --- a/src/technologydata/utils/commons.py +++ b/src/technologydata/utils/commons.py @@ -7,7 +7,7 @@ import enum import logging import re -import typing +from typing import Any import dateutil @@ -186,7 +186,7 @@ class Commons: def change_datetime_format( input_datetime_string: str, output_datetime_format: DateFormatEnum, - ) -> str | typing.Any: + ) -> str | Any: """ Change the format of a given datetime string to a specified output format. diff --git a/src/technologydata/utils/units.py b/src/technologydata/utils/units.py index 78351a6c..8e91272d 100644 --- a/src/technologydata/utils/units.py +++ b/src/technologydata/utils/units.py @@ -6,9 +6,9 @@ import json import logging import re -import typing from functools import lru_cache from pathlib import Path +from typing import Any import pandas as pd import pint @@ -312,9 +312,7 @@ def get_iso3_from_currency_code( class SpecialUnitRegistry(pint.UnitRegistry): # type: ignore """A special pint.UnitRegistry subclass that includes methods for handling currency units and conversion using pydeflate.""" - def __init__( - self, *args: tuple[typing.Any, ...], **kwargs: dict[str, typing.Any] - ) -> None: + def __init__(self, *args: tuple[Any, ...], **kwargs: dict[str, Any]) -> None: """ Initialize a SpecialUnitRegistry instance. From 1a1ae6b3bd577736b0e45303d7184623983e8387 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:41:31 +0200 Subject: [PATCH 11/81] code: Allow parameter mul and div with scalars (#37) * code: Allow parameter mul and div with scalars * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: Fix missing imports * code: Fix int not allowed as scalar factor --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/technologydata/parameter.py | 38 ++++++++++++++++++++++++++------- test/test_parameter.py | 35 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 338634fc..f3748013 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -42,7 +42,7 @@ class Parameter(BaseModel): # type: ignore Attributes ---------- - magnitude : float + magnitude : int | float The numerical value of the parameter. units : Optional[str] The unit of the parameter. @@ -60,7 +60,7 @@ class Parameter(BaseModel): # type: ignore """ magnitude: Annotated[ - float, Field(description="The numerical value of the parameter.") + int | float, Field(description="The numerical value of the parameter.") ] units: Annotated[str | None, Field(description="The unit of the parameter.")] = None carrier: Annotated[ @@ -470,14 +470,14 @@ def __sub__(self, other: Self) -> Self: ), ) - def __truediv__(self, other: Self) -> Self: + def __truediv__(self, other: int | float | Self) -> Self: """ Divide this Parameter by another Parameter. Parameters ---------- - other : Parameter - The Parameter instance to divide by. + other : float | Parameter + A scalar or a Parameter instance to divide by. Returns ------- @@ -495,6 +495,17 @@ def __truediv__(self, other: Self) -> Self: It also handles the division of carriers and heating values if present. """ + if isinstance(other, (int | float)): + return Parameter( + magnitude=self.magnitude / other, + units=self.units, + carrier=self.carrier, + heating_value=self.heating_value, + provenance=self.provenance, + note=self.note, + sources=self.sources, + ) + # We don't check general compatibility here, as division is not a common operation for parameters. # Only ensure that the heating values are compatible. if self._pint_heating_value != other._pint_heating_value: @@ -528,14 +539,14 @@ def __truediv__(self, other: Self) -> Self: ), ) - def __mul__(self, other: Self) -> Self: + def __mul__(self, other: int | float | Self) -> Self: """ Multiply two Parameter instances. Parameters ---------- - other : Parameter - The other Parameter instance to multiply with. + other : int | float | Parameter + A scalar or a Parameter instance to multiply with. Returns ------- @@ -556,6 +567,17 @@ def __mul__(self, other: Self) -> Self: - Compatibility checks beyond heating values are not performed. """ + if isinstance(other, int | float): + return Parameter( + magnitude=self.magnitude * other, + units=self.units, + carrier=self.carrier, + heating_value=self.heating_value, + provenance=self.provenance, + note=self.note, + sources=self.sources, + ) + # We don't check general compatibility here, as multiplication is not a common operation for parameters. # Only ensure that the heating values are compatible. if self._pint_heating_value != other._pint_heating_value: diff --git a/test/test_parameter.py b/test/test_parameter.py index 30cc6da5..7c945da4 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -540,6 +540,41 @@ def test_example_parameter( """Test that the fixture example_parameter yields a parameter object.""" assert isinstance(example_parameter, technologydata.Parameter) + def test_parameter_mul_scalar(self) -> None: + """Test multiplication of a Parameter by a scalar.""" + factor = 3.0 + param = technologydata.Parameter(magnitude=2, units="kW") + result = param * factor + assert isinstance(result, technologydata.Parameter) + assert result.magnitude == param.magnitude * factor + assert result.units == param.units + + # Test multiplication by an integer + factor = int(3.0) + param = technologydata.Parameter(magnitude=2, units="kW") + result = param * factor + assert isinstance(result, technologydata.Parameter) + assert result.magnitude == param.magnitude * factor + assert result.units == param.units + + def test_parameter_div_scalar(self) -> None: + """Test division of a Parameter by a scalar.""" + # Test division by an float + divisor = 3.0 + param = technologydata.Parameter(magnitude=6, units="kW") + result = param / divisor + assert isinstance(result, technologydata.Parameter) + assert result.magnitude == param.magnitude / divisor + assert result.units == param.units + + # Test division by an integer + divisor = int(3.0) + param = technologydata.Parameter(magnitude=6, units="kW") + result = param / divisor + assert isinstance(result, technologydata.Parameter) + assert result.magnitude == param.magnitude / divisor + assert result.units == param.units + def test_parameter_pow_basic(self) -> None: """Test integer exponentiation.""" param = technologydata.Parameter(magnitude=2, units="kW") From a67d3798a02658e4ba04f349c41d526f0268dcf1 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:01:57 +0200 Subject: [PATCH 12/81] Solve issues in test_sources.py (#40) * code: solve test issue introducing Engineering Toolbox * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- test/test_source.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/test_source.py b/test/test_source.py index 038dfe8f..8b0f0807 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -153,7 +153,9 @@ def test_retrieve_from_wayback(self, example_source: technologydata.Source) -> N def test_store_in_wayback(self) -> None: """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" - url_to_archive = "https://openenergytransition.org/outputs.html" + url_to_archive = ( + "https://www.engineeringtoolbox.com/co2-emission-fuels-d_1085.html" + ) archived_info = technologydata.Source.store_in_wayback(url_to_archive) # Check if archived_info is None @@ -177,9 +179,9 @@ def test_store_in_wayback(self) -> None: "example_source", [ { - "source_title": "OET project page", - "source_authors": "Open Energy Transition gGmbH", - "source_url": "https://openenergytransition.org/outputs.html", + "source_title": "Engineering Toolbox", + "source_authors": "The Engineering ToolBox (2009). Combustion of Fuels - Carbon Dioxide Emission", + "source_url": "https://www.engineeringtoolbox.com/co2-emission-fuels-d_1085.html", }, ], indirect=["example_source"], From c1e49367a7244b8ffe4b8d0f4ce41f04a36aa936 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:35:58 +0200 Subject: [PATCH 13/81] Issue 24: LHV and HHV (#39) * modify energy_density.py to include SourceCollection for methane * code: add natural_gas * code: add ammonia * code: add wood (dry) * add HHV for carbon * code: add HHV for lignite * code: add coal * code: add methanol * add HHV for jet A * code: add gasoline * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * updates to energy_density.py * code: solve unit tests in test_parameter.py * code: Fix unit test * Update src/technologydata/constants/energy_density.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/utils/carriers.txt Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/utils/carriers.txt Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --------- Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: euronion --- .../constants/energy_density.py | 285 +++++++++++++++++- src/technologydata/utils/carriers.txt | 6 +- test/test_parameter.py | 9 +- 3 files changed, 283 insertions(+), 17 deletions(-) diff --git a/src/technologydata/constants/energy_density.py b/src/technologydata/constants/energy_density.py index 2c98b246..51b005c7 100644 --- a/src/technologydata/constants/energy_density.py +++ b/src/technologydata/constants/energy_density.py @@ -26,36 +26,299 @@ """ -from technologydata import Parameter +from technologydata import Parameter, Source, SourceCollection EnergyDensityLHV: dict[str, Parameter] = dict( hydrogen=Parameter( - magnitude=119.6, - unit="GJ/t", + magnitude=120, + units="MJ/kg", carrier="hydrogen", - # source= # TODO + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), ), methane=Parameter( magnitude=50.0, - unit="GJ/t", + units="MJ/kg", carrier="methane", - # source= # TODO + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + natural_gas=Parameter( + magnitude=47.1, + units="MJ/kg", + carrier="natural_gas", + note="Value for natural gas in the US market", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + ammonia=Parameter( + magnitude=18.646, + units="MJ/kg", + carrier="ammonia", + sources=SourceCollection( + sources=[ + Source( + title="Heat of combustion", + authors="Wikipedia contributors", + url="https://en.wikipedia.org/w/index.php?title=Heat_of_combustion&oldid=1307512525", + url_date="2025-09-09", + ), + ], + ), + ), + wood=Parameter( + magnitude=15.4, + units="MJ/kg", + carrier="wood", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + carbon=Parameter( + magnitude=32.8, + units="MJ/kg", + carrier="carbon", + note="For pure carbon we assume LHV=HHV", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + methanol=Parameter( + magnitude=19.9, + units="MJ/kg", + carrier="methanol", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + gasoline=Parameter( + magnitude=43.4, + units="MJ/kg", + carrier="gasoline", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), ), # Add more energy densities as needed ) EnergyDensityHHV: dict[str, Parameter] = dict( hydrogen=Parameter( - magnitude=141.8, - unit="GJ/t", + magnitude=141.7, + units="MJ/kg", carrier="hydrogen", - # source= # TODO + sources=SourceCollection( + sources=[ + Source( + title="The Engineering ToolBox", + authors="The Engineering ToolBox (2003). Higher Calorific Values of Common Fuels: Reference & Data. [online] Available at:https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html [Accessed 6 September 2025].", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + ), + ], + ), ), methane=Parameter( magnitude=55.5, - unit="GJ/t", + units="MJ/kg", carrier="methane", - # source= # TODO + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + natural_gas=Parameter( + magnitude=52.2, + units="MJ/kg", + carrier="natural_gas", + note="Value for natural gas in the US market", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + ammonia=Parameter( + magnitude=22.5, + units="MJ/kg", + carrier="ammonia", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + wood=Parameter( + magnitude=16.2, + units="MJ/kg", + carrier="wood", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + carbon=Parameter( + magnitude=32.8, + units="MJ/kg", + carrier="carbon", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + lignite=Parameter( + magnitude=14.0, + units="MJ/kg", + carrier="lignite", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + coal=Parameter( + magnitude=32.6, + units="MJ/kg", + carrier="coal", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + methanol=Parameter( + magnitude=23.0, + units="MJ/kg", + carrier="methanol", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), + ), + jet_fuel_a1=Parameter( + magnitude=46.2, + units="MJ/kg", + carrier="jet_fuel_a1", + sources=SourceCollection( + sources=[ + Source( + title="Jet fuel", + authors="Wikipedia contributors", + url="https://en.wikipedia.org/w/index.php?title=Jet_fuel&oldid=1310114781", + url_date="2025-09-07", + ), + ], + ), + ), + gasoline=Parameter( + magnitude=46.4, + units="MJ/kg", + carrier="gasoline", + sources=SourceCollection( + sources=[ + Source( + title="Higher Calorific Values of Common Fuels: Reference & Data", + authors="The Engineering ToolBox (2003)", + url="https://www.engineeringtoolbox.com/fuels-higher-calorific-values-d_169.html", + url_date="2025-09-06", + ), + ], + ), ), # Add more energy densities as needed ) diff --git a/src/technologydata/utils/carriers.txt b/src/technologydata/utils/carriers.txt index 62c526e7..41108aa5 100644 --- a/src/technologydata/utils/carriers.txt +++ b/src/technologydata/utils/carriers.txt @@ -13,17 +13,21 @@ # Format: # = [] [= ] +ammonia = [ammonia] = NH3 carbon = [carbon] = C carbon_dioxide = [carbon_dioxide] = CO2 carbon_monoxide = [carbon_monoxide] = CO -coal = [coal] +coal = [coal] = anthracite = hard_coal = black_coal diesel = [diesel] +gasoline = [gasoline] = petrol jet_fuel_a1 = [jet_fuel_a1] = JETA1 electricity = [electricity] = e = el hydrogen = [hydrogen] = H2 +lignite = [lignite] methane = [methane] = CH4 methanol = [methanol] = CH3OH = MeOH natural_gas = [natural_gas] = NG nitrogen = [nitrogen] = N2 oxygen = [oxygen] = O2 water = [water] = H2O +wood = [wood] diff --git a/test/test_parameter.py b/test/test_parameter.py index 7c945da4..99ed45e2 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -642,7 +642,7 @@ def test_change_heating_value_h2_lhv_to_hhv(self) -> None: heating_value="lower_heating_value", ) p2 = p.change_heating_value("higher_heating_value") - assert pytest.approx(p2.magnitude) == 141.8 + assert pytest.approx(p2.magnitude) == 141.2278 assert p2.heating_value == "higher_heating_value" assert p2.carrier == "hydrogen" assert p2.units == "kilowatt_hour" @@ -656,7 +656,7 @@ def test_change_heating_value_h2_hhv_to_lhv(self) -> None: heating_value="higher_heating_value", ) p2 = p.change_heating_value("lower_heating_value") - assert pytest.approx(p2.magnitude) == 119.6 + assert pytest.approx(p2.magnitude) == 120.0848 assert p2.heating_value == "lower_heating_value" assert p2.carrier == "hydrogen" assert p2.units == "kilowatt_hour" @@ -694,13 +694,12 @@ def test_change_heating_value_no_carrier_in_units(self) -> None: p = technologydata.Parameter( magnitude=1, units="kilowatt_hour", - carrier="hydrogen", + carrier="electricity", heating_value="lower_heating_value", ) p2 = p.change_heating_value("higher_heating_value") - assert pytest.approx(p2.magnitude) == 1.418 / 1.196 + assert p2.magnitude == p.magnitude assert p2.heating_value == "higher_heating_value" - assert p2.carrier == "hydrogen" assert p2.units == "kilowatt_hour" def test_change_heating_value_same_hv(self) -> None: From 0d15d3e35a73d865f959b6663e28688667beaeae Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:33:51 +0200 Subject: [PATCH 14/81] skip tests that usually fail (#41) * skip tests that usually fail * code: type ignore pytest.mark.skip_test * code: change name of pytest marker * code: add automatic skip for webarchive tests * doc: modify the docstring in conftest --- test/conftest.py | 63 +++++++++++++++++++++++++++++++++++++++++++++ test/test_source.py | 3 +++ 2 files changed, 66 insertions(+) diff --git a/test/conftest.py b/test/conftest.py index 08d231e7..a1f77a9d 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -25,6 +25,69 @@ path_cwd = pathlib.Path.cwd() +def pytest_addoption(parser: pytest.Parser) -> None: + """ + Add custom command-line options to pytest. + + This function adds a custom option `--run_webarchive` to the pytest command line. + When this option is specified, it allows the execution of tests marked with the `webarchive` marker. + + Parameters + ---------- + parser : argparse.ArgumentParser + The parser object used to add custom options. + + """ + parser.addoption( + "--run_webarchive", + action="store_true", + default=False, + help="run the webarchive tests", + ) + + +def pytest_configure(config: pytest.Config) -> None: + """ + Configure pytest with custom markers. + + This function adds a custom marker `webarchive` to pytest. Tests marked with this marker + will only be run if the `--run_webarchive` option is specified. + + Parameters + ---------- + config : pytest.Config + The pytest configuration object. + + """ + config.addinivalue_line("markers", "webarchive: mark test as webarchive to run") + + +def pytest_collection_modifyitems(config: pytest.Config, items: pytest.Item) -> None: + """ + Modify the test items collection based on command-line options. + + This function modifies the collection of test items. If the `--run_webarchive` option is not specified, + it skips tests marked with the `webarchive` marker. + By default, tests marked with `webarchive` will be skipped unless the option `--run_webarchive` is provided. + This is because the CI was failing due to rate limits on anonymous capture webarchive requests using savepagenow. + For further details, see https://github.com/open-energy-transition/technology-data/pull/41. + + Parameters + ---------- + config : pytest.Config + The pytest configuration object. + items : list + The list of test items collected by pytest. + + """ + if config.getoption("--run_webarchive"): + return + skip_webarchive = pytest.mark.skip(reason="need --run_webarchive option to run") + for item in items: + if "webarchive" in item.keywords: + item.add_marker(skip_webarchive) + + def create_source_from_params(params: dict[str, str]) -> technologydata.Source: """ Create a Source object from a parameter dictionary with validation. diff --git a/test/test_source.py b/test/test_source.py index 8b0f0807..5522cf13 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -114,6 +114,7 @@ def test_str( # Ensure the snapshot is created assert str(example_source) == expected_string + @pytest.mark.webarchive # type: ignore @pytest.mark.parametrize( "example_source", [ @@ -151,6 +152,7 @@ def test_retrieve_from_wayback(self, example_source: technologydata.Source) -> N # Delete the downloaded file storage_path.unlink(missing_ok=True) + @pytest.mark.webarchive # type: ignore def test_store_in_wayback(self) -> None: """Check if a given url is correctly stored as a snapshot on Internet Archive Wayback Machine.""" url_to_archive = ( @@ -175,6 +177,7 @@ def test_store_in_wayback(self) -> None: except ValueError: pytest.fail("Valid date-time string did not match the format") + @pytest.mark.webarchive # type: ignore @pytest.mark.parametrize( "example_source", [ From 9c6aadc99e11456ccd9660e0075d51ff45f5dc59 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:38:47 +0200 Subject: [PATCH 15/81] Prototype documentation - v1 (#38) * doc: first draft of doc * new updates to docs * new update on docs * docs: update the contributing.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * extend doc and rename files * add linter for markdown * managed to exclude docs from mypy * Update docs/home/license.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update docs/home/license.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update docs/design.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update docs/faq.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * doc: delete overrides/main.html * docs: remove api folder and its content * doc: update to documentation * re-work REUSE.toml * update logo * docs: update REUSE.toml, minor typos * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- .codespell.ignore | 1 + .github/instructions/copilot-instructions.md | 5 +- .pre-commit-config.yaml | 9 +- .readthedocs.yaml | 24 + REUSE.toml | 4 +- docs/assets/extensions/dynamic_inspect.py | 32 + docs/assets/javascripts/matjax.js | 21 + docs/assets/javascripts/readthedocs.js | 24 + docs/assets/logo/technology_data_logo.png | Bin 0 -> 501579 bytes docs/assets/overrides/hooks/shortcodes.py | 274 ++ docs/assets/stylesheets/extra.css | 60 + docs/contributing.md | 35 - docs/contributing/CODE_OF_CONDUCT.md | 136 + docs/contributing/contributors.md | 8 + docs/contributing/instructions.md | 188 ++ docs/home/citing.md | 3 + docs/home/contacts.md | 7 + docs/home/faq.md | 26 + docs/home/installation.md | 21 + docs/home/license.md | 26 + docs/home/release-notes.md | 9 + docs/home/users.md | 19 + docs/index.md | 6 + docs/{ => user_guide}/class-diagram.puml | 0 docs/{ => user_guide}/design.md | 144 +- docs/{ => user_guide}/parameter.md | 6 +- mkdocs.yaml | 175 ++ pyproject.toml | 18 +- uv.lock | 2361 ++++++++++++------ 29 files changed, 2745 insertions(+), 897 deletions(-) create mode 100644 .readthedocs.yaml create mode 100644 docs/assets/extensions/dynamic_inspect.py create mode 100644 docs/assets/javascripts/matjax.js create mode 100644 docs/assets/javascripts/readthedocs.js create mode 100644 docs/assets/logo/technology_data_logo.png create mode 100644 docs/assets/overrides/hooks/shortcodes.py create mode 100644 docs/assets/stylesheets/extra.css delete mode 100644 docs/contributing.md create mode 100644 docs/contributing/CODE_OF_CONDUCT.md create mode 100644 docs/contributing/contributors.md create mode 100644 docs/contributing/instructions.md create mode 100644 docs/home/citing.md create mode 100644 docs/home/contacts.md create mode 100644 docs/home/faq.md create mode 100644 docs/home/installation.md create mode 100644 docs/home/license.md create mode 100644 docs/home/release-notes.md create mode 100644 docs/home/users.md create mode 100644 docs/index.md rename docs/{ => user_guide}/class-diagram.puml (100%) rename docs/{ => user_guide}/design.md (76%) rename docs/{ => user_guide}/parameter.md (100%) create mode 100644 mkdocs.yaml diff --git a/.codespell.ignore b/.codespell.ignore index cf2749ba..a292ceee 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -1,3 +1,4 @@ # SPDX-FileCopyrightText: The technology-data authors # # SPDX-License-Identifier: MIT +CAF diff --git a/.github/instructions/copilot-instructions.md b/.github/instructions/copilot-instructions.md index a7a7955a..2d93e54e 100644 --- a/.github/instructions/copilot-instructions.md +++ b/.github/instructions/copilot-instructions.md @@ -1,10 +1,11 @@ +# Copilot Coding Agent Instructions for `technologydata` + -# Copilot Coding Agent Instructions for `technologydata` +--> ## Project Overview - `technologydata` is a Python package for energy system modellers to screen, harmonize, and transform techno-economic input data for energy system models. diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 60665819..30c759f0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: # Ruff: Python linter and formatter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.8 + rev: v0.12.10 hooks: - id: ruff args: [--fix] @@ -53,6 +53,7 @@ repos: - id: mypy args: [--strict, --ignore-missing-imports, --config-file=pyproject.toml] additional_dependencies: [tokenize-rt==3.2.0] + exclude: ^docs/ # Pyupgrade: Automatically upgrades Python syntax - repo: https://github.com/asottile/pyupgrade @@ -66,3 +67,9 @@ repos: rev: v5.0.2 hooks: - id: reuse + +- repo: https://github.com/rvben/rumdl-pre-commit + rev: v0.0.99 # Use the latest release tag + hooks: + - id: rumdl + args: ["--fix", "--disable=MD013, MD024, MD030"] diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..0906dd5c --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,24 @@ +version: 2 + +build: + os: ubuntu-24.04 + tools: + python: "3.13" + jobs: + pre_system_dependencies: + - git fetch --unshallow # Needed to get version tags + pre_install: + - pip install mkdocs-material + +mkdocs: + configuration: mkdocs.yaml + # fail_on_warning: true # TODO: Enable + +python: + install: + - method: pip + path: . + extra_requirements: + - docs + - dev + - cartopy diff --git a/REUSE.toml b/REUSE.toml index 79009ed1..4633211e 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -4,12 +4,12 @@ SPDX-PackageSupplier = "The technology-data authors" SPDX-PackageDownloadLocation = "https://github.com/pypsa/technology-data" [[annotations]] -path = ["uv.lock"] +path = ["uv.lock", "*.yaml", "docs/**",] SPDX-FileCopyrightText = "The technology-data authors" SPDX-License-Identifier = "MIT" [[annotations]] -path = ["test/test_data/*/*", "test/test_data/*/*/*"] +path = ["test/test_data/**",] SPDX-FileCopyrightText = "The technology-data authors" SPDX-License-Identifier = "CC-BY-4.0" diff --git a/docs/assets/extensions/dynamic_inspect.py b/docs/assets/extensions/dynamic_inspect.py new file mode 100644 index 00000000..da077055 --- /dev/null +++ b/docs/assets/extensions/dynamic_inspect.py @@ -0,0 +1,32 @@ +""" +Retrieve docstrings from runtime objects instead of static analysis (default). + +See https://mkdocstrings.github.io/griffe/guide/users/how-to/selectively-inspect/ +""" + +import griffe + +logger = griffe.get_logger("griffe_inspect_specific_objects") + + +class InspectSpecificObjects(griffe.Extension): + """An extension to inspect just a few specific objects.""" + + def __init__(self, objects: list[str]) -> None: + self.objects = objects + + def on_instance(self, *, obj: griffe.Object) -> None: + if obj.path not in self.objects: + return + logger.info("Using InspectSpecificObjects for %s", obj.path) + + try: + runtime_obj = griffe.dynamic_import(obj.path) + except ImportError as error: + logger.warning("Could not import %s: %s", obj.path, error) + return + + if obj.docstring: + obj.docstring.value = runtime_obj.__doc__ + else: + obj.docstring = griffe.Docstring(runtime_obj.__doc__) diff --git a/docs/assets/javascripts/matjax.js b/docs/assets/javascripts/matjax.js new file mode 100644 index 00000000..c20d5fdb --- /dev/null +++ b/docs/assets/javascripts/matjax.js @@ -0,0 +1,21 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } + }; + + document$.subscribe(() => { + + + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() + }) diff --git a/docs/assets/javascripts/readthedocs.js b/docs/assets/javascripts/readthedocs.js new file mode 100644 index 00000000..8036eaba --- /dev/null +++ b/docs/assets/javascripts/readthedocs.js @@ -0,0 +1,24 @@ +// Use CustomEvent to generate the version selector +document.addEventListener( + "readthedocs-addons-data-ready", + function (event) { + const config = event.detail.data(); + const versioning = ` +
+ + + +
`; + + document.querySelector(".md-header__topic").insertAdjacentHTML("beforeend", versioning); + }); diff --git a/docs/assets/logo/technology_data_logo.png b/docs/assets/logo/technology_data_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..32d9a3119bd13f39aa4ea301cd90f0198ecfd96f GIT binary patch literal 501579 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�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%0A@g$zpO;wg_!Vg9ExER$+OfEdg4LF5Q(_N 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ℜ43>Ehadu)O^kJ8kxDn;XM;|)22BWeHLCa7 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 CJdk6`1m#Ow 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", replace, markdown, flags=re.I | re.M) + + +# ----------------------------------------------------------------------------- +# Helper functions +# ----------------------------------------------------------------------------- + + +# Create a flag of a specific type +def flag(args: str, page: Page, files: Files): + type, *_ = args.split(" ", 1) + if type == "experimental": + return _badge_for_experimental(page, files) + elif type == "required": + return _badge_for_required(page, files) + elif type == "customization": + return _badge_for_customization(page, files) + elif type == "metadata": + return _badge_for_metadata(page, files) + elif type == "multiple": + return _badge_for_multiple(page, files) + raise RuntimeError(f"Unknown type: {type}") + + +# Create a linkable option +def option(type: str): + _, *_, name = re.split(r"[.:]", type) + return f"[`{name}`](#+{type}){{ #+{type} }}\n\n" + + +# Create a linkable setting - @todo append them to the bottom of the page +def setting(type: str): + _, *_, name = re.split(r"[.*]", type) + return f"`{name}` {{ #{type} }}\n\n[{type}]: #{type}\n\n" + + +# ----------------------------------------------------------------------------- + + +# Resolve path of file relative to given page - the posixpath always includes +# one additional level of `..` which we need to remove +def _resolve_path(path: str, page: Page, files: Files): + path, anchor, *_ = f"{path}#".split("#") + path = _resolve(files.get_file_from_path(path), page) + return "#".join([path, anchor]) if anchor else path + + +# Resolve path of file relative to given page - the posixpath always includes +# one additional level of `..` which we need to remove +def _resolve(file: File, page: Page): + try: + path = posixpath.relpath(file.src_uri, page.file.src_uri) + return posixpath.sep.join(path.split(posixpath.sep)[1:]) + except Exception as e: + raise Exception(f"Cannot resolve path for {file} relative to {page}") from e + + +# ----------------------------------------------------------------------------- + + +# Create badge +def _badge(icon: str, text: str = "", type: str = ""): + classes = f"mdx-badge mdx-badge--{type}" if type else "mdx-badge" + return "".join( + [ + f'', + *([f'{text}'] if text else []), + "", + ] + ) + + +# Create sponsors badge +def _badge_for_sponsors(page: Page, files: Files): + icon = "material-heart" + href = _resolve_path("index.md", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Sponsors only')", type="heart") + + +# Create badge for version +def _badge_for_version(text: str, page: Page, files: Files): + spec = text + path = f"release-notes.md#{spec}" + + # Return badge + icon = "material-tag-outline" + href = _resolve_path(path, page, files) + return _badge( + icon=f"[]({href} 'Minimum version')", + text=f"[:{icon}: {text}]({href})" if spec else "", + ) # {_resolve_path(path, page, files)} + + +# Create badge for feature +def _badge_for_feature(text: str, page: Page, files: Files): + icon = "material-toggle-switch" + href = _resolve_path("index.md", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Optional feature')", text=text) + + +# Create badge for plugin +def _badge_for_plugin(text: str, page: Page, files: Files): + icon = "material-floppy" + href = _resolve_path("index.md", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Plugin')", text=text) + + +# Create badge for extension +def _badge_for_extension(text: str, page: Page, files: Files): + icon = "material-language-markdown" + href = _resolve_path("index.md", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Markdown extension')", text=text) + + +# Create badge for utility +def _badge_for_utility(text: str, page: Page, files: Files): + icon = "material-package-variant" + href = _resolve_path("index.md", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Third-party utility')", text=text) + + +# Create badge for example +def _badge_for_example(text: str, page: Page, files: Files): + return "\n".join( + [ + _badge_for_example_download(text, page, files), + _badge_for_example_view(text, page, files), + ] + ) + + +# Create badge for example view +def _badge_for_example_view(text: str, page: Page, files: Files): + icon = "material-folder-eye" + href = f"https://mkdocs-material.github.io/examples/{text}/" + return _badge(icon=f"[:{icon}:]({href} 'View example')", type="right") + + +# Create badge for example download +def _badge_for_example_download(text: str, page: Page, files: Files): + icon = "material-folder-download" + href = f"https://mkdocs-material.github.io/examples/{text}.zip" + return _badge( + icon=f"[:{icon}:]({href} 'Download example files')", + text=f"[`.zip`]({href})", + type="right", + ) + + +# Create badge for demo repository +def _badge_for_demo(text: str, page: Page, files: Files): + icon = "material-github" + href = f"https://github.com/mkdocs-material/{text}" + return _badge(icon=f"[:{icon}:]({href} 'Demo repository')", text=text, type="right") + + +# Create badge for default value +def _badge_for_default(text: str, page: Page, files: Files): + icon = "material-water" + href = _resolve_path("conventions.md#default", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Default value')", text=text) + + +# Create badge for empty default value +def _badge_for_default_none(page: Page, files: Files): + icon = "material-water-outline" + href = _resolve_path("conventions.md#default", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Default value is empty')") + + +# Create badge for computed default value +def _badge_for_default_computed(page: Page, files: Files): + icon = "material-water-check" + href = _resolve_path("conventions.md#default", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Default value is computed')") + + +# Create badge for metadata property flag +def _badge_for_metadata(page: Page, files: Files): + icon = "material-list-box-outline" + href = _resolve_path("conventions.md#metadata", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Metadata property')") + + +# Create badge for required value flag +def _badge_for_required(page: Page, files: Files): + icon = "material-alert" + href = _resolve_path("conventions.md#required", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Required value')") + + +# Create badge for customization flag +def _badge_for_customization(page: Page, files: Files): + icon = "material-brush-variant" + href = _resolve_path("conventions.md#customization", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Customization')") + + +# Create badge for multiple instance flag +def _badge_for_multiple(page: Page, files: Files): + icon = "material-inbox-multiple" + href = _resolve_path("conventions.md#multiple-instances", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Multiple instances')") + + +# Create badge for experimental flag +def _badge_for_experimental(page: Page, files: Files): + icon = "material-flask-outline" + href = _resolve_path("conventions.md#experimental", page, files) + return _badge(icon=f"[:{icon}:]({href} 'Experimental')") diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css new file mode 100644 index 00000000..97033243 --- /dev/null +++ b/docs/assets/stylesheets/extra.css @@ -0,0 +1,60 @@ +:root > * { + --md-primary-fg-color: #292F36; + --md-primary-fg-color--light: #ECB7B7; + --md-primary-fg-color--dark: #90030C; + --md-primary-bg-color: white; + --md-accent-fg-color: rgba(209, 10, 73, 0.5); + --md-typeset-a-color: #d10a49; +} + +.md-banner { + text-align: center; + background-color: #0A8754; + --md-typeset-a-color: #292F36; + --md-accent-fg-color: white; +} + +/* Custom admonition icons */ +:root { + --md-admonition-icon--deprecation: url('data:image/svg+xml;charset=utf-8,api-off') +} +.md-typeset .admonition.deprecation, +.md-typeset details.deprecation { + border-color: #ff9101; +} +.md-typeset .deprecation > .admonition-title, +.md-typeset .deprecation > summary { + background-color: #fff5eb; +} +.md-typeset .deprecation > .admonition-title::before, +.md-typeset .deprecation > summary::before { + background-color: #ff9101; + -webkit-mask-image: var(--md-admonition-icon--deprecation); + mask-image: var(--md-admonition-icon--deprecation); +} + +/* Hide In/Out prompts */ +.md-typeset .jp-InputPrompt, +.md-typeset .jp-OutputPrompt, +.md-typeset .prompt { display: none !important; } + +/* Clamp notebook width to Material content width */ +.md-content__inner :is(.jp-Notebook, .nbconvert-document) { + max-width: var(--md-typeset-width) !important; + margin-inline: auto !important; + width: 100% !important; +} + +/* Use Material’s code font in notebook code (inputs + outputs) */ +.md-typeset :is(.jp-Notebook, .nbconvert-document) pre { + font-family: var(--md-code-font) !important; + font-size: 15px !important; +} + +/* Remove the frame around input cells */ +.md-typeset :is(.jp-InputArea, .jp-InputArea-editor, .jp-Cell-inputWrapper, .cell .input_area, .CodeMirror, .cm-editor) { + border: 0 !important; + box-shadow: none !important; + outline: 0 !important; + background: transparent !important; +} diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index b6c74006..00000000 --- a/docs/contributing.md +++ /dev/null @@ -1,35 +0,0 @@ - -# Contributing - -## Development dependencies - -To contribute to this project, you will need to install the development dependencies. -These dependencies include everything needed for development, testing and building the documentation of the project. - -To install the development dependencies, run the following command inside the project directory: - -```bash -uv sync -``` - -The development dependencies include `ipykernel` to support Jupyter notebooks and integration into e.g. VS Code. - -To view the full list of development dependencies, you can check the `pyproject.toml` file under the `[dependency-groups]` section as `dev` and `docs`, which are both included in the `default-groups`. - -## Testing - -To run all tests in parallel, you can use the following command: - -```bash -pytest -n auto -``` - -Some tests may not be thread-safe and therefore fail unexpectedly when run in parallel. -If you encounter such issues, you can run the tests sequentially by omitting the `-n auto` option: - -```bash -pytest -``` diff --git a/docs/contributing/CODE_OF_CONDUCT.md b/docs/contributing/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..fc9c0b6a --- /dev/null +++ b/docs/contributing/CODE_OF_CONDUCT.md @@ -0,0 +1,136 @@ +# Code of Conduct + +!!! info + + This Code of Conduct follows the [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/). + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at + / / t.brown@tu-berlin.de. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[][FAQ]. Translations are available at +[][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/docs/contributing/contributors.md b/docs/contributing/contributors.md new file mode 100644 index 00000000..920eccc6 --- /dev/null +++ b/docs/contributing/contributors.md @@ -0,0 +1,8 @@ + +# Contributors + +!!! info + + Up-to-date statistics and a complete list of contributors to PyPSA can be found under [GitHub Insights](https://github.com/PyPSA/technology-data/graphs/contributors). + +TODO: Update automatically and list all contributors. diff --git a/docs/contributing/instructions.md b/docs/contributing/instructions.md new file mode 100644 index 00000000..6ff8fe60 --- /dev/null +++ b/docs/contributing/instructions.md @@ -0,0 +1,188 @@ +# Instructions for contributing to the project + + + +First of all, thank you for your contributions to `technologydata`! + +We enthusiastically invite anyone interested in `technologydata` to share new ideas, provide suggestions, submit bug reports, or contribute code changes. + +## How to contribute + +- [Code contributions](#code-contributions): Implement new features, fix bugs, or improve the performance. +- [Documentation contributions](#documentation-contributions): Improve the documentation by adding new sections, fixing typos, or clarifying existing content. + +## Where to go for help + +- To **discuss** with other `technologydata` users, organise projects, share news, and get in touch with the community, please refer to the [Contacts](/docs/home/contacts.md) page. +- For **guidelines to contribute**, stay right here. + +## Code contributions + +## Contribution workflow in a nutshell + +- Fork the repository on GitHub. Please make sure to check the box `Copy the master branch only` +- Clone your fork: `git clone https://github.com//technology-data.git` +- Set up the `upstream` repository (see [Set up the upstream repository](#set-up-the-upstream-repository)) +- Fetch the upstream tags `git fetch --tags upstream` +- Install with dependencies in editable mode (see [Install dependencies](#install-dependencies)) +- Setup linter and formatter, e.g `pre-commit install` (see [Code linting and formatting](#code-linting-and-formatting)) +- Write your code (preferably on a new branch) +- Run tests: `pytest` (see [Testing](#testing)) +- Push your changes to your fork and create a pull request on GitHub + +### Set up the upstream repository + +To keep your fork up to date with the original repository, you need to set up the `upstream` remote repository: + +```bash +git remote add upstream https://github.com/PyPSA/technology-data.git +``` + +To verify that the remotes have been set up correctly, you can run: + +```bash +git remote -v +``` + +The output should look like this: + +```plaintext +origin https://github.com//technology-data.git (fetch) +origin https://github.com//technology-data.git (push) +upstream https://github.com/PyPSA/technology-data.git (fetch) +upstream https://github.com/PyPSA/technology-data.git (push) +``` + +### Install dependencies + +To contribute to this project, you will need to install the development dependencies. +These dependencies are listed in the `pyproject.toml` file and include everything needed for development, testing and building the documentation of the project. + +To install the development dependencies, run the following command inside the project directory: + +```bash +uv sync +``` + +This will create a virtual environment at `.venv`. + +The development dependencies include `ipykernel` to support Jupyter notebooks and integration into e.g. VS Code. + +To view the full list of development dependencies, you can check the `pyproject.toml` file under the `[dependency-groups]` section as `dev` and `docs`, which are both included in the `default-groups`. + +The virtual environment can be "activated" to make its packages available: + +=== "macOS and Linux" + + ```bash + source .venv/bin/activate + ``` + +=== "Windows" + + ```pwsh-session + PS> .venv\Scripts\activate + ``` + +To exit a virtual environment, use the `deactivate` command: + +```bash +deactivate +``` + +#### Add new development dependencies + +To add new dependencies to a specific dependency group in the `pyproject.toml`: + +```bash +uv add package_name --group group_name +``` + +To install the new dependency run `uv sync`. + +### Code linting and formatting + +#### pre-commit + +[pre-commit](https://pre-commit.com) is used to ensure a consistent code style and to catch common programming errors or bad practices before they are committed. + +The tool is installed with development dependencies. It can be also installed manually via `pip install pre-commit` or `conda install -c conda-forge pre-commit`. + +To use it automatically before every commit (recommended), just run once: + +```bash +pre-commit install +``` + +This will automatically check the changes which are staged before you commit them. + +To manually run it, use: + +```bash +pre-commit run --all +``` + +This will check all files in the repository. + +#### Ruff + +[Ruff](https://docs.astral.sh/ruff) is used as the project linter and formatter. It combines common tools like Flake8, Black, etc. +Besides pre-commit, you can also run it via your CLI (see [Ruff installation](https://docs.astral.sh/ruff/installation/)) or IDE (e.g. VSCode [plugin](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff)). + +Ruff is also already installed with the development dependencies, but you can also install it +manually using `pip install ruff`. + +To use the linter in your CLI, run: + +```bash +ruff check . --fix +``` + +This will check all files in the repository and gives you hints on what to improve. The +`--fix` flag will also automatically fix some of the issues, if possible. Some +issues need to be fixed manually. + +And to run the formatter, use: + +```bash +ruff format . +``` + +This will format all the files in the repository and immediately apply the changes to +them. It is basically [the same](https://docs.astral.sh/ruff/faq/#how-does-ruffs-formatter-compare-to-black) +as Black. + +> **Note**: It is not mandatory to use either Ruff or pre-commit. We will also be running it in +> our CI/CD pipeline. But it's highly recommended, to make everyone's life easier. + +### Testing + +To run all tests in parallel, you can use the following command: + +```bash +pytest -n auto +``` + +Some tests may not be thread-safe and therefore fail unexpectedly when run in parallel. +If you encounter such issues, you can run the tests sequentially by omitting the `-n auto` option: + +```bash +pytest +``` + +## Documentation contributions + +The documentation is generated with [MkDocs](https://www.mkdocs.org/). The documentation source files are written in Markdown and are available under the `/docs` sub-folder. The documentation is configured with the `mkdocs.yaml` file. + +!!! note + If you are not familiar with Markdown, consult the following [quick guide](https://www.markdownguide.org/basic-syntax/). + +MkDocs offers the possibility to start a built-in development server to preview the documentation as you work on it. To start the development server run: + +```bash +mkdocs serve +``` diff --git a/docs/home/citing.md b/docs/home/citing.md new file mode 100644 index 00000000..5922dbef --- /dev/null +++ b/docs/home/citing.md @@ -0,0 +1,3 @@ +# Citing + +TODO diff --git a/docs/home/contacts.md b/docs/home/contacts.md new file mode 100644 index 00000000..edec8092 --- /dev/null +++ b/docs/home/contacts.md @@ -0,0 +1,7 @@ +# Contacts + +Please consider the following ways to reach out to the community and the developers: + +* To **discuss** with other `technology-data` users, organise projects, share news, and get in touch with the community you can use the [Discord server](https://discord.gg/T7YZbnVU). +* For **bugs and feature requests**, please use the [issue tracker](https://github.com/PyPSA/technology-data/issues). +* We strongly welcome anyone interested in providing **contributions** to this project. If you have any ideas, suggestions or encounter problems, feel invited to file issues or make pull requests on [GitHub](https://github.com/PyPSA/technology-data). diff --git a/docs/home/faq.md b/docs/home/faq.md new file mode 100644 index 00000000..f108a77b --- /dev/null +++ b/docs/home/faq.md @@ -0,0 +1,26 @@ +# Frequently Asked Questions (FAQ) + +## How should I cite this package? + +See the dedicated page on [Citing](citing.md). + +## How do I add a new data source? + +TODO + +## If I use the package today, will the data change when I update the package later? + +TODO + +## How can I support your work? + +TODO + +## I would like to get involved, what can I do? + +TODO + +## How is this project different to GENESTE or other projects? + +TODO +and ref. to GENESTE: diff --git a/docs/home/installation.md b/docs/home/installation.md new file mode 100644 index 00000000..6238f0c1 --- /dev/null +++ b/docs/home/installation.md @@ -0,0 +1,21 @@ +# Installation + +You can install `technologydata` using either **PyPI** or **conda-forge**. Choose the method that best fits your workflow. + +## Using pip (from PyPI) + +```bash +pip install technologydata +``` + +## Using uv (from PyPI, faster alternative to pip) + +```bash +uv pip install technologydata +``` + +## Using conda (from conda-forge) + +```bash +conda install -c conda-forge technologydata +``` diff --git a/docs/home/license.md b/docs/home/license.md new file mode 100644 index 00000000..ae029c5b --- /dev/null +++ b/docs/home/license.md @@ -0,0 +1,26 @@ +# License + +`technology-data` is licensed under the open-source [MIT](https://opensource.org/license/mit) license: + +```text +MIT License + +Copyright The technology-data authors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/docs/home/release-notes.md b/docs/home/release-notes.md new file mode 100644 index 00000000..36a9d8bd --- /dev/null +++ b/docs/home/release-notes.md @@ -0,0 +1,9 @@ +# Release Notes + +## Upcoming Release + +!!! warning "Unreleased Features" + + The features listed below are not released yet, but will be part of the next release! + To use the features already you have to clone and install the repository from GitHub, e.g. using + ``pip install git+https://github.com/PyPSA/technology-data``. diff --git a/docs/home/users.md b/docs/home/users.md new file mode 100644 index 00000000..76711e86 --- /dev/null +++ b/docs/home/users.md @@ -0,0 +1,19 @@ +# Users + +The following contains a list of users from academia, industry, institutions and organisations that are actively using `technologydata` or have used it in the past. +The list references to specific projects to showcase the different use cases of `technologydata`. + +If you are missing from this list and would like to be included, give us a shoutout on our Discord server, drop us a message elsewhere or open a pull request in the repository, as described . +We would love to hear about your use case and stay in touch, in order to develop and evolve this package further. + +## Academia and Research institutions + +TODO + +## Industry + +TODO + +## Institutions and Organisations + +TODO diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..7efe43cb --- /dev/null +++ b/docs/index.md @@ -0,0 +1,6 @@ +# technologydata: Techno-economic assumptions for energy models + +!!! note "Under Construction" + + The documentation is currently under construction. + Please come back later. diff --git a/docs/class-diagram.puml b/docs/user_guide/class-diagram.puml similarity index 100% rename from docs/class-diagram.puml rename to docs/user_guide/class-diagram.puml diff --git a/docs/design.md b/docs/user_guide/design.md similarity index 76% rename from docs/design.md rename to docs/user_guide/design.md index ffcc09fd..4f01732c 100644 --- a/docs/design.md +++ b/docs/user_guide/design.md @@ -1,27 +1,21 @@ +# Use cases we have designed `technology-data` for + -# Design -1. [Design](#design) - 1. [Target audience](#target-audience) - 2. [Use Cases](#use-cases) - 1. [🧾 UC-001: Screen techno-economic inputs for validity and completeness](#uc-001-screen-techno-economic-inputs-for-validity-and-completeness) - 2. [🧾 UC-002: Harmonize multiple input datasets](#uc-002-harmonize-multiple-input-datasets) - 3. [🧾 UC-003: Transform assumptions into model-ready formats](#uc-003-transform-assumptions-into-model-ready-formats) - 4. [🧾 UC-004: Compare techno-economic indicators across datasets](#uc-004-compare-techno-economic-indicators-across-datasets) - 5. [🧾 UC-005: Audit data provenance and transformation trace](#uc-005-audit-data-provenance-and-transformation-trace) +--> +## Design `technologydata` is designed for energy system modellers in mind. It intendeds to serve common use cases encountered during the design, development and execution of energy system model experiments, such as: -* Screening techno-economic inputs for energy systems -* Comparing techno-economics indicators -* Harmonizing inputs -* Modelling of input assumptions for gap filling -* Transformation of assumptions into model-ready input formats +- Screening techno-economic inputs for energy systems +- Comparing techno-economics indicators +- Harmonizing inputs +- Modelling of input assumptions for gap filling +- Transformation of assumptions into model-ready input formats The project was started for PyPSA-Eur and has since then been expanded to serve more models and purposes. As such it has been leaning towards serving the purposes of PyPSA-Eur and related models. @@ -32,28 +26,39 @@ We hope to expand it to serve the wider energy system modeling community and a s The users we target are Energy System Modellers and Analysts. We assume they are all: -* Familiar with the concept of techno-economics on how to describe technical and economic parameters of technologies for energy system models -* Familiar with the methodology of transforming techno-economic parameters for alignment and harmonization +- Familiar with the concept of techno-economics on how to describe technical and economic parameters of technologies for energy system models +- Familiar with the methodology of transforming techno-economic parameters for alignment and harmonization The users differ in their experience in these fields, but are generally aware of the methodological background behind the transformations that we make available, like inflation adjustments, currency conversions or unit conversions. -* They prefer simplicity and robustness in use over being able to customize the transformations. -* They would like to be offered a range of options to choose from, but not too many. -* They would like to be able to use the package without having to read too much documentation, but require clear documentation on the transformations that are applied. -* Data provenance and reproducibility are important to them, so they need to be able to trace data back to its source and understand all individual steps that were applied in the transformation process to the data. +- They prefer simplicity and robustness in use over being able to customize the transformations. +- They would like to be offered a range of options to choose from, but not too many. +- They would like to be able to use the package without having to read too much documentation, but require clear documentation on the transformations that are applied. +- Data provenance and reproducibility are important to them, so they need to be able to trace data back to its source and understand all individual steps that were applied in the transformation process to the data. + +The users differ in their experience with Python and programming in general, we aim to serve three main user types + +### Programmers and Data Engineers + +These users are: + +- Well familiar with using Python and object-oriented programming languages, data processing and exchange formats. +- Interacts with the package through Python scripts, Python modules and Jupyter notebooks. -The users differ in their experience with Python and programming in general, we aim to serve three main user types: +#### Energy System Modeller -1. Programmers and Data Engineers: - * Well familiar with using Python and object-oriented programming languages, data processing and exchange formats. - * Interacts with the package through Python scripts, Python modules and Jupyter notebooks. -2. Energy System Modeller: - * Only basic Python programming skills. - * Interacts with the package through a Jupyter notebook or a Python script; may want to simply access and inspect the data without writing and executing code. -3. Energy Analyst: - * No programming skills or only very basic Python skills like using pandas or DataFrames. - * Interacts with the package either through a Jupyter notebook or wants to be able to use csv / Spreadsheet files for inspection and use of the data. +These users are: + +- Only basic Python programming skills. +- Interacts with the package through a Jupyter notebook or a Python script; may want to simply access and inspect the data without writing and executing code. + +#### Energy Analyst + +These users are: + +- No programming skills or only very basic Python skills like using pandas or DataFrames. +- Interacts with the package either through a Jupyter notebook or wants to be able to use csv / Spreadsheet files for inspection and use of the data. ## Use Cases @@ -66,6 +71,7 @@ Below follow central use cases that we want to serve with `technologydata`. - **Secondary**: Energy Analyst (if reviewing pre-screened data) #### 🎯 Goal + Detect and correct inconsistencies or omissions in techno-economic input data, ensuring it adheres to the package's schema and parameter constraints. #### πŸ“š Pre-conditions @@ -85,12 +91,16 @@ Detect and correct inconsistencies or omissions in techno-economic input data, e 1. User gets/loads or defines technology input (via JSON, DataFrame, or the packaged data). 2. `Technology` object is instantiated, triggering automatic validation. 3. Schema checks enforce: - - Presence of required fields (e.g., name, parameter value, unit, source) - - Consistency between parameters (e.g., energy unit alignment) + +- Presence of required fields (e.g., name, parameter value, unit, source) +- Consistency between parameters (e.g., energy unit alignment) + 4. User manually runs `.check_consistency()` or similar method to detect conflicting or incomplete parameters. 5. User manually runs `.calculate_parameters()` to derive - - specific missing parameters based on known rules (e.g., specific investment, EAC), or - - all missing parameters that can be derived from the existing parameters + +- specific missing parameters based on known rules (e.g., specific investment, EAC), or +- all missing parameters that can be derived from the existing parameters + 6. The User can manually update parameters, either overwriting existing or adding missing ones. 7. Validated and completed `Technology` object is now ready for transformation or analysis. @@ -141,13 +151,13 @@ tech = Technology( #### πŸ“Š Importance & Frequency -* Importance: High -* Usage Frequency: Frequent, core workflow entry point +- Importance: High +- Usage Frequency: Frequent, core workflow entry point #### πŸ“Œ Notes -* Consistency logic includes checks for units, and dependency constraints between parameters (e.g. one parameter may be derived from one or more other parameters). -* Schema-based validation is extensible to new parameter types and sources. +- Consistency logic includes checks for units, and dependency constraints between parameters (e.g. one parameter may be derived from one or more other parameters). +- Schema-based validation is extensible to new parameter types and sources. ### 🧾 UC-002: Harmonize multiple input datasets @@ -156,6 +166,7 @@ tech = Technology( - **Secondary**: Data Engineer #### 🎯 Goal + Enable the user to bring multiple techno-economic datasets to a common basis (currency, year, units) using explicit, user-invoked transformation methods, so that they can be compared or combined. #### πŸ“š Pre-conditions @@ -171,10 +182,12 @@ Enable the user to bring multiple techno-economic datasets to a common basis (cu 1. User loads datasets (e.g., from JSON, CSV, or DataFrame) into separate `DataPackage` or `TechnologyCollection` objects or creates them programmatically through the package's class interface. 2. User inspects the datasets to identify differences in currency, year, units, or other conventions. 3. User applies transformation methods as needed: - - `.adjust_currency(target_currency)` - - `.adjust_scale(target_capacity, scaling_exponent)` - - `.adjust_region(target_region)` - - Unit conversions per parameter via Technology or TechnologyCollection level methods + +- `.adjust_currency(target_currency)` +- `.adjust_scale(target_capacity, scaling_exponent)` +- `.adjust_region(target_region)` +- Unit conversions per parameter via Technology or TechnologyCollection level methods + 4. User repeats or chains transformations as required or desired for each dataset. 5. User verifies harmonization by inspecting key parameters and units. 6. Harmonized datasets are now ready for comparison, merging, or further analysis. @@ -209,14 +222,14 @@ dp1.technologies = dp1.technologies.adjust_units(parameter="specific-investment" #### πŸ“Š Importance & Frequency -* Importance: High -* Usage Frequency: Frequent, especially when integrating or comparing datasets +- Importance: High +- Usage Frequency: Frequent, especially when integrating or comparing datasets #### πŸ“Œ Notes -* All harmonization steps are explicit and user-driven; no automatic harmonization is performed. -* The user is responsible for the order and combination of transformations. -* Optionally, each transformation could be logged as data provenance, allowing users to trace back the steps taken and record them in e.g. a output file for documentation. +- All harmonization steps are explicit and user-driven; no automatic harmonization is performed. +- The user is responsible for the order and combination of transformations. +- Optionally, each transformation could be logged as data provenance, allowing users to trace back the steps taken and record them in e.g. a output file for documentation. ### 🧾 UC-003: Transform assumptions into model-ready formats @@ -224,6 +237,7 @@ dp1.technologies = dp1.technologies.adjust_units(parameter="specific-investment" - **Primary**: Energy System Modeller, Programmer #### 🎯 Goal + Allow the user to derive and access all model-relevant parameters (e.g., EAC, specific investment) from harmonized data, ready for direct use in energy system models such as PyPSA-Eur. #### πŸ“š Pre-conditions @@ -237,8 +251,10 @@ Allow the user to derive and access all model-relevant parameters (e.g., EAC, sp 1. User ensures all required base parameters (e.g., WACC, lifetime, investment) are present and harmonized. 2. User invokes calculation methods to derive model-ready parameters: - - `.calculate_parameters(parameters="EAC")` - - `.calculate_parameters(parameters="specific-investment")` + +- `.calculate_parameters(parameters="EAC")` +- `.calculate_parameters(parameters="specific-investment")` + 3. System computes and adds the derived parameters to the relevant `Technology` objects. 4. User accesses the parameters directly from the `Technology` objects for export or further use. @@ -263,8 +279,8 @@ tech["EAC"].value # Access the calculated EAC parameter value #### πŸ“Š Importance & Frequency -* Importance: High -* Usage Frequency: Frequent, especially before running model scenarios +- Importance: High +- Usage Frequency: Frequent, especially before running model scenarios #### πŸ“Œ Notes @@ -276,6 +292,7 @@ tech["EAC"].value # Access the calculated EAC parameter value - **Primary**: Energy Analyst, Energy System Modeller #### 🎯 Goal + Enable the user to systematically compare key techno-economic parameters (e.g., CAPEX, OPEX, efficiency) across multiple harmonized datasets in a tabular format. #### πŸ“š Pre-conditions @@ -316,13 +333,13 @@ techs["lifetime"].values # Access lifetime values across technologies #### πŸ“Š Importance & Frequency -* Importance: Medium -* Usage Frequency: Regular, especially for data quality checks and exploring values to be included into a model +- Importance: Medium +- Usage Frequency: Regular, especially for data quality checks and exploring values to be included into a model #### πŸ“Œ Notes -* Tabular comparison is the core feature; visualizations can be build on top of the DataFrame by the user themselves. -* Optional: Outlier detection and summary statistics could be a nice feature, but are also part of `pandas` already, so we can put this into the documentation as a suggestion for the user to explore themselves. +- Tabular comparison is the core feature; visualizations can be build on top of the DataFrame by the user themselves. +- Optional: Outlier detection and summary statistics could be a nice feature, but are also part of `pandas` already, so we can put this into the documentation as a suggestion for the user to explore themselves. ### 🧾 UC-005: Audit data provenance and transformation trace @@ -331,6 +348,7 @@ techs["lifetime"].values # Access lifetime values across technologies - **Secondary**: Energy Analyst #### 🎯 Goal + Allow the user to trace the origin and transformation history of each data point, enabling transparency and reproducibility. #### πŸ“š Pre-conditions @@ -344,8 +362,10 @@ Allow the user to trace the origin and transformation history of each data point 1. User selects a `parameter` of a `Technology` object. 2. The user requests the provenance information for that parameter. 3. System provides the information about: - - Original source(s) of the data (from `Source` and `SourceCollection`) of the parameter - - All transformations applied by our package (e.g., currency adjustment, scaling, calculations, including the values that were used for these transformations) + +- Original source(s) of the data (from `Source` and `SourceCollection`) of the parameter +- All transformations applied by our package (e.g., currency adjustment, scaling, calculations, including the values that were used for these transformations) + 4. User can export or document the provenance trace for reporting or documentation. #### πŸ” Alternate Flows @@ -370,10 +390,10 @@ dp.to_json("") # Includes provenance information in the JSON #### πŸ“Š Importance & Frequency -* Importance: Medium (for transparency and reproducibility) -* Usage Frequency: Occasional, but critical for future-us, report writing and rapport +- Importance: Medium (for transparency and reproducibility) +- Usage Frequency: Occasional, but critical for future-us, report writing and rapport #### πŸ“Œ Notes -* Only transformations performed by the package are tracked; user-made changes must be recorded manually. -* Provenance tracking should be automatic and cover all package-driven transformations. +- Only transformations performed by the package are tracked; user-made changes must be recorded manually. +- Provenance tracking should be automatic and cover all package-driven transformations. diff --git a/docs/parameter.md b/docs/user_guide/parameter.md similarity index 100% rename from docs/parameter.md rename to docs/user_guide/parameter.md index 38ae2a9e..0b1576f7 100644 --- a/docs/parameter.md +++ b/docs/user_guide/parameter.md @@ -1,10 +1,11 @@ +# `Parameter` Class Documentation + -# `Parameter` Class Documentation +--> ## Overview @@ -127,7 +128,6 @@ param_mixed_hhv = param_mixed.change_heating_value("HHV") 0.13 kWh/kg higher_heating_value ``` - ## Limitations & Missing Features - **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, the handling and merging of `provenance`, `note`, and `sources` is not yet implemented (see `TODO` comments in the code). diff --git a/mkdocs.yaml b/mkdocs.yaml new file mode 100644 index 00000000..c20fb6bc --- /dev/null +++ b/mkdocs.yaml @@ -0,0 +1,175 @@ +site_name: Documentation +site_url: !ENV READTHEDOCS_CANONICAL_URL +repo_url: https://github.com/PyPSA/technology-data +repo_name: PyPSA/technology-data +edit_uri: edit/master/docs/ + +# Navigation +nav: +- Home: + - Home: index.md + - Overview: + - Release Notes: home/release-notes.md + - Getting Started: + - Installation: home/installation.md + - Reference: + - Users: home/users.md + - Citing: home/citing.md + - License: home/license.md + - Support: + - FAQ: home/faq.md + - Contacts: home/contacts.md + +- User Guide: + - Use Cases: user_guide/design.md + - Parameter: user_guide/parameter.md + +- Contributing: + - Instructions: contributing/instructions.md + - Code of Conduct: contributing/CODE_OF_CONDUCT.md + - Contributors: contributing/contributors.md + +# Theme settings +theme: + name: material + logo: assets/logo/technology_data_logo.png + favicon: assets/logo/technology_data_logo.png + custom_dir: docs/assets/overrides + font: + text: Overpass + features: + - navigation.tabs + - navigation.tabs.sticky + - navigation.sections + - navigation.tracking # Anchor tracking + - navigation.indexes # Section indexes + - navigation.path + - navigation.top # Back to top button + # - navigation.foot + - header.autohide + - content.action.edit + - content.action.view + - toc.follow + - search + - search.suggest + - search.highlight + - search.share + - announce.dismiss + + palette: + - media: "(prefers-color-scheme: light)" + primary: custom + scheme: default + toggle: + icon: material/weather-sunny + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + primary: custom + scheme: slate + toggle: + icon: material/weather-night + name: Switch to light mode + +extra_css: +- assets/stylesheets/extra.css + +extra_javascript: +- assets/javascripts/readthedocs.js +- assets/javascripts/mathjax.js +- https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + +markdown_extensions: +# Callouts/ Admonitions +- admonition +- pymdownx.details +- pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format +- pymdownx.arithmatex: + generic: true +# Footnotes +- footnotes +# Tabbed content +- pymdownx.tabbed: + alternate_style: true # Abbreviations +- pymdownx.snippets: + auto_append: + - includes/abbreviations.md +- abbr +- attr_list +- md_in_html + # Emojis +- pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + # Toctree with permalinks +- toc: + title: On this page + permalink: true + toc_depth: 3 + # Grids +- md_in_html +- pymdownx.caret +- pymdownx.tilde + + +plugins: +- search +- tags +- autolinks +- table-reader +- mkdocs-video +- git-revision-date-localized: + type: timeago + timezone: Europe/Berlin + enable_creation_date: true +- git-committers: + repository: PyPSA/PyPSA + branch: v1-docs # TODO: Change to master before merging + token: !!python/object/apply:os.getenv ["MKDOCS_GIT_COMMITTERS_APIKEY"] +- argref: + autolinks: + - reference_prefix: ":octicons-git-pull-request-16:" + target_url: https://github.com/PyPSA/technology-data/pull/ +- social: + cards_layout_options: + font_family: Overpass + background_color: "#292F36" + +# Docstring generation +- mkdocstrings: + enabled: true + default_handler: python + handlers: + python: + options: + docstring_style: numpy + docstring_options: + ignore_init_summary: true + docstring_section_style: list + filters: + - "!^_[^_]" + - "!logger" + heading_level: 1 + merge_init_into_class: true + parameter_headings: false + separate_signature: true + show_root_heading: true + show_root_full_path: false + show_signature_annotations: true + show_source: false + show_symbol_type_heading: true + show_symbol_type_toc: true + signature_crossrefs: true + summary: true + show_if_no_docstring: true + show_inheritance_diagram: true + + +hooks: +- docs/assets/overrides/hooks/shortcodes.py + +copyright: >- + © The technology-data authors diff --git a/pyproject.toml b/pyproject.toml index 70a7b3a2..299f7a5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ BugTracker = "https://github.com/PyPSA/technology-data/issues" Changelog = "https://github.com/PyPSA/technology-data/releases" # https://docs.astral.sh/uv/concepts/projects/dependencies/#dependency-groups -# editable install of package and non-packaged dependencies +# editable installation of package and non-packaged dependencies [dependency-groups] dev = [ "ipykernel>=6.29.5", @@ -58,13 +58,26 @@ dev = [ ] docs = [ + "cairosvg>=2.8.2", + "gurobipy>=12.0.3", + "mkdocs-argref-plugin>=0.5.0", "mkdocs-autolinks-plugin>=0.7.1", + "mkdocs-ezlinks-plugin>=0.1.14", + "mkdocs-git-committers-plugin>=0.2.3", "mkdocs-git-revision-date-localized-plugin>=1.4.7", + "mkdocs-jupyter>=0.25.1", "mkdocs-material>=9.6.14", "mkdocs-minify-plugin>=0.8.0", "mkdocs-open-in-new-tab>=1.0.8", + "mkdocs-redirects>=1.2.2", + "mkdocs-table-reader-plugin>=3.1.0", + "mkdocs-video>=1.5.0", "mkdocstrings>=0.29.1", "mkdocstrings-python>=1.16.11", + "openpyxl>=3.1.5", + "pillow>=11.3.0", + "python-calamine>=0.4.0", + "tsam>=2.3.9", ] [tool.pytest.ini_options] @@ -100,9 +113,7 @@ source = [ ] # Static type checker settings - [tool.mypy] -exclude = ['dev/*', 'examples/*', 'doc/*', 'test/*'] ignore_missing_imports = true no_implicit_optional = true warn_unused_ignores = true @@ -127,6 +138,7 @@ ignore_missing_imports = true [tool.ruff] extend-include = ['*.ipynb'] +exclude = ["docs/"] [tool.ruff.lint] select = [ diff --git a/uv.lock b/uv.lock index 223004a8..d1d98700 100644 --- a/uv.lock +++ b/uv.lock @@ -1,64 +1,64 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.12" [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload_time = "2024-02-06T09:43:09.663Z" }, ] [[package]] name = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload_time = "2024-11-30T04:30:10.946Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, ] [[package]] name = "backrefs" version = "5.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload_time = "2025-06-22T19:34:13.97Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267 }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072 }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947 }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843 }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762 }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265 }, + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload_time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload_time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload_time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload_time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload_time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, ] [[package]] @@ -69,9 +69,9 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, ] [[package]] @@ -81,27 +81,72 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload_time = "2017-08-03T15:55:25.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006 }, + { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload_time = "2017-08-03T15:55:31.23Z" }, +] + +[[package]] +name = "bleach" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload_time = "2024-10-29T18:30:40.477Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload_time = "2024-10-29T18:30:38.186Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, ] [[package]] name = "boolean-py" version = "5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047 } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, +] + +[[package]] +name = "cairocffi" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload_time = "2024-06-18T10:56:06.741Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload_time = "2024-06-18T10:55:59.489Z" }, +] + +[[package]] +name = "cairosvg" +version = "2.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cairocffi" }, + { name = "cssselect2" }, + { name = "defusedxml" }, + { name = "pillow" }, + { name = "tinycss2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload_time = "2025-05-15T06:56:32.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577 }, + { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload_time = "2025-05-15T06:56:28.552Z" }, ] [[package]] name = "certifi" version = "2025.7.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386 } +sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386, upload_time = "2025-07-09T02:13:58.874Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230 }, + { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230, upload_time = "2025-07-09T02:13:57.007Z" }, ] [[package]] @@ -111,83 +156,83 @@ 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/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 }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, ] [[package]] name = "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 } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload_time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936 }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790 }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924 }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626 }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567 }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957 }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408 }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399 }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815 }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537 }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565 }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357 }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776 }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, ] [[package]] @@ -197,18 +242,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload_time = "2025-05-20T23:19:49.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload_time = "2025-05-20T23:19:47.796Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, ] [[package]] @@ -218,150 +263,216 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210, upload_time = "2024-03-12T16:53:41.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload_time = "2024-03-12T16:53:39.226Z" }, ] [[package]] name = "coverage" version = "7.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934 }, - { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173 }, - { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190 }, - { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618 }, - { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081 }, - { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990 }, - { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191 }, - { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400 }, - { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338 }, - { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125 }, - { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523 }, - { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960 }, - { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220 }, - { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772 }, - { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116 }, - { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554 }, - { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766 }, - { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735 }, - { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118 }, - { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381 }, - { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152 }, - { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559 }, - { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677 }, - { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899 }, - { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140 }, - { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005 }, - { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143 }, - { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735 }, - { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871 }, - { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692 }, - { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059 }, - { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150 }, - { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014 }, - { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951 }, - { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229 }, - { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738 }, - { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045 }, - { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666 }, - { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692 }, - { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536 }, - { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954 }, - { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616 }, - { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412 }, - { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776 }, - { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698 }, - { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902 }, - { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230 }, - { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194 }, - { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316 }, - { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794 }, - { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869 }, - { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765 }, - { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420 }, - { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536 }, - { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190 }, - { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597 }, +sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938, upload_time = "2025-07-27T14:13:39.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934, upload_time = "2025-07-27T14:11:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173, upload_time = "2025-07-27T14:11:38.005Z" }, + { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190, upload_time = "2025-07-27T14:11:39.887Z" }, + { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618, upload_time = "2025-07-27T14:11:41.841Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081, upload_time = "2025-07-27T14:11:43.705Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990, upload_time = "2025-07-27T14:11:45.244Z" }, + { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191, upload_time = "2025-07-27T14:11:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400, upload_time = "2025-07-27T14:11:48.643Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338, upload_time = "2025-07-27T14:11:50.258Z" }, + { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125, upload_time = "2025-07-27T14:11:52.034Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523, upload_time = "2025-07-27T14:11:53.965Z" }, + { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960, upload_time = "2025-07-27T14:11:55.959Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220, upload_time = "2025-07-27T14:11:57.899Z" }, + { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772, upload_time = "2025-07-27T14:12:00.422Z" }, + { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116, upload_time = "2025-07-27T14:12:03.099Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554, upload_time = "2025-07-27T14:12:04.668Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766, upload_time = "2025-07-27T14:12:06.234Z" }, + { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735, upload_time = "2025-07-27T14:12:08.305Z" }, + { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118, upload_time = "2025-07-27T14:12:09.903Z" }, + { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381, upload_time = "2025-07-27T14:12:11.535Z" }, + { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152, upload_time = "2025-07-27T14:12:13.182Z" }, + { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559, upload_time = "2025-07-27T14:12:14.807Z" }, + { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677, upload_time = "2025-07-27T14:12:16.68Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899, upload_time = "2025-07-27T14:12:18.758Z" }, + { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140, upload_time = "2025-07-27T14:12:20.357Z" }, + { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005, upload_time = "2025-07-27T14:12:22.007Z" }, + { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143, upload_time = "2025-07-27T14:12:23.746Z" }, + { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735, upload_time = "2025-07-27T14:12:25.73Z" }, + { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871, upload_time = "2025-07-27T14:12:27.767Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692, upload_time = "2025-07-27T14:12:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059, upload_time = "2025-07-27T14:12:31.076Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150, upload_time = "2025-07-27T14:12:32.746Z" }, + { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014, upload_time = "2025-07-27T14:12:34.406Z" }, + { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951, upload_time = "2025-07-27T14:12:36.069Z" }, + { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229, upload_time = "2025-07-27T14:12:37.759Z" }, + { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738, upload_time = "2025-07-27T14:12:39.453Z" }, + { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045, upload_time = "2025-07-27T14:12:41.387Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666, upload_time = "2025-07-27T14:12:43.056Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692, upload_time = "2025-07-27T14:12:44.83Z" }, + { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536, upload_time = "2025-07-27T14:12:46.527Z" }, + { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954, upload_time = "2025-07-27T14:12:49.279Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616, upload_time = "2025-07-27T14:12:51.214Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412, upload_time = "2025-07-27T14:12:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776, upload_time = "2025-07-27T14:12:55.482Z" }, + { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698, upload_time = "2025-07-27T14:12:57.225Z" }, + { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902, upload_time = "2025-07-27T14:12:59.071Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230, upload_time = "2025-07-27T14:13:01.248Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194, upload_time = "2025-07-27T14:13:03.247Z" }, + { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316, upload_time = "2025-07-27T14:13:04.957Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794, upload_time = "2025-07-27T14:13:06.715Z" }, + { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869, upload_time = "2025-07-27T14:13:08.933Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765, upload_time = "2025-07-27T14:13:10.778Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420, upload_time = "2025-07-27T14:13:12.882Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536, upload_time = "2025-07-27T14:13:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190, upload_time = "2025-07-27T14:13:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597, upload_time = "2025-07-27T14:13:37.221Z" }, +] + +[[package]] +name = "cryptography" +version = "45.0.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/0d/d13399c94234ee8f3df384819dc67e0c5ce215fb751d567a55a1f4b028c7/cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", size = 744949, upload_time = "2025-08-05T23:59:27.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/29/2793d178d0eda1ca4a09a7c4e09a5185e75738cc6d526433e8663b460ea6/cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", size = 7042702, upload_time = "2025-08-05T23:58:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b6/cabd07410f222f32c8d55486c464f432808abaa1f12af9afcbe8f2f19030/cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", size = 4206483, upload_time = "2025-08-05T23:58:27.132Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9e/f9c7d36a38b1cfeb1cc74849aabe9bf817990f7603ff6eb485e0d70e0b27/cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", size = 4429679, upload_time = "2025-08-05T23:58:29.152Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2a/4434c17eb32ef30b254b9e8b9830cee4e516f08b47fdd291c5b1255b8101/cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", size = 4210553, upload_time = "2025-08-05T23:58:30.596Z" }, + { url = "https://files.pythonhosted.org/packages/ef/1d/09a5df8e0c4b7970f5d1f3aff1b640df6d4be28a64cae970d56c6cf1c772/cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", size = 3894499, upload_time = "2025-08-05T23:58:32.03Z" }, + { url = "https://files.pythonhosted.org/packages/79/62/120842ab20d9150a9d3a6bdc07fe2870384e82f5266d41c53b08a3a96b34/cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", size = 4458484, upload_time = "2025-08-05T23:58:33.526Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/1bc3634d45ddfed0871bfba52cf8f1ad724761662a0c792b97a951fb1b30/cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", size = 4210281, upload_time = "2025-08-05T23:58:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/7d/fe/ffb12c2d83d0ee625f124880a1f023b5878f79da92e64c37962bbbe35f3f/cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", size = 4456890, upload_time = "2025-08-05T23:58:36.923Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8e/b3f3fe0dc82c77a0deb5f493b23311e09193f2268b77196ec0f7a36e3f3e/cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", size = 4333247, upload_time = "2025-08-05T23:58:38.781Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/c3ef2ab9e334da27a1d7b56af4a2417d77e7806b2e0f90d6267ce120d2e4/cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", size = 4565045, upload_time = "2025-08-05T23:58:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/31/c3/77722446b13fa71dddd820a5faab4ce6db49e7e0bf8312ef4192a3f78e2f/cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159", size = 2928923, upload_time = "2025-08-05T23:58:41.919Z" }, + { url = "https://files.pythonhosted.org/packages/38/63/a025c3225188a811b82932a4dcc8457a26c3729d81578ccecbcce2cb784e/cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec", size = 3403805, upload_time = "2025-08-05T23:58:43.792Z" }, + { url = "https://files.pythonhosted.org/packages/5b/af/bcfbea93a30809f126d51c074ee0fac5bd9d57d068edf56c2a73abedbea4/cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", size = 7020111, upload_time = "2025-08-05T23:58:45.316Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/ea5173689e014f1a8470899cd5beeb358e22bb3cf5a876060f9d1ca78af4/cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", size = 4198169, upload_time = "2025-08-05T23:58:47.121Z" }, + { url = "https://files.pythonhosted.org/packages/ba/73/b12995edc0c7e2311ffb57ebd3b351f6b268fed37d93bfc6f9856e01c473/cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", size = 4421273, upload_time = "2025-08-05T23:58:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/286894f6f71926bc0da67408c853dd9ba953f662dcb70993a59fd499f111/cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", size = 4199211, upload_time = "2025-08-05T23:58:50.139Z" }, + { url = "https://files.pythonhosted.org/packages/de/34/a7f55e39b9623c5cb571d77a6a90387fe557908ffc44f6872f26ca8ae270/cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", size = 3883732, upload_time = "2025-08-05T23:58:52.253Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b9/c6d32edbcba0cd9f5df90f29ed46a65c4631c4fbe11187feb9169c6ff506/cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", size = 4450655, upload_time = "2025-08-05T23:58:53.848Z" }, + { url = "https://files.pythonhosted.org/packages/77/2d/09b097adfdee0227cfd4c699b3375a842080f065bab9014248933497c3f9/cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", size = 4198956, upload_time = "2025-08-05T23:58:55.209Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/061ec6689207d54effdff535bbdf85cc380d32dd5377173085812565cf38/cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", size = 4449859, upload_time = "2025-08-05T23:58:56.639Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/e7d5a2ad2d035e5a2af116e1a3adb4d8fcd0be92a18032917a089c6e5028/cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", size = 4320254, upload_time = "2025-08-05T23:58:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/82/27/092d311af22095d288f4db89fcaebadfb2f28944f3d790a4cf51fe5ddaeb/cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", size = 4554815, upload_time = "2025-08-05T23:59:00.283Z" }, + { url = "https://files.pythonhosted.org/packages/7e/01/aa2f4940262d588a8fdf4edabe4cda45854d00ebc6eaac12568b3a491a16/cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02", size = 2912147, upload_time = "2025-08-05T23:59:01.716Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bc/16e0276078c2de3ceef6b5a34b965f4436215efac45313df90d55f0ba2d2/cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b", size = 3390459, upload_time = "2025-08-05T23:59:03.358Z" }, ] [[package]] name = "csscompressor" version = "0.9.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } + +[[package]] +name = "cssselect2" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tinycss2" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload_time = "2025-03-05T14:46:07.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload_time = "2025-03-05T14:46:06.463Z" }, +] [[package]] name = "debugpy" version = "1.8.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444 } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload_time = "2025-04-10T19:46:10.981Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268 }, - { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077 }, - { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127 }, - { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249 }, - { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676 }, - { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514 }, - { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756 }, - { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119 }, - { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230 }, + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload_time = "2025-04-10T19:46:26.044Z" }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload_time = "2025-04-10T19:46:27.464Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload_time = "2025-04-10T19:46:29.467Z" }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload_time = "2025-04-10T19:46:31.538Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload_time = "2025-04-10T19:46:32.96Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload_time = "2025-04-10T19:46:34.336Z" }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload_time = "2025-04-10T19:46:36.199Z" }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload_time = "2025-04-10T19:46:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload_time = "2025-04-10T19:46:54.077Z" }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload_time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload_time = "2021-03-08T10:59:24.45Z" }, ] [[package]] name = "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 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload_time = "2024-10-09T18:35:47.551Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload_time = "2024-10-09T18:35:44.272Z" }, ] [[package]] name = "et-xmlfile" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 }, + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, ] [[package]] name = "executing" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload_time = "2025-01-22T15:41:29.403Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload_time = "2025-01-22T15:41:25.929Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload_time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload_time = "2025-08-14T18:49:34.776Z" }, ] [[package]] name = "filelock" version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, ] [[package]] @@ -371,9 +482,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816 } +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263 }, + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, ] [[package]] @@ -383,9 +494,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799 } +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625 }, + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, ] [[package]] @@ -413,20 +524,20 @@ dependencies = [ { name = "typing-extensions" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478 } +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615 }, + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, ] [[package]] name = "frozendict" version = "2.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload_time = "2024-10-13T12:15:32.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148 }, - { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146 }, - { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146 }, + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload_time = "2024-10-13T12:15:26.839Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload_time = "2024-10-13T12:15:28.16Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload_time = "2024-10-13T12:15:29.495Z" }, ] [[package]] @@ -436,9 +547,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload_time = "2022-05-02T15:47:16.11Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload_time = "2022-05-02T15:47:14.552Z" }, ] [[package]] @@ -448,9 +559,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, ] [[package]] @@ -460,9 +571,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload_time = "2025-01-02T07:32:43.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload_time = "2025-01-02T07:32:40.731Z" }, ] [[package]] @@ -472,9 +583,24 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137 } +sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137, upload_time = "2025-04-23T11:29:09.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload_time = "2025-04-23T11:29:07.145Z" }, +] + +[[package]] +name = "gurobipy" +version = "12.0.3" +source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303 }, + { url = "https://files.pythonhosted.org/packages/6f/bb/b3784497115c64c2bd122cc9d411f167026d4ec42a26b1ff3c43a779275d/gurobipy-12.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:020f23277f630e079eac114385eabd1bd9fb4ac22f8796ed5ba6d915ce4f141b", size = 12222234, upload_time = "2025-07-15T07:19:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/18/ea/c065984de5287c99fd30ee8d700fd78f83692e992471f9667ab5d36612b9/gurobipy-12.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:72bbf544bc05060bb93909b79715ace4c0f416198f7622a985cabb9e8e99aa1c", size = 62583866, upload_time = "2025-07-15T07:20:17.576Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8b/2b9f26e4e19a258229b8a8ffc377ca372cc2059a22a0a7c67572efe308d8/gurobipy-12.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3f971caf270f671b6ffcf5b937b3c0430a5264b0f01529dc8681d61c221f215", size = 14268480, upload_time = "2025-07-15T07:20:26.898Z" }, + { url = "https://files.pythonhosted.org/packages/26/0f/3544a323635f37cdfe1e011d2903b7ef94ba18e10224fa1419f64d0c1968/gurobipy-12.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:af18fd03d5dc3f6e5f590c372ad288b8430a6d88a5b5e66cfcd8432f86ee8650", size = 11121565, upload_time = "2025-07-15T07:20:34.576Z" }, + { url = "https://files.pythonhosted.org/packages/5e/95/f0e5b5cf85298f42482cf4e53d8114c45bb962f55195d531fe4e62b5afa1/gurobipy-12.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a8552e47673cb6f1fd351edf8fcad86b02f832cbfb57d90ef21e0397e96d138e", size = 12183439, upload_time = "2025-07-15T07:20:44.224Z" }, + { url = "https://files.pythonhosted.org/packages/61/6e/aea725b4143faa4eb6878414a91fa74e7871aba0ab9453803a9eeef781c2/gurobipy-12.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:be05c074141c8a126c8aaeccc41795ab091a666eabb39ca1ff98a74bde81e663", size = 62583451, upload_time = "2025-07-15T07:21:38.825Z" }, + { url = "https://files.pythonhosted.org/packages/75/47/7b9c63ce2cd85d796403b91a6d211d5c8baac7b694edd94e2151f365d6a9/gurobipy-12.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:79a333766e27fef7902ceeefbcf0279a1ca393a27a72ea62f8e301b21aa17d59", size = 14271076, upload_time = "2025-07-15T07:21:55.102Z" }, + { url = "https://files.pythonhosted.org/packages/2a/93/b10cd6112c05675fed5c817fd7933c9d4ba3a7039e42cba844a9ac09242a/gurobipy-12.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:e0f9ed55077e622021369bb9df2ca3b00c86b678792a3b1556cc59f67348fab0", size = 11111414, upload_time = "2025-07-15T07:22:05.079Z" }, ] [[package]] @@ -486,9 +612,9 @@ dependencies = [ { name = "libhxl" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/96/ac55b204699cd216a22a943f64aafac32bba818f624a5d44879d60368fad/hdx_python_country-3.9.6.tar.gz", hash = "sha256:7791f4b9c5ae3e62e82795c266a3ca6ee23c7bab706c91533844edf2ebd9bb18", size = 529232 } +sdist = { url = "https://files.pythonhosted.org/packages/88/96/ac55b204699cd216a22a943f64aafac32bba818f624a5d44879d60368fad/hdx_python_country-3.9.6.tar.gz", hash = "sha256:7791f4b9c5ae3e62e82795c266a3ca6ee23c7bab706c91533844edf2ebd9bb18", size = 529232, upload_time = "2025-07-09T22:56:32.162Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/90/646b56ec12df459799510d6d0869ada210ad9f765ad104e50dae4867eb50/hdx_python_country-3.9.6-py3-none-any.whl", hash = "sha256:4c1833bdf3cbd14dfff0146e0bdcae5763931d344fce5f1b42493dc8751e3d4a", size = 55554 }, + { url = "https://files.pythonhosted.org/packages/45/90/646b56ec12df459799510d6d0869ada210ad9f765ad104e50dae4867eb50/hdx_python_country-3.9.6-py3-none-any.whl", hash = "sha256:4c1833bdf3cbd14dfff0146e0bdcae5763931d344fce5f1b42493dc8751e3d4a", size = 55554, upload_time = "2025-07-09T22:56:30.128Z" }, ] [[package]] @@ -511,9 +637,40 @@ dependencies = [ { name = "xlsx2csv" }, { name = "xlwt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009 } +sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009, upload_time = "2025-05-14T02:31:28.578Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787 }, + { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787, upload_time = "2025-05-14T02:31:26.794Z" }, +] + +[[package]] +name = "highspy" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/aa1325331c320598ce60cc31060087681cd05123b6fb2a8a571e882b7f05/highspy-1.11.0.tar.gz", hash = "sha256:771e58c076122d207ff1b19759c21d3227f0da5b80dfd89a4145681524969cef", size = 1285415, upload_time = "2025-06-06T00:47:22.562Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/ad/b54ad6740b950faab3b7f1465fbb5c740fc522928a8d9f01cac181f8f9a6/highspy-1.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28fffd3e733833a7b2569df6761088046e8aca868ab328828711dbe15b102ad4", size = 2232856, upload_time = "2025-06-06T00:46:11.161Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0c/3921a207f47d52abc81a9d00d8f4d579b05b85670e23bc7140e39268490d/highspy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20a3adf8820a5f7a9cee6fc76df625e651ecfd8b5898af2a77042e79269ce0bc", size = 1908641, upload_time = "2025-06-06T00:46:12.706Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/ea7ea6c4c3f781b007fe928b2aefa40c49287b4689985d04c3b20d383475/highspy-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d4bc0a84cf613bb8565f9b5f610eb0655384162f509b5d86f9c888570275fdc", size = 2119574, upload_time = "2025-06-06T00:46:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0c/94f1ccb6606e8445a7a0c68d983e47f64899582c64fcea651f488eaaaea0/highspy-1.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:543789b75c396a904cb550de34eb333f1a184e123dadc9903b5e6dbca18a007b", size = 2441487, upload_time = "2025-06-06T00:46:16.286Z" }, + { url = "https://files.pythonhosted.org/packages/ad/aa/e7c4ac05162187c484bb121f50d8e037c13bf894ed5cf4e781e1cff68762/highspy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23949e4f44b6df0ed8c387a7c733d683a0fa66e3ff15d65719979ce2099ee99", size = 2302302, upload_time = "2025-06-06T00:46:18.819Z" }, + { url = "https://files.pythonhosted.org/packages/04/ce/fd2473bed635eb06d116f987767d5c5fe3c62b317fb1a788c31966d7fa0a/highspy-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50dacf300ebe7c4dca92891c0bf61b694f2ca744207cf7d0d24f2a30ffb5608c", size = 3101885, upload_time = "2025-06-06T00:46:20.774Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e1/bf174389656de5d302ed53dd5cdeb5f7e9ad84156ad2fc95d5a63ba023f2/highspy-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a782c242b4b047f86110787b0dafce9d77cc10f079adab1fd51c5331e5760127", size = 3647952, upload_time = "2025-06-06T00:46:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f5/42f6f2ce99c5b9d7aa864ac3abeaf8a2b66da707821ab42b0a31ec2a0dc1/highspy-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15b804387089a389e5f01b056a4b3ad74c7d1cf00ab00a0faaf3b4a582bb664c", size = 3309616, upload_time = "2025-06-06T00:46:24.888Z" }, + { url = "https://files.pythonhosted.org/packages/47/f5/cf13640ed65ea934b45e0c3e786497f4696f286faf45e8e62579a0f15462/highspy-1.11.0-cp312-cp312-win32.whl", hash = "sha256:8c33f68df8ab9666d379b0d64d04775c0a9db31882d4f87b3ec8cece0003b47d", size = 1710641, upload_time = "2025-06-06T00:46:26.462Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2f/7acfea5b8d32b86bdec018f858bc195236b804a22a7cd3349da711498692/highspy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0aed8c80d33e2fc2eb1def75dbd34c9fa463acb589d19a5ed5dcc0178ae7062", size = 1985767, upload_time = "2025-06-06T00:46:28.144Z" }, + { url = "https://files.pythonhosted.org/packages/96/84/3e899c5d95dc9d5400a308e0aaf4a5143f69016a4f46dd528ff7cd65d341/highspy-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f675cda73860c7c8a22546db3c80db985720baea84866b08a971cfa03cc7a156", size = 2232867, upload_time = "2025-06-06T00:46:29.651Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/2853095a74e9fc2c2081340647be8edba7122696534ebbaf159ceb53f9b4/highspy-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7babebfc01b7682c69c95e0520614ec9400e10cec1b84d3fb7cd48535c606244", size = 1908601, upload_time = "2025-06-06T00:46:31.232Z" }, + { url = "https://files.pythonhosted.org/packages/e6/36/3cabdd3ae8610912962bad96f4d4d6702255d6c01d050754e4050a9eaa4a/highspy-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39fb60d84d7a58e58f923ea6f0641e6978eb9049033b84de1a2add723e01cd3f", size = 2119726, upload_time = "2025-06-06T00:46:32.796Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/200d3f13ca9ad3f9fc11a1f3f76cc2734de42dae064510365d42caeb5ed4/highspy-1.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c2e7cf4d504287cd8910de322a726d58428af43bb985d6bae602bf84a7454b9", size = 2441449, upload_time = "2025-06-06T00:46:35.147Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/fc3775850dc668006039637a4f23f03a9c0eb533643c9d3a7370f9d63de2/highspy-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79682aa7855d94106ccbbb750082d156dcbb57dff9d489f167320ae0ce768867", size = 2302685, upload_time = "2025-06-06T00:46:36.791Z" }, + { url = "https://files.pythonhosted.org/packages/b5/16/e13326a9706c407d32e39ad14aa79a696c1eb49bb13d50fde5d96afb02b5/highspy-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:65232aa496fb27be56cc85b2c7c785fac866107c32ea00cc38ec474d6a9f6494", size = 3102306, upload_time = "2025-06-06T00:46:38.341Z" }, + { url = "https://files.pythonhosted.org/packages/0e/93/468e63b16d9bf123174e7f8f7b8bd5a2f96b18d7370a2cc35e6485871749/highspy-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f78f27e18275d3c7868dcd0314ea535ed361322e7f0817363872d75a4cc15abc", size = 3648234, upload_time = "2025-06-06T00:46:40.895Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c5/37b849a69c9cbccf533a9a51e309a49e83d704f06bf45370c2e78ceb15d4/highspy-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6156a7d643268456427b6fe310626ad9ee9d908ff812cc64ee8bad7b9872ea98", size = 3309724, upload_time = "2025-06-06T00:46:43.083Z" }, + { url = "https://files.pythonhosted.org/packages/90/0f/89c579b2f718dc419fd76067a03ecb3c96e6919b7cffee1b9f5a2dfe4f56/highspy-1.11.0-cp313-cp313-win32.whl", hash = "sha256:e61facebb0127eb3661db79a11c7665e47229ec63d2b425996d04aeede26d46b", size = 1710676, upload_time = "2025-06-06T00:46:45.132Z" }, + { url = "https://files.pythonhosted.org/packages/20/ca/ba2af91f2418bee0d0e99df71dcd171ca863675de6a5260bbf06c120f084/highspy-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ceac08be37f75dc0af95669a0cfb073e5db5f07ead05cdcc81fd4b4394708d53", size = 1985967, upload_time = "2025-06-06T00:46:46.767Z" }, ] [[package]] @@ -521,75 +678,75 @@ name = "htmlmin2" version = "0.1.13" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486 }, + { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, ] [[package]] name = "humanize" version = "4.12.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514 } +sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514, upload_time = "2025-04-30T11:51:07.98Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487 }, + { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487, upload_time = "2025-04-30T11:51:06.468Z" }, ] [[package]] name = "identify" version = "2.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload_time = "2025-05-23T20:37:53.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145 }, + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload_time = "2025-05-23T20:37:51.495Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "ijson" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212 }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175 }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011 }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094 }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903 }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339 }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383 }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580 }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280 }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512 }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081 }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216 }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170 }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013 }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564 }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917 }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897 }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711 }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691 }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738 }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512 }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074 }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694 }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390 }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140 }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739 }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338 }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515 }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081 }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253 }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816 }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760 }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948 }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, ] [[package]] @@ -602,18 +759,18 @@ dependencies = [ { name = "pandas" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990 } +sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990, upload_time = "2025-02-06T09:16:10.723Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520 }, + { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520, upload_time = "2025-02-06T09:16:09.042Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, ] [[package]] @@ -635,9 +792,9 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367, upload_time = "2024-07-01T14:07:22.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload_time = "2024-07-01T14:07:19.603Z" }, ] [[package]] @@ -656,9 +813,9 @@ dependencies = [ { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338 } +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload_time = "2025-07-01T11:11:30.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021 }, + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload_time = "2025-07-01T11:11:27.85Z" }, ] [[package]] @@ -668,18 +825,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, ] [[package]] @@ -689,9 +846,9 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload_time = "2024-11-11T01:41:40.175Z" }, ] [[package]] @@ -701,25 +858,25 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "joblib" version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload_time = "2025-05-23T12:04:37.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746 }, + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload_time = "2025-05-23T12:04:35.124Z" }, ] [[package]] name = "jsmin" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } [[package]] name = "jsonlines" @@ -728,9 +885,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359 } +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701 }, + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, ] [[package]] @@ -740,9 +897,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105 }, + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, ] [[package]] @@ -755,9 +912,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480, upload_time = "2025-05-26T18:48:10.459Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709 }, + { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709, upload_time = "2025-05-26T18:48:08.417Z" }, ] [[package]] @@ -767,9 +924,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 }, + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, ] [[package]] @@ -783,9 +940,9 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload_time = "2024-09-17T10:44:15.218Z" }, ] [[package]] @@ -797,9 +954,34 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload_time = "2025-05-27T07:38:16.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload_time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload_time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupytext" +version = "1.17.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/ce/0bd5290ca4978777154e2683413dca761781aacf57f7dc0146f5210df8b1/jupytext-1.17.2.tar.gz", hash = "sha256:772d92898ac1f2ded69106f897b34af48ce4a85c985fa043a378ff5a65455f02", size = 3748577, upload_time = "2025-06-01T21:31:48.231Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/f1/82ea8e783433707cafd9790099a2d19f113c22f32a31c8bb5abdc7a61dbb/jupytext-1.17.2-py3-none-any.whl", hash = "sha256:4f85dc43bb6a24b75491c5c434001ad5ef563932f68f15dd3e1c8ce12a4a426b", size = 164401, upload_time = "2025-06-01T21:31:46.319Z" }, ] [[package]] @@ -818,7 +1000,7 @@ dependencies = [ { name = "wheel" }, { name = "xlrd3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736 } +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } [[package]] name = "license-expression" @@ -827,9 +1009,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402 } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload_time = "2025-07-22T11:13:32.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615 }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, ] [[package]] @@ -840,18 +1022,80 @@ dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, +] + +[[package]] +name = "lxml" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/bd/f9d01fd4132d81c6f43ab01983caea69ec9614b913c290a26738431a015d/lxml-6.0.1.tar.gz", hash = "sha256:2b3a882ebf27dd026df3801a87cf49ff791336e0f94b0fad195db77e01240690", size = 4070214, upload_time = "2025-08-22T10:37:53.525Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/a9/82b244c8198fcdf709532e39a1751943a36b3e800b420adc739d751e0299/lxml-6.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c03ac546adaabbe0b8e4a15d9ad815a281afc8d36249c246aecf1aaad7d6f200", size = 8422788, upload_time = "2025-08-22T10:32:56.612Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8d/1ed2bc20281b0e7ed3e6c12b0a16e64ae2065d99be075be119ba88486e6d/lxml-6.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33b862c7e3bbeb4ba2c96f3a039f925c640eeba9087a4dc7a572ec0f19d89392", size = 4593547, upload_time = "2025-08-22T10:32:59.016Z" }, + { url = "https://files.pythonhosted.org/packages/76/53/d7fd3af95b72a3493bf7fbe842a01e339d8f41567805cecfecd5c71aa5ee/lxml-6.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a3ec1373f7d3f519de595032d4dcafae396c29407cfd5073f42d267ba32440d", size = 4948101, upload_time = "2025-08-22T10:33:00.765Z" }, + { url = "https://files.pythonhosted.org/packages/9d/51/4e57cba4d55273c400fb63aefa2f0d08d15eac021432571a7eeefee67bed/lxml-6.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03b12214fb1608f4cffa181ec3d046c72f7e77c345d06222144744c122ded870", size = 5108090, upload_time = "2025-08-22T10:33:03.108Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6e/5f290bc26fcc642bc32942e903e833472271614e24d64ad28aaec09d5dae/lxml-6.0.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:207ae0d5f0f03b30f95e649a6fa22aa73f5825667fee9c7ec6854d30e19f2ed8", size = 5021791, upload_time = "2025-08-22T10:33:06.972Z" }, + { url = "https://files.pythonhosted.org/packages/13/d4/2e7551a86992ece4f9a0f6eebd4fb7e312d30f1e372760e2109e721d4ce6/lxml-6.0.1-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:32297b09ed4b17f7b3f448de87a92fb31bb8747496623483788e9f27c98c0f00", size = 5358861, upload_time = "2025-08-22T10:33:08.967Z" }, + { url = "https://files.pythonhosted.org/packages/8a/5f/cb49d727fc388bf5fd37247209bab0da11697ddc5e976ccac4826599939e/lxml-6.0.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e18224ea241b657a157c85e9cac82c2b113ec90876e01e1f127312006233756", size = 5652569, upload_time = "2025-08-22T10:33:10.815Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b8/66c1ef8c87ad0f958b0a23998851e610607c74849e75e83955d5641272e6/lxml-6.0.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a07a994d3c46cd4020c1ea566345cf6815af205b1e948213a4f0f1d392182072", size = 5252262, upload_time = "2025-08-22T10:33:12.673Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ef/131d3d6b9590e64fdbb932fbc576b81fcc686289da19c7cb796257310e82/lxml-6.0.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:2287fadaa12418a813b05095485c286c47ea58155930cfbd98c590d25770e225", size = 4710309, upload_time = "2025-08-22T10:33:14.952Z" }, + { url = "https://files.pythonhosted.org/packages/bc/3f/07f48ae422dce44902309aa7ed386c35310929dc592439c403ec16ef9137/lxml-6.0.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b4e597efca032ed99f418bd21314745522ab9fa95af33370dcee5533f7f70136", size = 5265786, upload_time = "2025-08-22T10:33:16.721Z" }, + { url = "https://files.pythonhosted.org/packages/11/c7/125315d7b14ab20d9155e8316f7d287a4956098f787c22d47560b74886c4/lxml-6.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9696d491f156226decdd95d9651c6786d43701e49f32bf23715c975539aa2b3b", size = 5062272, upload_time = "2025-08-22T10:33:18.478Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c3/51143c3a5fc5168a7c3ee626418468ff20d30f5a59597e7b156c1e61fba8/lxml-6.0.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e4e3cd3585f3c6f87cdea44cda68e692cc42a012f0131d25957ba4ce755241a7", size = 4786955, upload_time = "2025-08-22T10:33:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/11/86/73102370a420ec4529647b31c4a8ce8c740c77af3a5fae7a7643212d6f6e/lxml-6.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:45cbc92f9d22c28cd3b97f8d07fcefa42e569fbd587dfdac76852b16a4924277", size = 5673557, upload_time = "2025-08-22T10:33:22.282Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2d/aad90afaec51029aef26ef773b8fd74a9e8706e5e2f46a57acd11a421c02/lxml-6.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f8c9bcfd2e12299a442fba94459adf0b0d001dbc68f1594439bfa10ad1ecb74b", size = 5254211, upload_time = "2025-08-22T10:33:24.15Z" }, + { url = "https://files.pythonhosted.org/packages/63/01/c9e42c8c2d8b41f4bdefa42ab05448852e439045f112903dd901b8fbea4d/lxml-6.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e9dc2b9f1586e7cd77753eae81f8d76220eed9b768f337dc83a3f675f2f0cf9", size = 5275817, upload_time = "2025-08-22T10:33:26.007Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/962ea2696759abe331c3b0e838bb17e92224f39c638c2068bf0d8345e913/lxml-6.0.1-cp312-cp312-win32.whl", hash = "sha256:987ad5c3941c64031f59c226167f55a04d1272e76b241bfafc968bdb778e07fb", size = 3610889, upload_time = "2025-08-22T10:33:28.169Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/22c86a990b51b44442b75c43ecb2f77b8daba8c4ba63696921966eac7022/lxml-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:abb05a45394fd76bf4a60c1b7bec0e6d4e8dfc569fc0e0b1f634cd983a006ddc", size = 4010925, upload_time = "2025-08-22T10:33:29.874Z" }, + { url = "https://files.pythonhosted.org/packages/b2/21/dc0c73325e5eb94ef9c9d60dbb5dcdcb2e7114901ea9509735614a74e75a/lxml-6.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:c4be29bce35020d8579d60aa0a4e95effd66fcfce31c46ffddf7e5422f73a299", size = 3671922, upload_time = "2025-08-22T10:33:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/43/c4/cd757eeec4548e6652eff50b944079d18ce5f8182d2b2cf514e125e8fbcb/lxml-6.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:485eda5d81bb7358db96a83546949c5fe7474bec6c68ef3fa1fb61a584b00eea", size = 8405139, upload_time = "2025-08-22T10:33:34.09Z" }, + { url = "https://files.pythonhosted.org/packages/ff/99/0290bb86a7403893f5e9658490c705fcea103b9191f2039752b071b4ef07/lxml-6.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d12160adea318ce3d118f0b4fbdff7d1225c75fb7749429541b4d217b85c3f76", size = 4585954, upload_time = "2025-08-22T10:33:36.294Z" }, + { url = "https://files.pythonhosted.org/packages/88/a7/4bb54dd1e626342a0f7df6ec6ca44fdd5d0e100ace53acc00e9a689ead04/lxml-6.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48c8d335d8ab72f9265e7ba598ae5105a8272437403f4032107dbcb96d3f0b29", size = 4944052, upload_time = "2025-08-22T10:33:38.19Z" }, + { url = "https://files.pythonhosted.org/packages/71/8d/20f51cd07a7cbef6214675a8a5c62b2559a36d9303fe511645108887c458/lxml-6.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:405e7cf9dbdbb52722c231e0f1257214202dfa192327fab3de45fd62e0554082", size = 5098885, upload_time = "2025-08-22T10:33:40.035Z" }, + { url = "https://files.pythonhosted.org/packages/5a/63/efceeee7245d45f97d548e48132258a36244d3c13c6e3ddbd04db95ff496/lxml-6.0.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:299a790d403335a6a057ade46f92612ebab87b223e4e8c5308059f2dc36f45ed", size = 5017542, upload_time = "2025-08-22T10:33:41.896Z" }, + { url = "https://files.pythonhosted.org/packages/57/5d/92cb3d3499f5caba17f7933e6be3b6c7de767b715081863337ced42eb5f2/lxml-6.0.1-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:48da704672f6f9c461e9a73250440c647638cc6ff9567ead4c3b1f189a604ee8", size = 5347303, upload_time = "2025-08-22T10:33:43.868Z" }, + { url = "https://files.pythonhosted.org/packages/69/f8/606fa16a05d7ef5e916c6481c634f40870db605caffed9d08b1a4fb6b989/lxml-6.0.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:21e364e1bb731489e3f4d51db416f991a5d5da5d88184728d80ecfb0904b1d68", size = 5641055, upload_time = "2025-08-22T10:33:45.784Z" }, + { url = "https://files.pythonhosted.org/packages/b3/01/15d5fc74ebb49eac4e5df031fbc50713dcc081f4e0068ed963a510b7d457/lxml-6.0.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bce45a2c32032afddbd84ed8ab092130649acb935536ef7a9559636ce7ffd4a", size = 5242719, upload_time = "2025-08-22T10:33:48.089Z" }, + { url = "https://files.pythonhosted.org/packages/42/a5/1b85e2aaaf8deaa67e04c33bddb41f8e73d07a077bf9db677cec7128bfb4/lxml-6.0.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:fa164387ff20ab0e575fa909b11b92ff1481e6876835014e70280769920c4433", size = 4717310, upload_time = "2025-08-22T10:33:49.852Z" }, + { url = "https://files.pythonhosted.org/packages/42/23/f3bb1292f55a725814317172eeb296615db3becac8f1a059b53c51fc1da8/lxml-6.0.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7587ac5e000e1594e62278422c5783b34a82b22f27688b1074d71376424b73e8", size = 5254024, upload_time = "2025-08-22T10:33:52.22Z" }, + { url = "https://files.pythonhosted.org/packages/b4/be/4d768f581ccd0386d424bac615d9002d805df7cc8482ae07d529f60a3c1e/lxml-6.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:57478424ac4c9170eabf540237125e8d30fad1940648924c058e7bc9fb9cf6dd", size = 5055335, upload_time = "2025-08-22T10:33:54.041Z" }, + { url = "https://files.pythonhosted.org/packages/40/07/ed61d1a3e77d1a9f856c4fab15ee5c09a2853fb7af13b866bb469a3a6d42/lxml-6.0.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:09c74afc7786c10dd6afaa0be2e4805866beadc18f1d843cf517a7851151b499", size = 4784864, upload_time = "2025-08-22T10:33:56.382Z" }, + { url = "https://files.pythonhosted.org/packages/01/37/77e7971212e5c38a55431744f79dff27fd751771775165caea096d055ca4/lxml-6.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7fd70681aeed83b196482d42a9b0dc5b13bab55668d09ad75ed26dff3be5a2f5", size = 5657173, upload_time = "2025-08-22T10:33:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/32/a3/e98806d483941cd9061cc838b1169626acef7b2807261fbe5e382fcef881/lxml-6.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:10a72e456319b030b3dd900df6b1f19d89adf06ebb688821636dc406788cf6ac", size = 5245896, upload_time = "2025-08-22T10:34:00.586Z" }, + { url = "https://files.pythonhosted.org/packages/07/de/9bb5a05e42e8623bf06b4638931ea8c8f5eb5a020fe31703abdbd2e83547/lxml-6.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0fa45fb5f55111ce75b56c703843b36baaf65908f8b8d2fbbc0e249dbc127ed", size = 5267417, upload_time = "2025-08-22T10:34:02.719Z" }, + { url = "https://files.pythonhosted.org/packages/f2/43/c1cb2a7c67226266c463ef8a53b82d42607228beb763b5fbf4867e88a21f/lxml-6.0.1-cp313-cp313-win32.whl", hash = "sha256:01dab65641201e00c69338c9c2b8a0f2f484b6b3a22d10779bb417599fae32b5", size = 3610051, upload_time = "2025-08-22T10:34:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/34/96/6a6c3b8aa480639c1a0b9b6faf2a63fb73ab79ffcd2a91cf28745faa22de/lxml-6.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:bdf8f7c8502552d7bff9e4c98971910a0a59f60f88b5048f608d0a1a75e94d1c", size = 4009325, upload_time = "2025-08-22T10:34:06.24Z" }, + { url = "https://files.pythonhosted.org/packages/8c/66/622e8515121e1fd773e3738dae71b8df14b12006d9fb554ce90886689fd0/lxml-6.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a6aeca75959426b9fd8d4782c28723ba224fe07cfa9f26a141004210528dcbe2", size = 3670443, upload_time = "2025-08-22T10:34:07.974Z" }, + { url = "https://files.pythonhosted.org/packages/38/e3/b7eb612ce07abe766918a7e581ec6a0e5212352194001fd287c3ace945f0/lxml-6.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:29b0e849ec7030e3ecb6112564c9f7ad6881e3b2375dd4a0c486c5c1f3a33859", size = 8426160, upload_time = "2025-08-22T10:34:10.154Z" }, + { url = "https://files.pythonhosted.org/packages/35/8f/ab3639a33595cf284fe733c6526da2ca3afbc5fd7f244ae67f3303cec654/lxml-6.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:02a0f7e629f73cc0be598c8b0611bf28ec3b948c549578a26111b01307fd4051", size = 4589288, upload_time = "2025-08-22T10:34:12.972Z" }, + { url = "https://files.pythonhosted.org/packages/2c/65/819d54f2e94d5c4458c1db8c1ccac9d05230b27c1038937d3d788eb406f9/lxml-6.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:beab5e54de016e730875f612ba51e54c331e2fa6dc78ecf9a5415fc90d619348", size = 4964523, upload_time = "2025-08-22T10:34:15.474Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4a/d4a74ce942e60025cdaa883c5a4478921a99ce8607fc3130f1e349a83b28/lxml-6.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a08aefecd19ecc4ebf053c27789dd92c87821df2583a4337131cf181a1dffa", size = 5101108, upload_time = "2025-08-22T10:34:17.348Z" }, + { url = "https://files.pythonhosted.org/packages/cb/48/67f15461884074edd58af17b1827b983644d1fae83b3d909e9045a08b61e/lxml-6.0.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36c8fa7e177649470bc3dcf7eae6bee1e4984aaee496b9ccbf30e97ac4127fa2", size = 5053498, upload_time = "2025-08-22T10:34:19.232Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d4/ec1bf1614828a5492f4af0b6a9ee2eb3e92440aea3ac4fa158e5228b772b/lxml-6.0.1-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:5d08e0f1af6916267bb7eff21c09fa105620f07712424aaae09e8cb5dd4164d1", size = 5351057, upload_time = "2025-08-22T10:34:21.143Z" }, + { url = "https://files.pythonhosted.org/packages/65/2b/c85929dacac08821f2100cea3eb258ce5c8804a4e32b774f50ebd7592850/lxml-6.0.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9705cdfc05142f8c38c97a61bd3a29581ceceb973a014e302ee4a73cc6632476", size = 5671579, upload_time = "2025-08-22T10:34:23.528Z" }, + { url = "https://files.pythonhosted.org/packages/d0/36/cf544d75c269b9aad16752fd9f02d8e171c5a493ca225cb46bb7ba72868c/lxml-6.0.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74555e2da7c1636e30bff4e6e38d862a634cf020ffa591f1f63da96bf8b34772", size = 5250403, upload_time = "2025-08-22T10:34:25.642Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e8/83dbc946ee598fd75fdeae6151a725ddeaab39bb321354a9468d4c9f44f3/lxml-6.0.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:e38b5f94c5a2a5dadaddd50084098dfd005e5a2a56cd200aaf5e0a20e8941782", size = 4696712, upload_time = "2025-08-22T10:34:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/f4/72/889c633b47c06205743ba935f4d1f5aa4eb7f0325d701ed2b0540df1b004/lxml-6.0.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a5ec101a92ddacb4791977acfc86c1afd624c032974bfb6a21269d1083c9bc49", size = 5268177, upload_time = "2025-08-22T10:34:29.804Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/f42a21a1428479b66ea0da7bd13e370436aecaff0cfe93270c7e165bd2a4/lxml-6.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5c17e70c82fd777df586c12114bbe56e4e6f823a971814fd40dec9c0de518772", size = 5094648, upload_time = "2025-08-22T10:34:31.703Z" }, + { url = "https://files.pythonhosted.org/packages/51/b0/5f8c1e8890e2ee1c2053c2eadd1cb0e4b79e2304e2912385f6ca666f48b1/lxml-6.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:45fdd0415a0c3d91640b5d7a650a8f37410966a2e9afebb35979d06166fd010e", size = 4745220, upload_time = "2025-08-22T10:34:33.595Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f9/820b5125660dae489ca3a21a36d9da2e75dd6b5ffe922088f94bbff3b8a0/lxml-6.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d417eba28981e720a14fcb98f95e44e7a772fe25982e584db38e5d3b6ee02e79", size = 5692913, upload_time = "2025-08-22T10:34:35.482Z" }, + { url = "https://files.pythonhosted.org/packages/23/8e/a557fae9eec236618aecf9ff35fec18df41b6556d825f3ad6017d9f6e878/lxml-6.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8e5d116b9e59be7934febb12c41cce2038491ec8fdb743aeacaaf36d6e7597e4", size = 5259816, upload_time = "2025-08-22T10:34:37.482Z" }, + { url = "https://files.pythonhosted.org/packages/fa/fd/b266cfaab81d93a539040be699b5854dd24c84e523a1711ee5f615aa7000/lxml-6.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c238f0d0d40fdcb695c439fe5787fa69d40f45789326b3bb6ef0d61c4b588d6e", size = 5276162, upload_time = "2025-08-22T10:34:39.507Z" }, + { url = "https://files.pythonhosted.org/packages/25/6c/6f9610fbf1de002048e80585ea4719591921a0316a8565968737d9f125ca/lxml-6.0.1-cp314-cp314-win32.whl", hash = "sha256:537b6cf1c5ab88cfd159195d412edb3e434fee880f206cbe68dff9c40e17a68a", size = 3669595, upload_time = "2025-08-22T10:34:41.783Z" }, + { url = "https://files.pythonhosted.org/packages/72/a5/506775e3988677db24dc75a7b03e04038e0b3d114ccd4bccea4ce0116c15/lxml-6.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:911d0a2bb3ef3df55b3d97ab325a9ca7e438d5112c102b8495321105d25a441b", size = 4079818, upload_time = "2025-08-22T10:34:44.04Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/9613f300201b8700215856e5edd056d4e58dd23368699196b58877d4408b/lxml-6.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:2834377b0145a471a654d699bdb3a2155312de492142ef5a1d426af2c60a0a31", size = 3753901, upload_time = "2025-08-22T10:34:45.799Z" }, ] [[package]] name = "markdown" version = "3.8.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071, upload_time = "2025-06-19T17:12:44.483Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827 }, + { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload_time = "2025-06-19T17:12:42.994Z" }, ] [[package]] @@ -861,56 +1105,56 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } 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 }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "marko" version = "2.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795 } +sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795, upload_time = "2025-06-13T03:25:50.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186 }, + { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186, upload_time = "2025-06-13T03:25:49.858Z" }, ] [[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/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 }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -920,27 +1164,48 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload_time = "2025-08-11T07:25:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload_time = "2025-08-11T07:25:47.597Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload_time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload_time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mistune" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347, upload_time = "2025-03-19T14:27:24.955Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, + { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410, upload_time = "2025-03-19T14:27:23.451Z" }, ] [[package]] @@ -962,9 +1227,21 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload_time = "2024-08-30T12:24:06.899Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload_time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-argref-plugin" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012, upload_time = "2024-08-25T12:50:09.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790, upload_time = "2024-08-25T12:50:08.151Z" }, ] [[package]] @@ -974,9 +1251,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375 } +sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload_time = "2023-08-04T14:42:25.67Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235 }, + { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload_time = "2023-08-04T14:42:23.955Z" }, ] [[package]] @@ -988,11 +1265,21 @@ dependencies = [ { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/0c/c9826f35b99c67fa3a7cddfa094c1a6c43fafde558c309c6e4403e5b37dc/mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749", size = 54961 } +sdist = { url = "https://files.pythonhosted.org/packages/47/0c/c9826f35b99c67fa3a7cddfa094c1a6c43fafde558c309c6e4403e5b37dc/mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749", size = 54961, upload_time = "2025-05-20T13:09:09.886Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/dc/fc063b78f4b769d1956319351704e23ebeba1e9e1d6a41b4b602325fd7e4/mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13", size = 24969 }, + { url = "https://files.pythonhosted.org/packages/87/dc/fc063b78f4b769d1956319351704e23ebeba1e9e1d6a41b4b602325fd7e4/mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13", size = 24969, upload_time = "2025-05-20T13:09:08.237Z" }, ] +[[package]] +name = "mkdocs-ezlinks-plugin" +version = "0.1.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "pygtrie" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/3b/490d1b51fba7da69394e5a17f2c081eb65a10fb73565dc6793d53e4e4206/mkdocs-ezlinks-plugin-0.1.14.tar.gz", hash = "sha256:3e2085c16a850e022393e80194c17612e7b55de87fb45b3ffb618b5dfdb10811", size = 13366, upload_time = "2022-01-24T20:10:30.91Z" } + [[package]] name = "mkdocs-get-deps" version = "0.2.0" @@ -1002,9 +1289,22 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload_time = "2023-11-20T17:51:09.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload_time = "2023-11-20T17:51:08.587Z" }, +] + +[[package]] +name = "mkdocs-git-committers-plugin" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "pygithub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/88/e724563e9ff1b119869ef0704157caa8d7b9b9b4a8a8faf8120aa01620e2/mkdocs-git-committers-plugin-0.2.3.tar.gz", hash = "sha256:77188d8aacc11d5233d6949435670e3d6545ffb7a0e274d56f32ed3984353c61", size = 5379, upload_time = "2023-11-06T17:13:30.207Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, + { url = "https://files.pythonhosted.org/packages/81/56/15fdbb6afa718a6c9de626bd11672040832ba547c03daf205e295be4e0d4/mkdocs_git_committers_plugin-0.2.3-py3-none-any.whl", hash = "sha256:4ca79efb7e61a72652d3512d61af5c40a4572e36667e1a00032aad524250780d", size = 4340, upload_time = "2023-11-06T17:13:28.979Z" }, ] [[package]] @@ -1017,9 +1317,26 @@ dependencies = [ { name = "mkdocs" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload_time = "2025-05-28T18:26:20.697Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382 }, + { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload_time = "2025-05-28T18:26:18.907Z" }, +] + +[[package]] +name = "mkdocs-jupyter" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "jupytext" }, + { name = "mkdocs" }, + { name = "mkdocs-material" }, + { name = "nbconvert" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747, upload_time = "2024-10-15T14:56:32.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197, upload_time = "2024-10-15T14:56:29.854Z" }, ] [[package]] @@ -1039,18 +1356,18 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/c1/f804ba2db2ddc2183e900befe7dad64339a34fa935034e1ab405289d0a97/mkdocs_material-9.6.15.tar.gz", hash = "sha256:64adf8fa8dba1a17905b6aee1894a5aafd966d4aeb44a11088519b0f5ca4f1b5", size = 3951836 } +sdist = { url = "https://files.pythonhosted.org/packages/95/c1/f804ba2db2ddc2183e900befe7dad64339a34fa935034e1ab405289d0a97/mkdocs_material-9.6.15.tar.gz", hash = "sha256:64adf8fa8dba1a17905b6aee1894a5aafd966d4aeb44a11088519b0f5ca4f1b5", size = 3951836, upload_time = "2025-07-01T10:14:15.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/30/dda19f0495a9096b64b6b3c07c4bfcff1c76ee0fc521086d53593f18b4c0/mkdocs_material-9.6.15-py3-none-any.whl", hash = "sha256:ac969c94d4fe5eb7c924b6d2f43d7db41159ea91553d18a9afc4780c34f2717a", size = 8716840 }, + { url = "https://files.pythonhosted.org/packages/1d/30/dda19f0495a9096b64b6b3c07c4bfcff1c76ee0fc521086d53593f18b4c0/mkdocs_material-9.6.15-py3-none-any.whl", hash = "sha256:ac969c94d4fe5eb7c924b6d2f43d7db41159ea91553d18a9afc4780c34f2717a", size = 8716840, upload_time = "2025-07-01T10:14:13.18Z" }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload_time = "2023-11-22T19:09:45.208Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload_time = "2023-11-22T19:09:43.465Z" }, ] [[package]] @@ -1063,9 +1380,9 @@ dependencies = [ { name = "jsmin" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366 } +sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366, upload_time = "2024-01-29T16:11:32.982Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723 }, + { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723, upload_time = "2024-01-29T16:11:31.851Z" }, ] [[package]] @@ -1075,9 +1392,49 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791, upload_time = "2024-11-18T13:15:13.977Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717 }, + { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717, upload_time = "2024-11-18T13:15:12.286Z" }, +] + +[[package]] +name = "mkdocs-redirects" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162, upload_time = "2024-11-07T14:57:21.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142, upload_time = "2024-11-07T14:57:19.143Z" }, +] + +[[package]] +name = "mkdocs-table-reader-plugin" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "pandas" }, + { name = "pyyaml" }, + { name = "tabulate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510, upload_time = "2024-08-29T14:08:09.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564, upload_time = "2024-08-29T14:08:07.367Z" }, +] + +[[package]] +name = "mkdocs-video" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633, upload_time = "2023-03-17T17:36:43.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570, upload_time = "2023-03-17T17:36:40.776Z" }, ] [[package]] @@ -1092,9 +1449,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686 } +sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686, upload_time = "2025-03-31T08:33:11.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075 }, + { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075, upload_time = "2025-03-31T08:33:09.661Z" }, ] [[package]] @@ -1106,9 +1463,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ed/b886f8c714fd7cccc39b79646b627dbea84cd95c46be43459ef46852caf0/mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d", size = 206065 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ed/b886f8c714fd7cccc39b79646b627dbea84cd95c46be43459ef46852caf0/mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d", size = 206065, upload_time = "2025-06-03T12:52:49.276Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/dd/a24ee3de56954bfafb6ede7cd63c2413bb842cc48eb45e41c43a05a33074/mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374", size = 124287 }, + { url = "https://files.pythonhosted.org/packages/3b/dd/a24ee3de56954bfafb6ede7cd63c2413bb842cc48eb45e41c43a05a33074/mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374", size = 124287, upload_time = "2025-06-03T12:52:47.819Z" }, ] [[package]] @@ -1120,89 +1477,153 @@ dependencies = [ { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747 } +sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload_time = "2025-06-16T16:51:35.145Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493 }, - { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687 }, - { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723 }, - { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980 }, - { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328 }, - { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321 }, - { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480 }, - { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538 }, - { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839 }, - { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634 }, - { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584 }, - { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886 }, - { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923 }, + { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493, upload_time = "2025-06-16T16:47:01.683Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687, upload_time = "2025-06-16T16:48:19.367Z" }, + { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723, upload_time = "2025-06-16T16:49:20.912Z" }, + { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980, upload_time = "2025-06-16T16:37:40.929Z" }, + { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328, upload_time = "2025-06-16T16:34:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321, upload_time = "2025-06-16T16:48:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480, upload_time = "2025-06-16T16:47:56.205Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538, upload_time = "2025-06-16T16:46:43.92Z" }, + { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839, upload_time = "2025-06-16T16:36:28.039Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634, upload_time = "2025-06-16T16:50:34.441Z" }, + { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584, upload_time = "2025-06-16T16:34:54.857Z" }, + { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886, upload_time = "2025-06-16T16:36:43.589Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923, upload_time = "2025-06-16T16:48:02.366Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload_time = "2024-12-19T10:32:27.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload_time = "2024-12-19T10:32:24.139Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.16.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload_time = "2025-01-28T09:29:14.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload_time = "2025-01-28T09:29:12.551Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload_time = "2024-04-04T11:20:37.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload_time = "2024-04-04T11:20:34.895Z" }, ] [[package]] name = "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 } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload_time = "2024-01-21T14:25:19.227Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload_time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "networkx" +version = "3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload_time = "2025-05-29T11:35:07.804Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload_time = "2025-05-29T11:35:04.961Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload_time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload_time = "2024-06-04T18:44:08.352Z" }, ] [[package]] name = "numpy" version = "2.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664 }, - { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078 }, - { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554 }, - { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560 }, - { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638 }, - { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729 }, - { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330 }, - { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734 }, - { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411 }, - { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973 }, - { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491 }, - { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381 }, - { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726 }, - { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145 }, - { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409 }, - { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630 }, - { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546 }, - { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538 }, - { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327 }, - { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330 }, - { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565 }, - { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262 }, - { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593 }, - { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523 }, - { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993 }, - { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652 }, - { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561 }, - { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349 }, - { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053 }, - { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184 }, - { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678 }, - { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697 }, - { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376 }, +sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372, upload_time = "2025-06-21T12:28:33.469Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664, upload_time = "2025-06-21T12:15:30.845Z" }, + { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078, upload_time = "2025-06-21T12:15:52.23Z" }, + { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554, upload_time = "2025-06-21T12:16:01.434Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560, upload_time = "2025-06-21T12:16:11.895Z" }, + { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638, upload_time = "2025-06-21T12:16:32.611Z" }, + { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729, upload_time = "2025-06-21T12:16:57.439Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330, upload_time = "2025-06-21T12:17:20.638Z" }, + { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734, upload_time = "2025-06-21T12:17:47.938Z" }, + { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411, upload_time = "2025-06-21T12:17:58.475Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973, upload_time = "2025-06-21T12:18:17.601Z" }, + { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491, upload_time = "2025-06-21T12:18:33.585Z" }, + { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381, upload_time = "2025-06-21T12:19:04.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726, upload_time = "2025-06-21T12:19:25.599Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145, upload_time = "2025-06-21T12:19:34.782Z" }, + { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409, upload_time = "2025-06-21T12:19:45.228Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630, upload_time = "2025-06-21T12:20:06.544Z" }, + { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546, upload_time = "2025-06-21T12:20:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538, upload_time = "2025-06-21T12:20:54.322Z" }, + { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327, upload_time = "2025-06-21T12:21:21.053Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330, upload_time = "2025-06-21T12:25:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565, upload_time = "2025-06-21T12:25:26.444Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262, upload_time = "2025-06-21T12:25:42.196Z" }, + { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593, upload_time = "2025-06-21T12:21:51.664Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523, upload_time = "2025-06-21T12:22:13.583Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993, upload_time = "2025-06-21T12:22:22.53Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652, upload_time = "2025-06-21T12:22:33.629Z" }, + { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561, upload_time = "2025-06-21T12:22:55.056Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349, upload_time = "2025-06-21T12:23:20.53Z" }, + { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053, upload_time = "2025-06-21T12:23:43.697Z" }, + { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184, upload_time = "2025-06-21T12:24:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678, upload_time = "2025-06-21T12:24:21.596Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697, upload_time = "2025-06-21T12:24:40.644Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376, upload_time = "2025-06-21T12:24:56.884Z" }, ] [[package]] @@ -1216,9 +1637,9 @@ dependencies = [ { name = "pyarrow" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630, upload_time = "2025-06-16T16:15:05.49Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314 }, + { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314, upload_time = "2025-06-16T16:15:04.328Z" }, ] [[package]] @@ -1228,27 +1649,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "et-xmlfile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 } +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 }, + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "paginate" version = "0.5.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload_time = "2024-08-25T14:17:24.139Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload_time = "2024-08-25T14:17:22.55Z" }, ] [[package]] @@ -1261,53 +1682,62 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172 }, - { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365 }, - { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411 }, - { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013 }, - { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210 }, - { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571 }, - { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601 }, - { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393 }, - { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750 }, - { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004 }, - { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869 }, - { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218 }, - { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763 }, - { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482 }, - { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159 }, - { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287 }, - { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381 }, - { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998 }, - { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705 }, - { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044 }, +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload_time = "2025-07-07T19:20:04.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload_time = "2025-07-07T19:18:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload_time = "2025-07-07T19:18:54.785Z" }, + { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload_time = "2025-07-07T19:18:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload_time = "2025-07-07T19:18:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload_time = "2025-07-07T19:19:02.944Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload_time = "2025-07-07T19:19:06.82Z" }, + { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload_time = "2025-07-07T19:19:09.589Z" }, + { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload_time = "2025-07-07T19:19:12.245Z" }, + { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload_time = "2025-07-07T19:19:14.612Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload_time = "2025-07-07T19:19:16.857Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload_time = "2025-07-07T19:19:19.265Z" }, + { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload_time = "2025-07-07T19:19:21.547Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload_time = "2025-07-07T19:19:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload_time = "2025-07-07T19:19:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload_time = "2025-07-07T19:19:26.362Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload_time = "2025-07-07T19:19:29.157Z" }, + { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload_time = "2025-07-07T19:19:31.436Z" }, + { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload_time = "2025-07-07T19:19:34.267Z" }, + { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload_time = "2025-07-07T19:19:36.856Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload_time = "2025-07-07T19:19:39.999Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload_time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload_time = "2024-01-18T20:08:11.28Z" }, ] [[package]] name = "parso" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload_time = "2024-04-05T09:43:55.897Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload_time = "2024-04-05T09:43:53.299Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, ] [[package]] name = "petl" version = "1.7.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780 } +sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780, upload_time = "2025-04-04T23:54:50.921Z" } [[package]] name = "pexpect" @@ -1316,9 +1746,75 @@ 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 }, +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload_time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload_time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload_time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload_time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload_time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload_time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload_time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload_time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload_time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload_time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload_time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload_time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload_time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload_time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload_time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload_time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload_time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload_time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload_time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload_time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload_time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload_time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload_time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload_time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload_time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload_time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload_time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload_time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload_time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload_time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload_time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload_time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload_time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload_time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload_time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload_time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload_time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload_time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload_time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload_time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload_time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload_time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload_time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload_time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload_time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload_time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload_time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload_time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload_time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload_time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload_time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload_time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload_time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload_time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload_time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload_time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload_time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload_time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload_time = "2025-07-01T09:15:50.399Z" }, ] [[package]] @@ -1331,36 +1827,36 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225 } +sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload_time = "2024-11-07T16:29:46.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029 }, + { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload_time = "2024-11-07T16:29:43.976Z" }, ] [[package]] name = "platformdirs" version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload_time = "2025-05-07T22:47:42.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload_time = "2025-05-07T22:47:40.376Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "ply" version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130 } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567 }, + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, ] [[package]] @@ -1374,9 +1870,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424 } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload_time = "2025-03-18T21:35:20.987Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707 }, + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload_time = "2025-03-18T21:35:19.343Z" }, ] [[package]] @@ -1386,86 +1882,86 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload_time = "2025-04-15T09:18:47.731Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload_time = "2025-04-15T09:18:44.753Z" }, ] [[package]] name = "psutil" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload_time = "2025-02-13T21:54:07.946Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload_time = "2025-02-13T21:54:12.36Z" }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload_time = "2025-02-13T21:54:16.07Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload_time = "2025-02-13T21:54:18.662Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload_time = "2025-02-13T21:54:21.811Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload_time = "2025-02-13T21:54:24.68Z" }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload_time = "2025-02-13T21:54:34.31Z" }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload_time = "2025-02-13T21:54:37.486Z" }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload_time = "2020-12-28T15:15:28.35Z" }, ] [[package]] name = "pure-eval" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload_time = "2024-07-21T12:58:21.801Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, ] [[package]] name = "pyarrow" version = "20.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067 }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128 }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890 }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775 }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231 }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639 }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549 }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216 }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496 }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501 }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895 }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322 }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441 }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027 }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473 }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897 }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847 }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219 }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957 }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972 }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434 }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648 }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853 }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743 }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441 }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279 }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982 }, +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, + { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, + { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, + { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload_time = "2024-03-30T13:22:22.564Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, ] [[package]] @@ -1478,9 +1974,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload_time = "2025-06-14T08:33:17.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload_time = "2025-06-14T08:33:14.905Z" }, ] [[package]] @@ -1490,39 +1986,39 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, ] [[package]] @@ -1538,18 +2034,57 @@ dependencies = [ { name = "requests" }, { name = "wbgapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586, upload_time = "2025-06-03T09:38:12.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540 }, + { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540, upload_time = "2025-06-03T09:38:10.858Z" }, +] + +[[package]] +name = "pygithub" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyjwt", extra = ["crypto"] }, + { name = "pynacl" }, + { name = "requests" }, + { name = "typing-extensions" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/a7/403e04aa96e2d94e1518d518d69718c2ba978c8d3ffa4ab3b101b94dbafa/pygithub-2.7.0.tar.gz", hash = "sha256:7cd6eafabb09b5369afba3586d86b1f1ad6f1326d2ff01bc47bb26615dce4cbb", size = 3707928, upload_time = "2025-07-31T11:52:53.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/76/d768dd31322173b3956692b75471ac37bf3759c7abb603152f6a9b6594a8/pygithub-2.7.0-py3-none-any.whl", hash = "sha256:40ecbfe26dc55cc34ab4b0ffa1d455e6f816ef9a2bc8d6f5ad18ce572f163700", size = 416514, upload_time = "2025-07-31T11:52:51.909Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pygtrie" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/13/55deec25bf09383216fa7f1dfcdbfca40a04aa00b6d15a5cbf25af8fce5f/pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2", size = 39266, upload_time = "2022-07-16T14:29:47.459Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/cd/bd196b2cf014afb1009de8b0f05ecd54011d881944e62763f3c1b1e8ef37/pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16", size = 25099, upload_time = "2022-09-23T20:30:05.12Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, ] [[package]] @@ -1560,9 +2095,49 @@ dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197, upload_time = "2025-06-21T17:56:36.974Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143 }, + { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143, upload_time = "2025-06-21T17:56:35.356Z" }, +] + +[[package]] +name = "pynacl" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854, upload_time = "2022-01-07T22:05:41.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920, upload_time = "2022-01-07T22:05:49.156Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722, upload_time = "2022-01-07T22:05:50.989Z" }, + { url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087, upload_time = "2022-01-07T22:05:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678, upload_time = "2022-01-07T22:05:54.251Z" }, + { url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660, upload_time = "2022-01-07T22:05:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824, upload_time = "2022-01-07T22:05:57.434Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912, upload_time = "2022-01-07T22:05:58.665Z" }, + { url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624, upload_time = "2022-01-07T22:06:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141, upload_time = "2022-01-07T22:06:01.861Z" }, +] + +[[package]] +name = "pyomo" +version = "6.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ply" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/d4/bbb4ab79bb3015e3bdd488435ef71f7806144cc6ae4146ee6c5f64ac53f2/pyomo-6.9.4.tar.gz", hash = "sha256:34ad22cd6bf9956de9c0d3842d01c1f92dee0515b25aa3e8f113b326549b1231", size = 3033231, upload_time = "2025-08-28T02:11:24.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/6b/80f40b4b72a3c6a207130ce431765f897c76133a15e7e38e66f9f40d36f3/pyomo-6.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc3cd52c143991071821bbb9943d2a59512481b5d15adb7add32f92def4172ce", size = 4266926, upload_time = "2025-08-28T02:09:44.833Z" }, + { url = "https://files.pythonhosted.org/packages/48/30/f7ef1be3deb445694b63800de6a36dff31670014d5aa67d42e1716c04970/pyomo-6.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a5e1dc79e1a2ec1f6247f0df59ac3572781e40218093a624f9213dd3ae6913f", size = 4255513, upload_time = "2025-08-28T02:09:49.197Z" }, + { url = "https://files.pythonhosted.org/packages/76/f4/9493daae82595d7d776ba6cd0d5d167951700670e363dec443415e753808/pyomo-6.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abea6ca55295b179c1c91184db4eece7589cfd6099869eff8e3e6aa8a06463d1", size = 4311852, upload_time = "2025-08-28T02:09:53.415Z" }, + { url = "https://files.pythonhosted.org/packages/83/d7/e39e605ab33c2729afb043bed94ce7ee382bd5b4bc708f6c90a1d2600456/pyomo-6.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddd48dec34b270ca2621863a216c4f3a6fcc409db86a7dc34c31eb788a44b8c6", size = 4343130, upload_time = "2025-08-28T02:09:57.397Z" }, + { url = "https://files.pythonhosted.org/packages/65/04/dc4d3d9369c4cb1b6e68ce18bbba066ea83284942322836e791dbf693bb2/pyomo-6.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1a768a178ae3f0391c66e2334da3d1618c9c85c9d879bc86de441efd143f491", size = 4267029, upload_time = "2025-08-28T02:10:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/6b/52/824e9cea51ed0a25636b66e8c122dce5fcd22a197bf4646dd6c5f138fe36/pyomo-6.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09cde10e5fe8414f453d1ed3bccef1b42fc048fc2da0a9c936e40b2f877201bf", size = 4255606, upload_time = "2025-08-28T02:10:06.383Z" }, + { url = "https://files.pythonhosted.org/packages/a2/dc/97005d683ca57e231a8f613921adaf480d3a82f40d280c6d0185855a92c6/pyomo-6.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3e173d330666f881258deefa79f37373b941d4a5b00edc6aa5b10680720dc1", size = 4312670, upload_time = "2025-08-28T02:10:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/64/73/47525078660eced084abb9a79e1e4c74098c992316c93ab6ead2dc7f8bda/pyomo-6.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a13baebcdb05deadeb0ec4b04ecedffa65f1e86179418fa67e603a4f8f1bf17", size = 4344540, upload_time = "2025-08-28T02:10:15.731Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e3/56c20c3358e58206e7270a42ff666a267a6c01492213c8c47aad8676b487/pyomo-6.9.4-py3-none-any.whl", hash = "sha256:a274d74616c0b793279931f3b2175a31f9c63213f2d7b86c14d168c6c264f782", size = 3892640, upload_time = "2025-08-28T02:11:13.845Z" }, ] [[package]] @@ -1572,9 +2147,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729 }, + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, ] [[package]] @@ -1588,9 +2163,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 } +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload_time = "2025-06-18T05:48:06.109Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 }, + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload_time = "2025-06-18T05:48:03.955Z" }, ] [[package]] @@ -1602,9 +2177,9 @@ dependencies = [ { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432 } +sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload_time = "2025-06-12T10:47:47.684Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644 }, + { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload_time = "2025-06-12T10:47:45.932Z" }, ] [[package]] @@ -1615,9 +2190,46 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload_time = "2025-07-01T13:30:59.346Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload_time = "2025-07-01T13:30:56.632Z" }, +] + +[[package]] +name = "python-calamine" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/03/269f96535705b2f18c8977fa58e76763b4e4727a9b3ae277a9468c8ffe05/python_calamine-0.4.0.tar.gz", hash = "sha256:94afcbae3fec36d2d7475095a59d4dc6fae45829968c743cb799ebae269d7bbf", size = 127737, upload_time = "2025-07-04T06:05:28.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/60/f951513aaaa470b3a38a87d65eca45e0a02bc329b47864f5a17db563f746/python_calamine-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:74bca5d44a73acf3dcfa5370820797fcfd225c8c71abcddea987c5b4f5077e98", size = 826603, upload_time = "2025-07-04T06:03:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/76/3f/789955bbc77831c639890758f945eb2b25d6358065edf00da6751226cf31/python_calamine-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf80178f5d1b0ee2ccfffb8549c50855f6249e930664adc5807f4d0d6c2b269c", size = 805826, upload_time = "2025-07-04T06:03:52.482Z" }, + { url = "https://files.pythonhosted.org/packages/00/4c/f87d17d996f647030a40bfd124fe45fe893c002bee35ae6aca9910a923ae/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfef345386ae86f7720f1be93495a40fd7e7feabb8caa1df5025d7fbc58a1f", size = 874989, upload_time = "2025-07-04T06:03:53.794Z" }, + { url = "https://files.pythonhosted.org/packages/47/d2/3269367303f6c0488cf1bfebded3f9fe968d118a988222e04c9b2636bf2e/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f23e6214dbf9b29065a5dcfd6a6c674dd0e251407298c9138611c907d53423ff", size = 877504, upload_time = "2025-07-04T06:03:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/f9/6d/c7ac35f5c7125e8bd07eb36773f300fda20dd2da635eae78a8cebb0b6ab7/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d792d304ee232ab01598e1d3ab22e074a32c2511476b5fb4f16f4222d9c2a265", size = 1014171, upload_time = "2025-07-04T06:03:56.777Z" }, + { url = "https://files.pythonhosted.org/packages/f0/81/5ea8792a2e9ab5e2a05872db3a4d3ed3538ad5af1861282c789e2f13a8cf/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf813425918fd68f3e991ef7c4b5015be0a1a95fc4a8ab7e73c016ef1b881bb4", size = 926737, upload_time = "2025-07-04T06:03:58.024Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/989e56e6f073fc0981a74ba7a393881eb351bb143e5486aa629b5e5d6a8b/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbe2a0ccb4d003635888eea83a995ff56b0748c8c76fc71923544f5a4a7d4cd7", size = 887032, upload_time = "2025-07-04T06:03:59.298Z" }, + { url = "https://files.pythonhosted.org/packages/5d/92/2c9bd64277c6fe4be695d7d5a803b38d953ec8565037486be7506642c27c/python_calamine-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7b3bb5f0d910b9b03c240987560f843256626fd443279759df4e91b717826d2", size = 929700, upload_time = "2025-07-04T06:04:01.388Z" }, + { url = "https://files.pythonhosted.org/packages/64/fa/fc758ca37701d354a6bc7d63118699f1c73788a1f2e1b44d720824992764/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bd2c0fc2b5eabd08ceac8a2935bffa88dbc6116db971aa8c3f244bad3fd0f644", size = 1053971, upload_time = "2025-07-04T06:04:02.704Z" }, + { url = "https://files.pythonhosted.org/packages/65/52/40d7e08ae0ddba331cdc9f7fb3e92972f8f38d7afbd00228158ff6d1fceb/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:85b547cb1c5b692a0c2406678d666dbc1cec65a714046104683fe4f504a1721d", size = 1057057, upload_time = "2025-07-04T06:04:04.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/e8a071c0adfda73285d891898a24f6e99338328c404f497ff5b0e6bc3d45/python_calamine-0.4.0-cp312-cp312-win32.whl", hash = "sha256:4c2a1e3a0db4d6de4587999a21cc35845648c84fba81c03dd6f3072c690888e4", size = 665540, upload_time = "2025-07-04T06:04:05.679Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f2/7fdfada13f80db12356853cf08697ff4e38800a1809c2bdd26ee60962e7a/python_calamine-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b193c89ffcc146019475cd121c552b23348411e19c04dedf5c766a20db64399a", size = 695366, upload_time = "2025-07-04T06:04:06.977Z" }, + { url = "https://files.pythonhosted.org/packages/20/66/d37412ad854480ce32f50d9f74f2a2f88b1b8a6fbc32f70aabf3211ae89e/python_calamine-0.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:43a0f15e0b60c75a71b21a012b911d5d6f5fa052afad2a8edbc728af43af0fcf", size = 670740, upload_time = "2025-07-04T06:04:08.656Z" }, + { url = "https://files.pythonhosted.org/packages/5a/10/f78218ccdc5bb5591a37d582c7e8723121d0fbe8196c5a4089110ec02f22/python_calamine-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f8d6b2d2ae73acf91343f02756bdcb2fa6117db4eaf5cfab75ce50dfb54525ee", size = 826339, upload_time = "2025-07-04T06:04:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/15/b1/d7d0dbbd0469db0fc628b1b9ee3a8f3b698391279f0d7aea96e2018a3863/python_calamine-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aca7e019f42ca16806fef53e3028fa158005c0e68eabda577c3f3c2bea9735fd", size = 805473, upload_time = "2025-07-04T06:04:11.557Z" }, + { url = "https://files.pythonhosted.org/packages/46/52/033b902fb11f9b4bb59fa18621acbf5eaf4ecb0bce878d34fcb0020229df/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aca67cb447ba8dcefa4d5a1131d1cfdd1e0d0a0f0c6470655ce9ad37b7cfa228", size = 874275, upload_time = "2025-07-04T06:04:13.318Z" }, + { url = "https://files.pythonhosted.org/packages/56/12/e6b589293314a5d10b2c309411542424ebefb77430cc715d7601d80349ae/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e127d3b78d511d4f6fbdfed02fe666d83a722d73e27dd64d1718be9efafbabfe", size = 877061, upload_time = "2025-07-04T06:04:15.013Z" }, + { url = "https://files.pythonhosted.org/packages/64/24/0eeb583eb5d44f674ca9f7a846c665e33190431386d7c9f6d08ec9f09d3c/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e47891d9d62e3015448749ddb2ba60ab583a651d0fca9a3a1794936942ad7d5d", size = 1013946, upload_time = "2025-07-04T06:04:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/c4/93/360cf58b8e24f760a3d4643423389dbc37bdca8b6fdda75ffc664ce622b5/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4072bf9dcb8ec49f5b92688bd960b5d0e03e4826d227bbd66478a6f6b0aea06", size = 926462, upload_time = "2025-07-04T06:04:17.936Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5d/3b8c46ccc62d020858bc52f2d792208910eb68682c6ebf8d6706593d7a88/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabc9dc770f753c4227aacedd8390056937e67af0bf65d6696c584d3054f1287", size = 886319, upload_time = "2025-07-04T06:04:19.33Z" }, + { url = "https://files.pythonhosted.org/packages/66/cf/73241714800bddb277f827c4683f579b81915406bf7dc643dc185cef7eb2/python_calamine-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4bcf36dc77674892616b66cffba432f5fd62df3e0adb0487ec245036b50041", size = 929044, upload_time = "2025-07-04T06:04:20.689Z" }, + { url = "https://files.pythonhosted.org/packages/7c/6b/71e30ee568ce1ea6676be66f1a42c6397946859effc471cc102922fb4792/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f81518d4b49c47054cb1861badf5bcef44b0a49959968fb2e9c9cb89645c76af", size = 1053084, upload_time = "2025-07-04T06:04:22.414Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/87b42fe975f8952754562785a545f6d2eec17c353befdf33a8e16c046ce0/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:18375eb3ac1362fcbf3a9fcad0672d8dc054001247bc52f063e0054a3e01a8d1", size = 1056735, upload_time = "2025-07-04T06:04:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/04/db/ecee6e5d6ed4f3725312580a83c4cb1758c9060aa08bf2d8512d3396cea1/python_calamine-0.4.0-cp313-cp313-win32.whl", hash = "sha256:c7e98c7e531bafdf719414d0c428f25f933a82640fb92e6e84864a85e758aecc", size = 665282, upload_time = "2025-07-04T06:04:25.274Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0b/26337e0a0e2b335c1d6225bda8de259a21fea129a06009c1471deda28e1f/python_calamine-0.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:6ec081b874e78f4dbcbe70804644281366814289956755575a5871f725592d4e", size = 694982, upload_time = "2025-07-04T06:04:26.573Z" }, + { url = "https://files.pythonhosted.org/packages/90/26/f72c2b2fe70f2901abb41fcdf8249181133ddd72b9392cfb63d030393b3e/python_calamine-0.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f9bdf570023138ee4090a51b1e34786978d6e649852ccc3b83ac9729f125ca2", size = 670283, upload_time = "2025-07-04T06:04:28.434Z" }, ] [[package]] @@ -1627,9 +2239,9 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, ] [[package]] @@ -1639,16 +2251,16 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload_time = "2025-03-11T12:27:27.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453 }, + { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, ] [[package]] name = "python-io-wrapper" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } [[package]] name = "python-slugify" @@ -1657,18 +2269,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -1676,38 +2288,38 @@ name = "pywin32" version = "310" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, - { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, - { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, - { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, - { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, - { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, ] [[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/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 }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -1717,9 +2329,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload_time = "2025-05-13T15:24:01.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722 }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload_time = "2025-05-13T15:23:59.629Z" }, ] [[package]] @@ -1729,34 +2341,34 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438 }, - { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095 }, - { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826 }, - { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750 }, - { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357 }, - { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281 }, - { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110 }, - { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297 }, - { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203 }, - { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927 }, - { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826 }, - { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283 }, - { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567 }, - { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681 }, - { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148 }, - { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768 }, - { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199 }, - { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439 }, - { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933 }, +sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload_time = "2025-06-13T14:09:07.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload_time = "2025-06-13T14:07:31.676Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload_time = "2025-06-13T14:07:33.104Z" }, + { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload_time = "2025-06-13T14:07:34.831Z" }, + { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload_time = "2025-06-13T14:07:36.553Z" }, + { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload_time = "2025-06-13T14:07:38.21Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload_time = "2025-06-13T14:07:39.599Z" }, + { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload_time = "2025-06-13T14:07:41.027Z" }, + { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload_time = "2025-06-13T14:07:42.533Z" }, + { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload_time = "2025-06-13T14:07:43.843Z" }, + { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload_time = "2025-06-13T14:07:45.51Z" }, + { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826, upload_time = "2025-06-13T14:07:46.881Z" }, + { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283, upload_time = "2025-06-13T14:07:49.562Z" }, + { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567, upload_time = "2025-06-13T14:07:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681, upload_time = "2025-06-13T14:07:52.77Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148, upload_time = "2025-06-13T14:07:54.178Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768, upload_time = "2025-06-13T14:07:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199, upload_time = "2025-06-13T14:07:57.166Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439, upload_time = "2025-06-13T14:07:58.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload_time = "2025-06-13T14:08:00.777Z" }, ] [[package]] name = "ratelimit" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } [[package]] name = "referencing" @@ -1767,9 +2379,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -1782,9 +2394,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload_time = "2025-06-09T16:43:07.34Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" }, ] [[package]] @@ -1794,9 +2406,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891 } +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244 }, + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, ] [[package]] @@ -1813,107 +2425,107 @@ dependencies = [ { name = "python-debian" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/43/35421efe0e69823787b331362e11cc16bb697cd6f19cbed284d421615f14/reuse-5.0.2.tar.gz", hash = "sha256:878016ae5dd29c10bad4606d6676c12a268c12aa9fcfea66403598e16eed085c", size = 358798 } +sdist = { url = "https://files.pythonhosted.org/packages/08/43/35421efe0e69823787b331362e11cc16bb697cd6f19cbed284d421615f14/reuse-5.0.2.tar.gz", hash = "sha256:878016ae5dd29c10bad4606d6676c12a268c12aa9fcfea66403598e16eed085c", size = 358798, upload_time = "2024-11-14T09:33:17.512Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309 }, + { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309, upload_time = "2024-11-14T09:33:15.047Z" }, ] [[package]] name = "rfc3986" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026 } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326 }, + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, ] [[package]] name = "rich" -version = "14.0.0" +version = "13.9.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload_time = "2024-11-01T16:43:57.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload_time = "2024-11-01T16:43:55.817Z" }, ] [[package]] name = "rpds-py" version = "0.26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933 }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447 }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711 }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865 }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763 }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651 }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079 }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379 }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033 }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639 }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105 }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272 }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995 }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198 }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917 }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073 }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214 }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113 }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189 }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998 }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903 }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785 }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329 }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875 }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636 }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663 }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428 }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571 }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475 }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692 }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415 }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783 }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844 }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105 }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440 }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759 }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032 }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416 }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049 }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428 }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524 }, - { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292 }, - { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334 }, - { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875 }, - { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993 }, - { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683 }, - { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825 }, - { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292 }, - { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435 }, - { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410 }, - { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724 }, - { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285 }, - { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459 }, - { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083 }, - { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291 }, - { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445 }, - { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206 }, - { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330 }, - { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254 }, - { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094 }, - { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889 }, - { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301 }, - { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891 }, - { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044 }, - { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774 }, - { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886 }, - { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027 }, - { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821 }, +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload_time = "2025-07-01T15:57:13.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload_time = "2025-07-01T15:54:15.734Z" }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload_time = "2025-07-01T15:54:16.922Z" }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload_time = "2025-07-01T15:54:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload_time = "2025-07-01T15:54:19.295Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload_time = "2025-07-01T15:54:20.858Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload_time = "2025-07-01T15:54:22.508Z" }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload_time = "2025-07-01T15:54:23.987Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload_time = "2025-07-01T15:54:25.073Z" }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload_time = "2025-07-01T15:54:26.225Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload_time = "2025-07-01T15:54:27.424Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload_time = "2025-07-01T15:54:29.93Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload_time = "2025-07-01T15:54:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload_time = "2025-07-01T15:54:32.195Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload_time = "2025-07-01T15:54:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload_time = "2025-07-01T15:54:34.755Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload_time = "2025-07-01T15:54:36.292Z" }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload_time = "2025-07-01T15:54:37.469Z" }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload_time = "2025-07-01T15:54:38.954Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload_time = "2025-07-01T15:54:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload_time = "2025-07-01T15:54:43.025Z" }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload_time = "2025-07-01T15:54:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload_time = "2025-07-01T15:54:46.043Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload_time = "2025-07-01T15:54:47.64Z" }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload_time = "2025-07-01T15:54:48.9Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload_time = "2025-07-01T15:54:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload_time = "2025-07-01T15:54:52.023Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload_time = "2025-07-01T15:54:53.692Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload_time = "2025-07-01T15:54:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload_time = "2025-07-01T15:54:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload_time = "2025-07-01T15:54:58.561Z" }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload_time = "2025-07-01T15:54:59.751Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload_time = "2025-07-01T15:55:00.898Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload_time = "2025-07-01T15:55:02.201Z" }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload_time = "2025-07-01T15:55:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload_time = "2025-07-01T15:55:05.398Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload_time = "2025-07-01T15:55:08.316Z" }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload_time = "2025-07-01T15:55:09.52Z" }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload_time = "2025-07-01T15:55:11.216Z" }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload_time = "2025-07-01T15:55:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload_time = "2025-07-01T15:55:14.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload_time = "2025-07-01T15:55:15.745Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload_time = "2025-07-01T15:55:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload_time = "2025-07-01T15:55:18.922Z" }, + { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload_time = "2025-07-01T15:55:20.399Z" }, + { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload_time = "2025-07-01T15:55:21.729Z" }, + { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload_time = "2025-07-01T15:55:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload_time = "2025-07-01T15:55:24.207Z" }, + { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload_time = "2025-07-01T15:55:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload_time = "2025-07-01T15:55:27.798Z" }, + { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload_time = "2025-07-01T15:55:29.057Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload_time = "2025-07-01T15:55:30.719Z" }, + { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload_time = "2025-07-01T15:55:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload_time = "2025-07-01T15:55:33.312Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload_time = "2025-07-01T15:55:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload_time = "2025-07-01T15:55:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload_time = "2025-07-01T15:55:37.483Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload_time = "2025-07-01T15:55:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload_time = "2025-07-01T15:55:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload_time = "2025-07-01T15:55:42.015Z" }, + { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload_time = "2025-07-01T15:55:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload_time = "2025-07-01T15:55:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload_time = "2025-07-01T15:55:47.098Z" }, + { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload_time = "2025-07-01T15:55:48.412Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload_time = "2025-07-01T15:55:49.816Z" }, + { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload_time = "2025-07-01T15:55:51.192Z" }, + { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload_time = "2025-07-01T15:55:52.541Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload_time = "2025-07-01T15:55:53.874Z" }, + { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload_time = "2025-07-01T15:55:55.167Z" }, ] [[package]] @@ -1923,35 +2535,35 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511 } +sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload_time = "2025-06-09T08:51:09.828Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570 }, + { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload_time = "2025-06-09T08:51:06.348Z" }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, ] [[package]] @@ -1962,54 +2574,139 @@ dependencies = [ { name = "click" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927 } +sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload_time = "2023-07-01T13:31:49.607Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649 }, + { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/84/5f4af978fff619706b8961accac84780a6d298d82a8873446f72edb4ead0/scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802", size = 7190445, upload_time = "2025-07-18T08:01:54.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/16/57f176585b35ed865f51b04117947fe20f130f78940c6477b6d66279c9c2/scikit_learn-1.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3cee419b49b5bbae8796ecd690f97aa412ef1674410c23fc3257c6b8b85b8087", size = 9260431, upload_time = "2025-07-18T08:01:22.77Z" }, + { url = "https://files.pythonhosted.org/packages/67/4e/899317092f5efcab0e9bc929e3391341cec8fb0e816c4789686770024580/scikit_learn-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2fd8b8d35817b0d9ebf0b576f7d5ffbbabdb55536b0655a8aaae629d7ffd2e1f", size = 8637191, upload_time = "2025-07-18T08:01:24.731Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1b/998312db6d361ded1dd56b457ada371a8d8d77ca2195a7d18fd8a1736f21/scikit_learn-1.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:588410fa19a96a69763202f1d6b7b91d5d7a5d73be36e189bc6396bfb355bd87", size = 9486346, upload_time = "2025-07-18T08:01:26.713Z" }, + { url = "https://files.pythonhosted.org/packages/ad/09/a2aa0b4e644e5c4ede7006748f24e72863ba2ae71897fecfd832afea01b4/scikit_learn-1.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3142f0abe1ad1d1c31a2ae987621e41f6b578144a911ff4ac94781a583adad7", size = 9290988, upload_time = "2025-07-18T08:01:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/15/fa/c61a787e35f05f17fc10523f567677ec4eeee5f95aa4798dbbbcd9625617/scikit_learn-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3ddd9092c1bd469acab337d87930067c87eac6bd544f8d5027430983f1e1ae88", size = 8735568, upload_time = "2025-07-18T08:01:30.936Z" }, + { url = "https://files.pythonhosted.org/packages/52/f8/e0533303f318a0f37b88300d21f79b6ac067188d4824f1047a37214ab718/scikit_learn-1.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae", size = 9213143, upload_time = "2025-07-18T08:01:32.942Z" }, + { url = "https://files.pythonhosted.org/packages/71/f3/f1df377d1bdfc3e3e2adc9c119c238b182293e6740df4cbeac6de2cc3e23/scikit_learn-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10", size = 8591977, upload_time = "2025-07-18T08:01:34.967Z" }, + { url = "https://files.pythonhosted.org/packages/99/72/c86a4cd867816350fe8dee13f30222340b9cd6b96173955819a5561810c5/scikit_learn-1.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309", size = 9436142, upload_time = "2025-07-18T08:01:37.397Z" }, + { url = "https://files.pythonhosted.org/packages/e8/66/277967b29bd297538dc7a6ecfb1a7dce751beabd0d7f7a2233be7a4f7832/scikit_learn-1.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43", size = 9282996, upload_time = "2025-07-18T08:01:39.721Z" }, + { url = "https://files.pythonhosted.org/packages/e2/47/9291cfa1db1dae9880420d1e07dbc7e8dd4a7cdbc42eaba22512e6bde958/scikit_learn-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11", size = 8707418, upload_time = "2025-07-18T08:01:42.124Z" }, + { url = "https://files.pythonhosted.org/packages/61/95/45726819beccdaa34d3362ea9b2ff9f2b5d3b8bf721bd632675870308ceb/scikit_learn-1.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae", size = 9561466, upload_time = "2025-07-18T08:01:44.195Z" }, + { url = "https://files.pythonhosted.org/packages/ee/1c/6f4b3344805de783d20a51eb24d4c9ad4b11a7f75c1801e6ec6d777361fd/scikit_learn-1.7.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c", size = 9040467, upload_time = "2025-07-18T08:01:46.671Z" }, + { url = "https://files.pythonhosted.org/packages/6f/80/abe18fe471af9f1d181904203d62697998b27d9b62124cd281d740ded2f9/scikit_learn-1.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e", size = 9532052, upload_time = "2025-07-18T08:01:48.676Z" }, + { url = "https://files.pythonhosted.org/packages/14/82/b21aa1e0c4cee7e74864d3a5a721ab8fcae5ca55033cb6263dca297ed35b/scikit_learn-1.7.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7", size = 9361575, upload_time = "2025-07-18T08:01:50.639Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/f4777fcd5627dc6695fa6b92179d0edb7a3ac1b91bcd9a1c7f64fa7ade23/scikit_learn-1.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5", size = 9277310, upload_time = "2025-07-18T08:01:52.547Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861, upload_time = "2025-07-27T16:33:30.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c", size = 36575194, upload_time = "2025-07-27T16:27:41.321Z" }, + { url = "https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04", size = 28594590, upload_time = "2025-07-27T16:27:49.204Z" }, + { url = "https://files.pythonhosted.org/packages/0e/37/9f65178edfcc629377ce9a64fc09baebea18c80a9e57ae09a52edf84880b/scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919", size = 20866458, upload_time = "2025-07-27T16:27:54.98Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7b/749a66766871ea4cb1d1ea10f27004db63023074c22abed51f22f09770e0/scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921", size = 23539318, upload_time = "2025-07-27T16:28:01.604Z" }, + { url = "https://files.pythonhosted.org/packages/c4/db/8d4afec60eb833a666434d4541a3151eedbf2494ea6d4d468cbe877f00cd/scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725", size = 33292899, upload_time = "2025-07-27T16:28:09.147Z" }, + { url = "https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618", size = 35162637, upload_time = "2025-07-27T16:28:17.535Z" }, + { url = "https://files.pythonhosted.org/packages/b6/49/0648665f9c29fdaca4c679182eb972935b3b4f5ace41d323c32352f29816/scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d", size = 35490507, upload_time = "2025-07-27T16:28:25.705Z" }, + { url = "https://files.pythonhosted.org/packages/62/8f/66cbb9d6bbb18d8c658f774904f42a92078707a7c71e5347e8bf2f52bb89/scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119", size = 37923998, upload_time = "2025-07-27T16:28:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a", size = 38508060, upload_time = "2025-07-27T16:28:43.242Z" }, + { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717, upload_time = "2025-07-27T16:28:51.706Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009, upload_time = "2025-07-27T16:28:57.017Z" }, + { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942, upload_time = "2025-07-27T16:29:01.152Z" }, + { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507, upload_time = "2025-07-27T16:29:05.202Z" }, + { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040, upload_time = "2025-07-27T16:29:10.201Z" }, + { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096, upload_time = "2025-07-27T16:29:17.091Z" }, + { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328, upload_time = "2025-07-27T16:29:22.928Z" }, + { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921, upload_time = "2025-07-27T16:29:29.108Z" }, + { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462, upload_time = "2025-07-27T16:30:24.078Z" }, + { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832, upload_time = "2025-07-27T16:29:35.057Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084, upload_time = "2025-07-27T16:29:40.201Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098, upload_time = "2025-07-27T16:29:44.295Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858, upload_time = "2025-07-27T16:29:48.784Z" }, + { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311, upload_time = "2025-07-27T16:29:54.164Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542, upload_time = "2025-07-27T16:30:00.249Z" }, + { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665, upload_time = "2025-07-27T16:30:05.916Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210, upload_time = "2025-07-27T16:30:11.655Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661, upload_time = "2025-07-27T16:30:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/81/ea/84d481a5237ed223bd3d32d6e82d7a6a96e34756492666c260cef16011d1/scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318", size = 36525921, upload_time = "2025-07-27T16:30:30.081Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9f/d9edbdeff9f3a664807ae3aea383e10afaa247e8e6255e6d2aa4515e8863/scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc", size = 28564152, upload_time = "2025-07-27T16:30:35.336Z" }, + { url = "https://files.pythonhosted.org/packages/3b/95/8125bcb1fe04bc267d103e76516243e8d5e11229e6b306bda1024a5423d1/scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8", size = 20836028, upload_time = "2025-07-27T16:30:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/77/9c/bf92e215701fc70bbcd3d14d86337cf56a9b912a804b9c776a269524a9e9/scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e", size = 23489666, upload_time = "2025-07-27T16:30:43.663Z" }, + { url = "https://files.pythonhosted.org/packages/5e/00/5e941d397d9adac41b02839011594620d54d99488d1be5be755c00cde9ee/scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0", size = 33358318, upload_time = "2025-07-27T16:30:48.982Z" }, + { url = "https://files.pythonhosted.org/packages/0e/87/8db3aa10dde6e3e8e7eb0133f24baa011377d543f5b19c71469cf2648026/scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b", size = 35185724, upload_time = "2025-07-27T16:30:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/89/b4/6ab9ae443216807622bcff02690262d8184078ea467efee2f8c93288a3b1/scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731", size = 35554335, upload_time = "2025-07-27T16:30:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9a/d0e9dc03c5269a1afb60661118296a32ed5d2c24298af61b676c11e05e56/scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3", size = 37960310, upload_time = "2025-07-27T16:31:06.151Z" }, + { url = "https://files.pythonhosted.org/packages/5e/00/c8f3130a50521a7977874817ca89e0599b1b4ee8e938bad8ae798a0e1f0d/scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19", size = 39319239, upload_time = "2025-07-27T16:31:59.942Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f2/1ca3eda54c3a7e4c92f6acef7db7b3a057deb135540d23aa6343ef8ad333/scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65", size = 36939460, upload_time = "2025-07-27T16:31:11.865Z" }, + { url = "https://files.pythonhosted.org/packages/80/30/98c2840b293a132400c0940bb9e140171dcb8189588619048f42b2ce7b4f/scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2", size = 29093322, upload_time = "2025-07-27T16:31:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e6/1e6e006e850622cf2a039b62d1a6ddc4497d4851e58b68008526f04a9a00/scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d", size = 21365329, upload_time = "2025-07-27T16:31:21.188Z" }, + { url = "https://files.pythonhosted.org/packages/8e/02/72a5aa5b820589dda9a25e329ca752842bfbbaf635e36bc7065a9b42216e/scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695", size = 23897544, upload_time = "2025-07-27T16:31:25.408Z" }, + { url = "https://files.pythonhosted.org/packages/2b/dc/7122d806a6f9eb8a33532982234bed91f90272e990f414f2830cfe656e0b/scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86", size = 33442112, upload_time = "2025-07-27T16:31:30.62Z" }, + { url = "https://files.pythonhosted.org/packages/24/39/e383af23564daa1021a5b3afbe0d8d6a68ec639b943661841f44ac92de85/scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff", size = 35286594, upload_time = "2025-07-27T16:31:36.112Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/1a0b0aff40c3056d955f38b0df5d178350c3d74734ec54f9c68d23910be5/scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4", size = 35665080, upload_time = "2025-07-27T16:31:42.025Z" }, + { url = "https://files.pythonhosted.org/packages/64/df/ce88803e9ed6e27fe9b9abefa157cf2c80e4fa527cf17ee14be41f790ad4/scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3", size = 38050306, upload_time = "2025-07-27T16:31:48.109Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6c/a76329897a7cae4937d403e623aa6aaea616a0bb5b36588f0b9d1c9a3739/scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998", size = 39427705, upload_time = "2025-07-27T16:31:53.96Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "simpleeval" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358 } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762 }, + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, ] [[package]] @@ -2021,18 +2718,18 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, ] [[package]] name = "structlog" version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138 } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720 }, + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, ] [[package]] @@ -2044,18 +2741,18 @@ dependencies = [ { name = "pyyaml" }, { name = "xlsxwriter" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564 } +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860 }, + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, ] [[package]] @@ -2084,13 +2781,26 @@ dev = [ { name = "technologydata" }, ] docs = [ + { name = "cairosvg" }, + { name = "gurobipy" }, + { name = "mkdocs-argref-plugin" }, { name = "mkdocs-autolinks-plugin" }, + { name = "mkdocs-ezlinks-plugin" }, + { name = "mkdocs-git-committers-plugin" }, { name = "mkdocs-git-revision-date-localized-plugin" }, + { name = "mkdocs-jupyter" }, { name = "mkdocs-material" }, { name = "mkdocs-minify-plugin" }, { name = "mkdocs-open-in-new-tab" }, + { name = "mkdocs-redirects" }, + { name = "mkdocs-table-reader-plugin" }, + { name = "mkdocs-video" }, { name = "mkdocstrings" }, { name = "mkdocstrings-python" }, + { name = "openpyxl" }, + { name = "pillow" }, + { name = "python-calamine" }, + { name = "tsam" }, ] [package.metadata] @@ -2117,68 +2827,132 @@ dev = [ { name = "technologydata", editable = "." }, ] docs = [ + { name = "cairosvg", specifier = ">=2.8.2" }, + { name = "gurobipy", specifier = ">=12.0.3" }, + { name = "mkdocs-argref-plugin", specifier = ">=0.5.0" }, { name = "mkdocs-autolinks-plugin", specifier = ">=0.7.1" }, + { name = "mkdocs-ezlinks-plugin", specifier = ">=0.1.14" }, + { name = "mkdocs-git-committers-plugin", specifier = ">=0.2.3" }, { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.4.7" }, + { name = "mkdocs-jupyter", specifier = ">=0.25.1" }, { name = "mkdocs-material", specifier = ">=9.6.14" }, { name = "mkdocs-minify-plugin", specifier = ">=0.8.0" }, { name = "mkdocs-open-in-new-tab", specifier = ">=1.0.8" }, + { name = "mkdocs-redirects", specifier = ">=1.2.2" }, + { name = "mkdocs-table-reader-plugin", specifier = ">=3.1.0" }, + { name = "mkdocs-video", specifier = ">=1.5.0" }, { name = "mkdocstrings", specifier = ">=0.29.1" }, { name = "mkdocstrings-python", specifier = ">=1.16.11" }, + { name = "openpyxl", specifier = ">=3.1.5" }, + { name = "pillow", specifier = ">=11.3.0" }, + { name = "python-calamine", specifier = ">=0.4.0" }, + { name = "tsam", specifier = ">=2.3.9" }, ] [[package]] name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload_time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload_time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload_time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload_time = "2024-10-24T14:58:28.029Z" }, ] [[package]] name = "tomlkit" version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload_time = "2025-06-05T07:13:44.947Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload_time = "2025-06-05T07:13:43.546Z" }, ] [[package]] name = "tornado" version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload_time = "2025-05-22T18:15:38.788Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, - { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, - { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, - { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, - { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, - { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, - { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, - { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, - { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, - { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, - { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload_time = "2025-05-22T18:15:20.862Z" }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload_time = "2025-05-22T18:15:22.591Z" }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload_time = "2025-05-22T18:15:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload_time = "2025-05-22T18:15:25.735Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload_time = "2025-05-22T18:15:27.499Z" }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload_time = "2025-05-22T18:15:29.299Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload_time = "2025-05-22T18:15:31.038Z" }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload_time = "2025-05-22T18:15:32.426Z" }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload_time = "2025-05-22T18:15:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload_time = "2025-05-22T18:15:36.1Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "tsam" +version = "2.3.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "highspy" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyomo" }, + { name = "scikit-learn" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/67/c69f8c46fd46e01480ca10280ab612253255a729a850e2d61fdf0ea08258/tsam-2.3.9.tar.gz", hash = "sha256:1f219eef05788d199af1ff61bd5a3d9217a26f9279988b1ef4b7d5af2757ed15", size = 223755, upload_time = "2025-06-16T07:30:03.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/e7/5c072b990bddccc4a78a186d641e50257993c50658cddc0d4bf300acd1e1/tsam-2.3.9-py3-none-any.whl", hash = "sha256:edcc4febb9e1dacc028bc819d710974ede8f563467c3d235a250f46416f93a1b", size = 36816, upload_time = "2025-06-16T07:30:01.562Z" }, ] [[package]] @@ -2191,18 +2965,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625 } +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload_time = "2025-05-26T14:30:31.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317 }, + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload_time = "2025-05-26T14:30:30.523Z" }, ] [[package]] name = "typing-extensions" version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload_time = "2025-07-04T13:28:34.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, ] [[package]] @@ -2212,45 +2986,45 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, ] [[package]] name = "unidecode" version = "1.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149 } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837 }, + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, ] [[package]] name = "validators" version = "0.35.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399 } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712 }, + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, ] [[package]] @@ -2262,33 +3036,33 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316 } +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload_time = "2025-05-08T17:58:23.811Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982 }, + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload_time = "2025-05-08T17:58:21.15Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, ] [[package]] @@ -2300,79 +3074,88 @@ dependencies = [ { name = "requests" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385 }, + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload_time = "2017-04-05T20:21:34.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload_time = "2017-04-05T20:21:32.581Z" }, ] [[package]] name = "wheel" version = "0.45.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494 }, + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, ] [[package]] name = "win32-setctime" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, ] [[package]] name = "xlrd" version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167 } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555 }, + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, ] [[package]] name = "xlrd3" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847 } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268 }, + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, ] [[package]] name = "xlsx2csv" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390 } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904 }, + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, ] [[package]] name = "xlsxwriter" version = "3.2.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306, upload_time = "2025-06-17T08:59:14.619Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347 }, + { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347, upload_time = "2025-06-17T08:59:13.453Z" }, ] [[package]] name = "xlwt" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929 } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981 }, + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, ] From 938bf33a3c14990cc956041ef68c9e88fb53517c Mon Sep 17 00:00:00 2001 From: euronion Date: Tue, 23 Sep 2025 13:02:24 +0200 Subject: [PATCH 16/81] doc: Remove copy-pasta mistake from pypsa-docs --- mkdocs.yaml | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index c20fb6bc..4304e194 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -41,11 +41,11 @@ theme: - navigation.tabs - navigation.tabs.sticky - navigation.sections - - navigation.tracking # Anchor tracking - - navigation.indexes # Section indexes + - navigation.tracking # Anchor tracking + - navigation.indexes # Section indexes - navigation.path - - navigation.top # Back to top button - # - navigation.foot + - navigation.top # Back to top button + # - navigation.foot - header.autohide - content.action.edit - content.action.view @@ -79,7 +79,7 @@ extra_javascript: - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js markdown_extensions: -# Callouts/ Admonitions + # Callouts/ Admonitions - admonition - pymdownx.details - pymdownx.superfences: @@ -89,32 +89,32 @@ markdown_extensions: format: !!python/name:pymdownx.superfences.fence_code_format - pymdownx.arithmatex: generic: true -# Footnotes + # Footnotes - footnotes -# Tabbed content + # Tabbed content - pymdownx.tabbed: - alternate_style: true # Abbreviations + alternate_style: true # Abbreviations - pymdownx.snippets: auto_append: - includes/abbreviations.md - abbr - attr_list - md_in_html - # Emojis + # Emojis - pymdownx.emoji: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:material.extensions.emoji.to_svg - # Toctree with permalinks + # Toctree with permalinks + - toc: title: On this page permalink: true toc_depth: 3 - # Grids + # Grids - md_in_html - pymdownx.caret - pymdownx.tilde - plugins: - search - tags @@ -125,10 +125,6 @@ plugins: type: timeago timezone: Europe/Berlin enable_creation_date: true -- git-committers: - repository: PyPSA/PyPSA - branch: v1-docs # TODO: Change to master before merging - token: !!python/object/apply:os.getenv ["MKDOCS_GIT_COMMITTERS_APIKEY"] - argref: autolinks: - reference_prefix: ":octicons-git-pull-request-16:" @@ -138,7 +134,7 @@ plugins: font_family: Overpass background_color: "#292F36" -# Docstring generation + # Docstring generation - mkdocstrings: enabled: true default_handler: python @@ -167,7 +163,6 @@ plugins: show_if_no_docstring: true show_inheritance_diagram: true - hooks: - docs/assets/overrides/hooks/shortcodes.py From 1c0d014de4829c4010a9187e27af8edbe2dc46de Mon Sep 17 00:00:00 2001 From: euronion Date: Tue, 23 Sep 2025 13:02:37 +0200 Subject: [PATCH 17/81] doc: Use uv for RTD building --- .readthedocs.yaml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 0906dd5c..bc7e897f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -6,19 +6,16 @@ build: python: "3.13" jobs: pre_system_dependencies: - - git fetch --unshallow # Needed to get version tags - pre_install: - - pip install mkdocs-material + - git fetch --unshallow # Needed to get version tags + pre_create_environment: + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest + create_environment: + - uv venv "${READTHEDOCS_VIRTUALENV_PATH}" + install: + - UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --frozen --group docs mkdocs: configuration: mkdocs.yaml # fail_on_warning: true # TODO: Enable - -python: - install: - - method: pip - path: . - extra_requirements: - - docs - - dev - - cartopy From 899d8fa35505d3e7ed0ff6f6ea207f537df3d631 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Wed, 24 Sep 2025 10:30:24 +0200 Subject: [PATCH 18/81] code: modify target branch for ci triggering (#52) --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d177761d..b3364618 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,9 +5,9 @@ name: Technologydata prototype CI on: push: - branches: [ai-prototype] + branches: [prototype-2] pull_request: - branches: [ai-prototype] + branches: [prototype-2] jobs: test: From 6fc7dd4834358ea695d4db62c817a04e1f0ce310 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:34:56 +0200 Subject: [PATCH 19/81] Issue 42 harmonize units (#51) * code: ensure LHV and HHV have same units * code: add pre-commit changes * test: fix unit test * test: update unit test * test:ton to metric_ton * update doc * Update docs/user_guide/parameter.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --------- Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- docs/user_guide/parameter.md | 2 +- src/technologydata/parameter.py | 24 ++++++++++++------------ test/test_parameter.py | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index 0b1576f7..bf778a2f 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -13,7 +13,7 @@ The `Parameter` class in `technologydata` encapsulates a value, its unit, proven ## Features -- **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). +- **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). The default `pint` units definition file is available [here](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt) for reference. Be mindful of false unit-friends, e.g. `t = metric_ton = tonne != ton = US_ton` - **Currency Unit Convention**: Currency units must follow the pattern `XYZ_YYYY`, where `XYZ` is the 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code (e.g., `USD`, `EUR`, `CNY`) and `YYYY` is the 4-digit year (e.g., `USD_2020`). This allows for both currency and inflation adjustment. - **Carrier and Heating Value**: Optionally specify an energy carrier (e.g., `H2`) and a heating value type (`LHV` or `HHV`). - **Provenance and Notes**: Track the origin of the data and any additional notes. diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index f3748013..f3264133 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -23,16 +23,6 @@ import technologydata from technologydata.source_collection import SourceCollection -# from technologydata.utils.units import ( -# CURRENCY_UNIT_PATTERN, -# creg, -# extract_currency_units, -# get_conversion_rate, -# get_iso3_from_currency_code, -# hvreg, -# ureg, -# ) - logger = logging.getLogger(__name__) @@ -324,15 +314,25 @@ def change_heating_value(self, to_heating_value: str) -> Self: from technologydata.constants import EnergyDensityHHV, EnergyDensityLHV # Create a dictionary of heating value ratios based on energy densities + # The units of heating values are harmonized to "hv_units". + # hv_units is the units attribute of the first element of EnergyDensityLHV hv_ratios = dict() + + # Access the key of the first element of the EnergyDensityLHV dictionary + first_pair_key = next(iter(EnergyDensityLHV)) + + # Get the units attribute of the first element of the EnergyDensityLHV dictionary + hv_units = str(EnergyDensityLHV[first_pair_key].units) + lhvs = { - str(technologydata.creg.get_dimensionality(k)): v + str(technologydata.creg.get_dimensionality(k)): v.to(hv_units) for k, v in EnergyDensityLHV.items() } hhvs = { - str(technologydata.creg.get_dimensionality(k)): v + str(technologydata.creg.get_dimensionality(k)): v.to(hv_units) for k, v in EnergyDensityHHV.items() } + for dimension in self._pint_carrier.dimensionality.keys(): if dimension in lhvs and dimension in hhvs: hv_ratios[dimension] = ( diff --git a/test/test_parameter.py b/test/test_parameter.py index 99ed45e2..e9378e53 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -12,6 +12,7 @@ import pytest import technologydata +from technologydata.constants import EnergyDensityLHV # from technologydata.utils.units import extract_currency_units, ureg @@ -689,6 +690,24 @@ def test_change_heating_value_ch4_hhv_to_lhv(self) -> None: assert p2.carrier == "methane" assert p2.units == "kilowatt_hour" + def test_change_heating_value_ch4_hhv_to_lhv_adapt_units(self) -> None: + """Test HHV to LHV conversion for CH4, where HHV has a different unit than LHV.""" + p = technologydata.Parameter( + magnitude=11.1, + units="kilowatt_hour", + carrier="methane", + heating_value="higher_heating_value", + ) + # Note: metric_ton = 1e3 * kilogram = t = tonne + # Note: ton = 2e3 * pound = _ = short_ton + EnergyDensityLHV["methane"].units = "MJ/metric_ton" + EnergyDensityLHV["methane"].magnitude = 50000 + p2 = p.change_heating_value("lower_heating_value") + assert p2.units == "kilowatt_hour" + assert pytest.approx(p2.magnitude) == 10.0 + assert p2.heating_value == "lower_heating_value" + assert p2.carrier == "methane" + def test_change_heating_value_no_carrier_in_units(self) -> None: """Test conversion when carrier does not appear in units (should treat as 1 appearance).""" p = technologydata.Parameter( From 68169979cce71d9ccb0d413b8d4dd0014d596c2a Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:40:20 +0200 Subject: [PATCH 20/81] Turn Source.store_in_wayback into a private method (#63) * code: store_in_wayback private * doc: update class-diagram.puml --- docs/user_guide/class-diagram.puml | 4 ++-- src/technologydata/source.py | 8 ++++---- test/test_source.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/user_guide/class-diagram.puml b/docs/user_guide/class-diagram.puml index 403c59d3..0412cafc 100644 --- a/docs/user_guide/class-diagram.puml +++ b/docs/user_guide/class-diagram.puml @@ -14,7 +14,7 @@ class Source { - url_date_archive: str + ensure_in_wayback() - + store_in_wayback() + + _store_in_wayback() + retrieve_from_wayback() + _get_save_path() + _get_content_type() @@ -24,7 +24,7 @@ class Source { + __str__(other) } -note right of Source::store_in_wayback +note right of Source::_store_in_wayback Stores the source in the Internet Archive's Wayback Machine, to keep it accessible in the future. end note diff --git a/src/technologydata/source.py b/src/technologydata/source.py index c7e3643a..c18a76c8 100644 --- a/src/technologydata/source.py +++ b/src/technologydata/source.py @@ -8,7 +8,7 @@ Examples -------- >>> src = Source(title="Example Source", authors="The Authors") ->>> src.store_in_wayback() +>>> src._store_in_wayback() >>> src.retrieve_from_wayback() """ @@ -172,7 +172,7 @@ def ensure_in_wayback(self) -> None: ) if self.url_archive is None and self.url_date_archive is None: - archived_info = self.store_in_wayback(self.url) + archived_info = self._store_in_wayback(self.url) if archived_info is not None: archived_url, new_capture_flag, timestamp = archived_info if new_capture_flag: @@ -187,7 +187,7 @@ def ensure_in_wayback(self) -> None: self.url_archive = archived_url @staticmethod - def store_in_wayback( + def _store_in_wayback( url_to_archive: str, ) -> tuple[Any, bool | None, str | None] | None: """ @@ -215,7 +215,7 @@ def store_in_wayback( -------- >>> from technologydata import Source >>> some_url = "some_url" - >>> archived_info = Source.store_in_wayback(some_url) + >>> archived_info = Source._store_in_wayback(some_url) """ archive_url = savepagenow.capture_or_cache(url_to_archive) diff --git a/test/test_source.py b/test/test_source.py index 5522cf13..05985510 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -158,7 +158,7 @@ def test_store_in_wayback(self) -> None: url_to_archive = ( "https://www.engineeringtoolbox.com/co2-emission-fuels-d_1085.html" ) - archived_info = technologydata.Source.store_in_wayback(url_to_archive) + archived_info = technologydata.Source._store_in_wayback(url_to_archive) # Check if archived_info is None assert archived_info is not None, "archived_info should not be None" From 3f1027a3717d224141ab3cf1647bf74313298926 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 10 Oct 2025 18:15:31 +0200 Subject: [PATCH 21/81] update from_json and to_json methods for TechnologyCollection and SourceCollection (#62) * code: update tech json file and from_json * code: new version of from_json * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update tests --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/user_guide/class-diagram.puml | 3 - src/technologydata/parameter.py | 44 +-- src/technologydata/source_collection.py | 47 ++- src/technologydata/technology.py | 44 --- src/technologydata/technology_collection.py | 24 +- .../sources.json | 0 .../technologies.json | 302 ++++++++++++++++++ .../technologies.json | 266 --------------- .../technologies.json | 156 --------- test/test_datapackage.py | 2 +- test/test_source_collection.py | 26 +- test/test_technology_collection.py | 38 ++- 12 files changed, 388 insertions(+), 564 deletions(-) rename test/test_data/{solar_photovoltaics_example_03 => solar_photovoltaics_example}/sources.json (100%) create mode 100644 test/test_data/solar_photovoltaics_example/technologies.json delete mode 100644 test/test_data/solar_photovoltaics_example_03/technologies.json delete mode 100644 test/test_data/solar_photovoltaics_example_04/technologies.json diff --git a/docs/user_guide/class-diagram.puml b/docs/user_guide/class-diagram.puml index 0412cafc..a45a6915 100644 --- a/docs/user_guide/class-diagram.puml +++ b/docs/user_guide/class-diagram.puml @@ -50,7 +50,6 @@ class Parameter { + change_currency() + change_heating_value() + to() - + from_dict(): Parameter + __add__(other: Parameter) + __sub__(other: Parameter) + __mul__(other: Parameter) @@ -87,7 +86,6 @@ class Technology { + __getitem__() + __setitem__() - + from_dict(): Technology + adjust_currency(): Technology // or inplace + adjust_region(): Technology // or inplace + adjust_scale(): Technology // or inplace @@ -133,7 +131,6 @@ end note class TechnologyCollection { - technologies: Iterable + get(**criteria): Technology | TechnologyCollection | None - + from_dict(): TechnologyCollection + to_json(): str + to_csv(): str + to_dataframe(): pd.DataFrame diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index f3264133..233a814a 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -15,7 +15,7 @@ """ import logging -from typing import Annotated, Any, Self +from typing import Annotated, Self import pint from pydantic import BaseModel, Field, PrivateAttr @@ -670,45 +670,3 @@ def __pow__(self, exponent: float | int) -> Self: note=self.note, sources=self.sources, ) - - @classmethod - def from_dict(cls, data: dict[str, Any]) -> Self: - """ - Create an instance of the class from a dictionary. - - Parameters - ---------- - cls : type - The class to instantiate. - data : dict - A dictionary containing the data to initialize the class instance. Expected keys include: - - "magnitude" - - "units" - - "carrier" - - "heating_value" - - "provenance" - - "note" - - "sources" (list): A list of source data dictionaries, to be converted into a SourceCollection. - - Returns - ------- - Parameter - An instance of the class initialized with the provided data. - - Notes - ----- - This method converts the "sources" list into a `SourceCollection` using `SourceCollection.from_json()`. - - """ - # Convert sources list into SourceCollection - sources_data = data.get("sources", []) - sources = SourceCollection.from_json(from_str=sources_data) - return cls( - magnitude=data.get("magnitude"), - units=data.get("units"), - carrier=data.get("carrier"), - heating_value=data.get("heating_value"), - provenance=data.get("provenance"), - note=data.get("note"), - sources=sources, - ) diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index 31c4e7b4..f989f291 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -8,11 +8,13 @@ import json import pathlib import re +import typing from collections.abc import Iterator -from typing import Annotated, Any, Self +from typing import Annotated, Self import pandas import pydantic +import pydantic_core from technologydata.source import Source @@ -206,44 +208,31 @@ def to_json( @classmethod def from_json( cls, - file_path: pathlib.Path | str | None = None, - from_str: list[dict[str, Any]] | None = None, + file_path: pathlib.Path | str, ) -> Self: """ Import the SourceCollection from a JSON file. Parameters ---------- - file_path : Optional[pathlib.Path | str] + file_path : pathlib.Path | str The path to the JSON file to be imported. - from_str : Optional[list] - The list of dictionaries with Source fields. """ - if file_path is None and from_str is None: - raise ValueError( - "Both file_path and from_str are None. One must be provided." - ) + if isinstance(file_path, (pathlib.Path | str)): + file_path = pathlib.Path(file_path) + else: + raise TypeError("file_path must be a pathlib.Path or str") json_data = None # Load data from file if file_path is provided - if file_path is not None: - if not isinstance(file_path, (pathlib.Path | str)): - raise TypeError( - f"file_path must be a pathlib.Path or str, but got {type(file_path)}" - ) - path = pathlib.Path(file_path) - with path.open(encoding="utf-8") as jsonfile: - json_data = json.load(jsonfile) - - # Override json_data if from_str is provided - if from_str is not None: - if not isinstance(from_str, list): - raise TypeError(f"from_str must be a list, but got {type(from_str)}") - json_data = {"sources": [Source(**source) for source in from_str]} - - if json_data is None: - raise ValueError("No data to load. Provide either a file_path or from_str.") - - return cls(**json_data) + with open(file_path, encoding="utf-8") as jsonfile: + json_data = jsonfile.read() + + # pydantic_core.from_json return Any. Therefore, typing.cast makes sure that + # the output is indeed a TechnologyCollection + return typing.cast( + SourceCollection, + cls.model_validate(pydantic_core.from_json(json_data, allow_partial=True)), + ) diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 771b0e7b..c4655a2e 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -164,47 +164,3 @@ def adjust_scale(self, scaling_factor: float) -> Self: """ # Placeholder: implement scaling logic return self - - @classmethod - def from_dict(cls, data: dict[str, Any]) -> Self: - """ - Create an instance of the class from a dictionary. - - Parameters - ---------- - cls : type - The class to instantiate. - data : dict - A dictionary containing the data to initialize the class instance. - Expected keys include: - - "region" (str): The region associated with the instance. - - "case" (str): The case identifier. - - "year" (int): The year value. - - "name" (str): The name of the instance. - - "detailed_technology" (str): Details about the technology. - - "parameters" (dict): A dictionary where each key maps to a parameter data - dictionary, which will be converted to a Parameter object. - - Returns - ------- - instance : cls - An instance of the class initialized with the provided data. - - Notes - ----- - This method processes the "parameters" field in the input data by converting each - parameter dictionary into a Parameter object using `Parameter.from_dict()`. It then - constructs and returns an instance of the class with all the provided attributes. - - """ - params = {} - for key, param_data in data.get("parameters", {}).items(): - params[key] = Parameter.from_dict(param_data) - return cls( - region=data["region"], - case=data["case"], - year=data["year"], - name=data["name"], - detailed_technology=data["detailed_technology"], - parameters=params, - ) diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index 85dd3f61..cb66361f 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -8,11 +8,13 @@ import json import pathlib import re +import typing from collections.abc import Iterator from typing import Annotated, Self import pandas import pydantic +import pydantic_core from technologydata.technology import Technology @@ -219,20 +221,18 @@ def from_json(cls, file_path: pathlib.Path | str) -> Self: TypeError If `file_path` is not a pathlib.Path or str. - Notes - ----- - This method reads the JSON data from the specified file, creates `Technology` objects - for each item in the JSON list using `Technology.from_dict()`, and returns a new - `TechnologyCollection` containing these objects. - """ - if isinstance(file_path, pathlib.Path | str): + if isinstance(file_path, (pathlib.Path | str)): file_path = pathlib.Path(file_path) else: raise TypeError("file_path must be a pathlib.Path or str") + with open(file_path, encoding="utf-8") as jsonfile: - json_data = json.load(jsonfile) - techs = [] - for item in json_data: - techs.append(Technology.from_dict(item)) - return cls(technologies=techs) + json_data = jsonfile.read() + + # pydantic_core.from_json return Any. Therefore, typing.cast makes sure that + # the output is indeed a TechnologyCollection + return typing.cast( + TechnologyCollection, + cls.model_validate(pydantic_core.from_json(json_data, allow_partial=True)), + ) diff --git a/test/test_data/solar_photovoltaics_example_03/sources.json b/test/test_data/solar_photovoltaics_example/sources.json similarity index 100% rename from test/test_data/solar_photovoltaics_example_03/sources.json rename to test/test_data/solar_photovoltaics_example/sources.json diff --git a/test/test_data/solar_photovoltaics_example/technologies.json b/test/test_data/solar_photovoltaics_example/technologies.json new file mode 100644 index 00000000..089e7901 --- /dev/null +++ b/test/test_data/solar_photovoltaics_example/technologies.json @@ -0,0 +1,302 @@ +{ + "technologies": [ + { + "name": "Solar photovoltaics", + "region": "DEU", + "year": 2022, + "parameters": { + "capacity": { + "magnitude": 1.0, + "units": "megawatt", + "carrier": "electricity", + "heating_value": null, + "provenance": "Model calculation", + "note": "Average capacity factor of 22% assumed", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "investment": { + "magnitude": 500, + "units": "EUR_2022 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": "Industry report", + "note": "Average overnight cost", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "specific_investment": { + "magnitude": 0.95, + "units": "EUR_2022 / watt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "lifetime": { + "magnitude": 30, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "wacc": { + "magnitude": 5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + } + }, + "case": "example-scenario", + "detailed_technology": "Si-HC" + }, + { + "name": "Solar photovoltaics", + "region": "DEU", + "year": 2022, + "parameters": { + "capacity": { + "magnitude": 3.0, + "units": "megawatt", + "carrier": "electricity", + "heating_value": null, + "provenance": "Model calculation", + "note": "Average capacity factor of 25% assumed", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "investment": { + "magnitude": 350, + "units": "EUR_2022 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": "Industry report", + "note": "Average overnight cost", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "specific_investment": { + "magnitude": 0.92, + "units": "EUR_2022 / watt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": "Derived", + "note": "Calculated from investment/capacity", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "lifetime": { + "magnitude": 40, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Manufacturer specification", + "note": "With performance degradation guarantee", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + }, + "wacc": { + "magnitude": 2, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Financial analysis", + "note": "Nominal weighted average cost of capital", + "sources": { + "sources": [ + { + "title": "atb_nrel", + "authors": "NREL/ATB", + "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "url_date": "2025-05-22 15:08:02", + "url_date_archive": "2025-05-22 15:08:02" + }, + { + "title": "tech_data_generation", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/3273/download", + "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "url_date": "2025-05-06 16:02:04", + "url_date_archive": "2025-05-06 16:02:04" + } + ] + } + } + }, + "case": "example-project", + "detailed_technology": "Si-HC" + } + ] +} diff --git a/test/test_data/solar_photovoltaics_example_03/technologies.json b/test/test_data/solar_photovoltaics_example_03/technologies.json deleted file mode 100644 index f8acfc7d..00000000 --- a/test/test_data/solar_photovoltaics_example_03/technologies.json +++ /dev/null @@ -1,266 +0,0 @@ -[ - { - "region": "DEU", - "case": "example-scenario", - "year": 2022, - "name": "Solar photovoltaics", - "detailed_technology": "Si-HC", - "parameters": { - "capacity": { - "magnitude": 1.0, - "units": "MW", - "carrier": "electricity", - "provenance": "Model calculation", - "note": "Average capacity factor of 22% assumed", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "investment": { - "magnitude": 500, - "units": "EUR_2022/kW", - "carrier": "1/electricity", - "provenance": "Industry report", - "note": "Average overnight cost", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "specific_investment": { - "magnitude": 0.95, - "units": "EUR_2022/W", - "carrier": "1/electricity", - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "lifetime": { - "magnitude": 30, - "units": "years", - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "wacc": { - "magnitude": 5, - "units": "%", - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - } - } - }, - { - "region": "DEU", - "case": "example-project", - "year": 2022, - "name": "Solar photovoltaics", - "detailed_technology": "Si-HC", - "parameters": { - "capacity": { - "magnitude": 1.0, - "units": "MW", - "carrier": "electricity", - "provenance": "Model calculation", - "note": "Average capacity factor of 25% assumed", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - } - }, - "investment": { - "magnitude": 350, - "units": "EUR_2022/kW", - "carrier": "1/electricity", - "provenance": "Industry report", - "note": "Average overnight cost for another tech", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "specific_investment": { - "magnitude": 0.95, - "units": "EUR_2022/W", - "carrier": "1/electricity", - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "lifetime": { - "magnitude": 30, - "units": "years", - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - }, - "wacc": { - "magnitude": 5, - "units": "%", - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "atb_nrel", - "authors": "NREL/ATB", - "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "url_date": "2025-05-22 15:08:02", - "url_date_archive": "2025-05-22 15:08:02" - }, - { - "title": "tech_data_generation", - "authors": "Danish Energy Agency", - "url": "https://ens.dk/media/3273/download", - "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "url_date": "2025-05-06 16:02:04", - "url_date_archive": "2025-05-06 16:02:04" - } - ] - } - } -] diff --git a/test/test_data/solar_photovoltaics_example_04/technologies.json b/test/test_data/solar_photovoltaics_example_04/technologies.json deleted file mode 100644 index dfa7eb50..00000000 --- a/test/test_data/solar_photovoltaics_example_04/technologies.json +++ /dev/null @@ -1,156 +0,0 @@ -[ - { - "region": "DEU", - "case": "example-scenario", - "year": 2022, - "name": "Solar photovoltaics", - "detailed_technology": "Si-HC", - "parameters": { - "capacity": { - "magnitude": 1, - "units": "MW", - "carrier": "electricity", - "provenance": "Model calculation", - "note": "Average capacity factor of 22% assumed", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "investment": { - "magnitude": 500, - "units": "EUR_2022/kW", - "carrier": "1/electricity", - "provenance": "Industry report", - "note": "Average overnight cost", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "specific_investment": { - "magnitude": 0.95, - "units": "EUR_2022/W", - "carrier": "1/electricity", - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "lifetime": { - "magnitude": 30, - "units": "years", - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "wacc": { - "magnitude": 5, - "units": "%", - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - } - } - }, - { - "region": "DEU", - "case": "example-project", - "year": 2022, - "name": "Solar photovoltaics", - "detailed_technology": "Si-HC", - "parameters": { - "capacity": { - "magnitude": 1.0, - "units": "MW", - "carrier": "electricity", - "provenance": "Model calculation", - "note": "Average capacity factor of 25% assumed", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "investment": { - "magnitude": 350, - "units": "EUR_2022/kW", - "carrier": "1/electricity", - "provenance": "Industry report", - "note": "Average overnight cost for another tech", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "specific_investment": { - "magnitude": 0.95, - "units": "EUR_2022/W", - "carrier": "1/electricity", - "provenance": "Derived", - "note": "Calculated from investment/capacity", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "lifetime": { - "magnitude": 30, - "units": "years", - "provenance": "Manufacturer specification", - "note": "With performance degradation guarantee", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - }, - "wacc": { - "magnitude": 5, - "units": "%", - "provenance": "Financial analysis", - "note": "Nominal weighted average cost of capital", - "sources": [ - { - "title": "example04", - "authors": "Open Energy Transition gGmbH", - "url": "https://openenergytransition.org/outputs.html" - } - ] - } - } - } -] diff --git a/test/test_datapackage.py b/test/test_datapackage.py index d1611fe9..ce345e87 100644 --- a/test/test_datapackage.py +++ b/test/test_datapackage.py @@ -20,7 +20,7 @@ def test_get_source_collection(self) -> None: path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "technologies.json", ) diff --git a/test/test_source_collection.py b/test/test_source_collection.py index 62e95a42..f8503959 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -236,7 +236,7 @@ def test_from_json(self) -> None: path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "sources.json", ) source_collection = technologydata.SourceCollection.from_json( @@ -245,6 +245,27 @@ def test_from_json(self) -> None: assert isinstance(source_collection, technologydata.SourceCollection) assert len(source_collection) == 2 + def test_from_json_to_json(self) -> None: + """Check whether reading with from_json and exporting with to_json yields the same file.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "sources.json", + ) + source_collection = technologydata.SourceCollection.from_json(input_file) + output_file = pathlib.Path("to_json_test.json") + schema_file = pathlib.Path(path_cwd, "to_json_test.schema.json") + source_collection.to_json(output_file) + # Read files and strip trailing whitespace/newlines before comparing + with open(input_file) as f1, open(output_file) as f2: + assert f1.read().rstrip() == f2.read().rstrip(), "Files are not identical" + assert output_file.is_file() + assert schema_file.is_file() + output_file.unlink(missing_ok=True) + schema_file.unlink(missing_ok=True) + @pytest.mark.parametrize( "title_pattern, authors_pattern", [["ATB", "nrel"], ["TECH_DATA", "danish"]], @@ -255,10 +276,9 @@ def test_get(self, title_pattern: str, authors_pattern: str) -> None: path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "sources.json", ) - source_collection = technologydata.SourceCollection.from_json( file_path=input_file ) diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index 2c129f9e..89e94fd3 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -23,7 +23,7 @@ def test_to_csv(self) -> None: path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "technologies.json", ) technology_collection = technologydata.TechnologyCollection.from_json( @@ -40,7 +40,7 @@ def test_to_dataframe(self) -> None: path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "technologies.json", ) technology_collection = technologydata.TechnologyCollection.from_json( @@ -49,12 +49,12 @@ def test_to_dataframe(self) -> None: assert isinstance(technology_collection.to_dataframe(), pandas.DataFrame) def test_to_json(self) -> None: - """Check if the example technology collection is exported to JSON.""" + """Check if to_json works as expected.""" input_file = pathlib.Path( path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "technologies.json", ) technology_collection = technologydata.TechnologyCollection.from_json( @@ -69,12 +69,12 @@ def test_to_json(self) -> None: schema_file.unlink(missing_ok=True) def test_from_json(self) -> None: - """Check if the example technology collection is imported from JSON.""" + """Check if from_json works as expected.""" input_file = pathlib.Path( path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "technologies.json", ) technology_collection = technologydata.TechnologyCollection.from_json( @@ -83,6 +83,30 @@ def test_from_json(self) -> None: assert isinstance(technology_collection, technologydata.TechnologyCollection) assert len(technology_collection) == 2 + def test_from_json_to_json(self) -> None: + """Check whether reading with from_json and exporting with to_json yields the same file.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + output_file = pathlib.Path("to_json_test.json") + schema_file = pathlib.Path(path_cwd, "to_json_test.schema.json") + technology_collection.to_json(output_file) + + # Read files and strip trailing whitespace/newlines before comparing + with open(input_file) as f1, open(output_file) as f2: + assert f1.read().rstrip() == f2.read().rstrip(), "Files are not identical" + assert output_file.is_file() + assert schema_file.is_file() + output_file.unlink(missing_ok=True) + schema_file.unlink(missing_ok=True) + @pytest.mark.parametrize( "name, region, year, case, detailed_technology", [ @@ -98,7 +122,7 @@ def test_get( path_cwd, "test", "test_data", - "solar_photovoltaics_example_03", + "solar_photovoltaics_example", "technologies.json", ) technologies_collection = technologydata.TechnologyCollection.from_json( From 9e21b52b35fc7b80434b4b1870e7c2848219bbfa Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Mon, 20 Oct 2025 10:33:06 +0200 Subject: [PATCH 22/81] code: Reorder Technology attributes (#66) --- src/technologydata/technology.py | 16 ++++++++-------- .../technologies.json | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index c4655a2e..3ecaaf76 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -22,30 +22,30 @@ class Technology(pydantic.BaseModel): # type: ignore ---------- name : str Name of the technology. + detailed_technology : str + More detailed technology name. + case : str + Case or scenario identifier. region : str Region identifier. year : int Year of the data. parameters : Dict[str, Parameter] Dictionary of parameter names to Parameter objects. - case : str - Case or scenario identifier. - detailed_technology : str - More detailed technology name. """ name: Annotated[str, pydantic.Field(description="Name of the technology.")] + detailed_technology: Annotated[ + str, pydantic.Field(description="Detailed technology name.") + ] + case: Annotated[str, pydantic.Field(description="Case or scenario identifier.")] region: Annotated[str, pydantic.Field(description="Region identifier.")] year: Annotated[int, pydantic.Field(description="Year of the data.")] parameters: Annotated[ dict[str, Parameter], pydantic.Field(default_factory=dict, description="Parameters."), ] - case: Annotated[str, pydantic.Field(description="Case or scenario identifier.")] - detailed_technology: Annotated[ - str, pydantic.Field(description="Detailed technology name.") - ] def __getitem__(self, key: str) -> Parameter: """ diff --git a/test/test_data/solar_photovoltaics_example/technologies.json b/test/test_data/solar_photovoltaics_example/technologies.json index 089e7901..4288346a 100644 --- a/test/test_data/solar_photovoltaics_example/technologies.json +++ b/test/test_data/solar_photovoltaics_example/technologies.json @@ -2,6 +2,8 @@ "technologies": [ { "name": "Solar photovoltaics", + "detailed_technology": "Si-HC", + "case": "example-scenario", "region": "DEU", "year": 2022, "parameters": { @@ -145,12 +147,12 @@ ] } } - }, - "case": "example-scenario", - "detailed_technology": "Si-HC" + } }, { "name": "Solar photovoltaics", + "detailed_technology": "Si-HC", + "case": "example-project", "region": "DEU", "year": 2022, "parameters": { @@ -294,9 +296,7 @@ ] } } - }, - "case": "example-project", - "detailed_technology": "Si-HC" + } } ] } From c9b39baf26546d16fddc50cd1d3b58d771c93836 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Tue, 28 Oct 2025 14:49:57 +0100 Subject: [PATCH 23/81] 31 change currency technology collection (#69) * code: Add to_currency for Technology and TechnologyCollection * code: Rename adjust_currency to to_currency for Parameter * doc: Update class diagramm * doc: Add simple docs for to_currency methods * code: fix mypy comments and minor static typing issue --------- Co-authored-by: Fabrizio Finozzi --- docs/user_guide/class-diagram.puml | 5 +- docs/user_guide/parameter.md | 45 +++- src/technologydata/parameter.py | 18 +- src/technologydata/technology.py | 38 ++- src/technologydata/technology_collection.py | 42 +++ test/test_parameter.py | 28 +- test/test_technology.py | 271 ++++++++++++++++++++ test/test_technology_collection.py | 107 ++++++++ 8 files changed, 520 insertions(+), 34 deletions(-) create mode 100644 test/test_technology.py diff --git a/docs/user_guide/class-diagram.puml b/docs/user_guide/class-diagram.puml index a45a6915..20dac56c 100644 --- a/docs/user_guide/class-diagram.puml +++ b/docs/user_guide/class-diagram.puml @@ -47,7 +47,7 @@ class Parameter { + _update_pint_attributes() + _check_parameter_compatibility() - + change_currency() + + to_currency() + change_heating_value() + to() + __add__(other: Parameter) @@ -86,7 +86,7 @@ class Technology { + __getitem__() + __setitem__() - + adjust_currency(): Technology // or inplace + + to_currency(): Technology + adjust_region(): Technology // or inplace + adjust_scale(): Technology // or inplace + calculate_EAC(): Parameter // or inplace @@ -131,6 +131,7 @@ end note class TechnologyCollection { - technologies: Iterable + get(**criteria): Technology | TechnologyCollection | None + + to_currency(): TechnologyCollection + to_json(): str + to_csv(): str + to_dataframe(): pd.DataFrame diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index bf778a2f..5a51ca3b 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -19,7 +19,7 @@ The `Parameter` class in `technologydata` encapsulates a value, its unit, proven - **Provenance and Notes**: Track the origin of the data and any additional notes. - **Sources**: Attach a `SourceCollection` of references for traceability. - **Unit Conversion**: Convert between compatible units (excluding currency conversion) using `.to()`. -- **Currency/Inflation Adjustment**: Convert between currencies and adjust for inflation using `.change_currency()`. +- **Currency/Inflation Adjustment**: Convert between currencies and adjust for inflation using `.to_currency()`. - **Arithmetic Operations**: Supports addition, subtraction, multiplication, and division with other `Parameter` objects, with compatibility checks for carrier and heating value. **Note:** Some operations will fail if heating values or carriers are incompatible, raising a `ValueError`. ## Usage Examples @@ -59,11 +59,48 @@ converted = param.to("USD_2020 / megawatt") ```python # Convert to EUR_2023 with inflation adjustment for Germany, using World Bank data -euro_param = param.change_currency("EUR_2023", "DEU", source="worldbank") +euro_param = param.to_currency("EUR_2023", "DEU", source="worldbank") >>> print(euro_param.magnitude, euro_param.units) 950.0 EUR_2023 / kilowatt ``` +Currency conversion and infation adjustment are also available for `Technology` and `TechnologyCollection` objects. +This allows to quickly adjust and harmonise the currency of all parameters in a technology or collection. + +```python +# for a Technology +from technologydata.technology import Technology +tech = Technology( + name="Example Tech", + region="DEU", + parameters={"cost": param} +) +converted_tech = tech.to_currency("USD_2020", source="worldbank") +>>> print(converted_tech.parameters["cost"].units) +USD_2020 / kilowatt + +# and for a TechnologyCollection +from technologydata.technology_collection import TechnologyCollection +tech_collection = TechnologyCollection(technologies=[tech]) +converted_collection = tech_collection.to_currency("USD_2020", source="worldbank") +>>> print(converted_collection.technologies[0].parameters["cost"].units) +USD_2020 / kilowatt +``` + +Compared to the `to_currency()` method of the `Parameter` class, the `to_currency()` methods of `Technology` and `TechnologyCollection` do not require specifying a country for inflation adjustment. +By default the `region` field of the `Technology` object or the `Technology` objects in the `TechnologyCollection` are used for inflation adjustment. +If the value of the `region` field should not be used or is not suitable, because e.g. it is not a valid ISO 3166 alpha-3 country code, the optional `overwrite_country` argument can be used to specify a different country code for inflation adjustment. + +```python +>>> print(tech.region) +DEU +converted_tech = tech.to_currency("USD_2020") # uses tech.region (DEU) for inflation adjustment + +converted_tech = tech.to_currency("USD_2020", overwrite_country="FRA") # uses FRA for inflation adjustment +>>> print(converted_tech.region) # the region remains unchanged +DEU +``` + ### Arithmetic Operations ```python @@ -84,7 +121,7 @@ param + param_hhv ## Notes on Currency Conversion and pydeflate - **pydeflate Integration**: Currency and inflation adjustments are performed using the `pydeflate` package. This package uses data from either the World Bank or the International Monetary Fund. In order to use `pydeflate` with currency codes, we make some opinioated assumptions about the mapping from currency codes to countries which should in most cases be correct, but may not always be accurate for all currencies or years. -- **Country Mapping**: To see which country was used for a given currency code during conversion, inspect the mapping in `pydeflate` or use the helper functions in `technologydata.utils.units` (e.g., `get_iso3_from_currency_code`). The country code you provide to `.change_currency()` determines the inflation adjustment, but the mapping from currency code to country is handled internally by pydeflate and may be checked in its documentation or by printing the mapping used in your environment. +- **Country Mapping**: To see which country was used for a given currency code during conversion, inspect the mapping in `pydeflate` or use the helper functions in `technologydata.utils.units` (e.g., `get_iso3_from_currency_code`). The country code you provide to `.to_currency()` determines the inflation adjustment, but the mapping from currency code to country is handled internally by pydeflate and may be checked in its documentation or by printing the mapping used in your environment. - **Data availability**: Since we use World Bank or IMF data, the availability of currency conversion data may vary by year and currency, depending on the most recent publication. World Bank data is based on the [World Bank DataBank](https://databank.worldbank.org/home.aspx) and IMF data is based on the [World Economic Outlook](https://www.imf.org/en/Publications/WEO). If IMF data is used, this means that also short-term projections can be accessed, usually e.g. GDP deflators for up to 2 years into the future. - **Updating Data**: If `pydeflate` notices that data is older than 50 days, it will display a warning. It will also periodically try to update the data automatically. More information on how to configure the update behaviour and caching locations for `pydeflate` are available in their [documentation](https://github.com/jm-rivera/pydeflate). @@ -131,7 +168,7 @@ param_mixed_hhv = param_mixed.change_heating_value("HHV") ## Limitations & Missing Features - **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, the handling and merging of `provenance`, `note`, and `sources` is not yet implemented (see `TODO` comments in the code). -- **Unit Conversion**: The `.to()` method does not support currency conversion; use `.change_currency()` for that. +- **Unit Conversion**: The `.to()` method does not support currency conversion; use `.to_currency()` for that. - **Partial Unit Compatibility**: Only certain combinations of units, carriers, and heating values are supported for arithmetic operations. - **No Uncertainty Handling**: There is currently no support for uncertainty or error propagation. - **No Serialization/Deserialization**: Direct methods for exporting/importing to/from JSON or DataFrame are not implemented in this class. diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 233a814a..07da137d 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -157,8 +157,8 @@ def to(self, units: str) -> Self: sources=self.sources, ) - def change_currency( - self, to_currency: str, country: str, source: str = "worldbank" + def to_currency( + self, target_currency: str, country: str, source: str = "worldbank" ) -> Self: """ Change the currency of the parameter. @@ -173,7 +173,7 @@ def change_currency( Parameters ---------- - to_currency : str + target_currency : str The target currency unit to convert to, e.g. "USD_2020", "EUR_2024", "CNY_2022". country : str The country for which the inflation adjustment should be made for. @@ -190,22 +190,22 @@ def change_currency( Examples -------- - >>> param.change_currency("USD_2024", "USA") - >>> param.change_currency("EUR_2020", "DEU", source="imf") - >>> param.change_currency("EUR_2023", "USA", source="worldbank") + >>> param.to_currency("USD_2024", "USA") + >>> param.to_currency("EUR_2020", "DEU", source="imf") + >>> param.to_currency("EUR_2023", "USA", source="worldbank") """ self._update_pint_attributes() # Ensure the target currency is a valid unit - technologydata.ureg.ensure_currency_is_unit(to_currency) + technologydata.ureg.ensure_currency_is_unit(target_currency) # Current unit and currency/currencies from_units = self._pint_quantity.units from_currencies = technologydata.extract_currency_units(from_units) # Replace all currency units in the from_units with the target currency to_units = technologydata.CURRENCY_UNIT_PATTERN.sub( - to_currency, str(from_units) + target_currency, str(from_units) ) # Create a temporary context to which we add the conversion rates @@ -228,7 +228,7 @@ def change_currency( ) # Get conversion rates for all involved currencies - currencies = set(from_currencies).union({to_currency}) + currencies = set(from_currencies).union({target_currency}) # Avoid recursion error in pint definition by re-adding the reference currency currencies = currencies - {ref_currency} diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 3ecaaf76..304053ea 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -111,23 +111,51 @@ def calculate_parameters(self, parameters: Any | None = None) -> Self: # Placeholder: implement calculation logic as needed return self - def adjust_currency(self, target_currency: str) -> Self: + def to_currency( + self, + target_currency: str, + overwrite_country: None | str = None, + source: str = "worldbank", + ) -> Self: """ - Adjust all currency parameters to a target currency. + Adjust the currency of all parameters of the technology to the target currency. + + The conversion includes inflation and exchange rates based on the object's region. + If a different country should be used for inflation adjustment, use `overwrite_country`. Parameters ---------- target_currency : str The target currency (e.g., 'EUR_2020'). + overwrite_country : str, optional + ISO 3166 alpha-3 country code to use for inflation adjustment instead of the object's region. + source: str, optional + The source of the inflation data, either "worldbank"/"wb" or "international_monetary_fund"/"imf". + Defaults to "worldbank". + Depending on the source, different years to adjust for inflation may be available. Returns ------- Technology - A new Technology object with adjusted currency. + A new Technology object with all its parameters adjusted to the target currency. """ - # Placeholder: implement currency adjustment logic - return self + country = self.region + if overwrite_country: + country = overwrite_country + + # Copy the Technology object + new_tech: Self = self.model_copy(deep=True) + + # Iterate over parameters and convert their currency + for name, param in new_tech.parameters.items(): + new_tech.parameters[name] = param.to_currency( + target_currency=target_currency, + country=country, + source=source, + ) + + return new_tech def adjust_region(self, target_region: str) -> Self: """ diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index cb66361f..c51e53d8 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -236,3 +236,45 @@ def from_json(cls, file_path: pathlib.Path | str) -> Self: TechnologyCollection, cls.model_validate(pydantic_core.from_json(json_data, allow_partial=True)), ) + + def to_currency( + self, + target_currency: str, + overwrite_country: None | str = None, + source: str = "worldbank", + ) -> Self: + """ + Adjust the currency of all parameters of all contained Technology objects to the target currency. + + The conversion includes inflation and exchange rates based on each Technology objects's region. + If a different country should be used for inflation adjustment, use `overwrite_country`. + + Parameters + ---------- + target_currency : str + The target currency (e.g., 'EUR_2020'). + overwrite_country : str, optional + ISO 3166 alpha-3 country code to use for inflation adjustment instead of the object's region. + source: str, optional + The source of the inflation data, either "worldbank"/"wb" or "international_monetary_fund"/"imf". + Defaults to "worldbank". + Depending on the source, different years to adjust for inflation may be available. + + Returns + ------- + TechnologyCollection + A new TechnologyCollection object with all its parameters adjusted to the target currency. + + """ + new_techs = [] + + for i, tech in enumerate(self.technologies): + new_techs.append( + tech.to_currency( + target_currency=target_currency, + overwrite_country=overwrite_country, + source=source, + ) + ) + + return TechnologyCollection(technologies=new_techs) diff --git a/test/test_parameter.py b/test/test_parameter.py index e9378e53..98d39ae2 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -142,7 +142,7 @@ def test_pint_attributes_update(self) -> None: technologydata.ureg.Unit("USD_2020 / kWh") ) - def test_parameter_change_currency(self) -> None: + def test_parameter_to_currency(self) -> None: """Test currency conversion with inflation adjustment.""" param = technologydata.Parameter( magnitude=1, @@ -150,7 +150,7 @@ def test_parameter_change_currency(self) -> None: ) # Convert to EUR with inflation adjustment for Germany - converted = param.change_currency("EUR_2023", "DEU") + converted = param.to_currency("EUR_2023", "DEU") assert isinstance(converted, technologydata.Parameter) assert converted.units is not None assert "EUR_2023" in converted.units @@ -169,7 +169,7 @@ def test_parameter_change_currency_explicit_source(self) -> None: ) # Convert using IMF data source - converted = param.change_currency("USD_2022", "USA", source="worldbank") + converted = param.to_currency("USD_2022", "USA", source="worldbank") assert isinstance(converted, technologydata.Parameter) assert converted.units is not None assert "USD_2022" in converted.units @@ -185,7 +185,7 @@ def test_parameter_change_currency_different_source(self) -> None: ) # Convert using IMF data source - converted = param.change_currency("USD_2022", "USA", source="imf") + converted = param.to_currency("USD_2022", "USA", source="imf") assert isinstance(converted, technologydata.Parameter) assert converted.units is not None assert "USD_2022" in converted.units @@ -199,7 +199,7 @@ def test_parameter_change_currency_multiple_currencies(self) -> None: ) # Convert all currencies to CNY_2023 - converted = param.change_currency("CNY_2023", "CHN") + converted = param.to_currency("CNY_2023", "CHN") assert isinstance(converted, technologydata.Parameter) # Both USD_2020 and EUR_2021 should be replaced with CNY_2023 assert converted.units is not None @@ -215,7 +215,7 @@ def test_parameter_change_currency_same_currency(self) -> None: ) # Convert to USD but different year (inflation adjustment) - converted = param.change_currency("USD_2023", "USA") + converted = param.to_currency("USD_2023", "USA") assert isinstance(converted, technologydata.Parameter) assert converted.units == "USD_2023 / kilowatt" # Magnitude should change due to inflation adjustment @@ -230,7 +230,7 @@ def test_parameter_no_currency_change(self) -> None: ) # Convert to the same currency and year - converted = param.change_currency("USD_2020", "USA") + converted = param.to_currency("USD_2020", "USA") assert isinstance(converted, technologydata.Parameter) assert converted._pint_quantity.is_compatible_with("USD_2020 / kW") # Magnitude should remain unchanged @@ -246,7 +246,7 @@ def test_parameter_change_currency_invalid_country(self) -> None: # Invalid country code should raise an error with pytest.raises((ValueError, KeyError)): - param.change_currency("EUR_2023", "USB") + param.to_currency("EUR_2023", "USB") def test_parameter_change_currency_invalid_source(self) -> None: """Test that invalid inflation data sources raise appropriate errors.""" @@ -257,7 +257,7 @@ def test_parameter_change_currency_invalid_source(self) -> None: # Invalid source should raise an error with pytest.raises(KeyError): - param.change_currency("EUR_2023", "DEU", source="invalid_source") + param.to_currency("EUR_2023", "DEU", source="invalid_source") def test_parameter_change_currency_no_units(self) -> None: """Test currency conversion with parameter that has no units.""" @@ -266,7 +266,7 @@ def test_parameter_change_currency_no_units(self) -> None: ) # Should handle parameters without currency units gracefully - converted = param.change_currency("EUR_2023", "DEU") + converted = param.to_currency("EUR_2023", "DEU") assert isinstance(converted, technologydata.Parameter) assert converted.magnitude == 42 assert converted.units is None or "EUR_2023" not in str(converted.units) @@ -283,7 +283,7 @@ def test_parameter_unchanged_other_attributes(self) -> None: ) # Convert to EUR_2023 - converted = param.change_currency("EUR_2023", "DEU") + converted = param.to_currency("EUR_2023", "DEU") # Check that other attributes remain unchanged assert converted.carrier == param.carrier @@ -737,7 +737,7 @@ def test_change_heating_value_same_hv(self) -> None: "folder_id", ["WB_CNY_2020", "WB_EUR_2020", "WB_USD_2020"], ) # type: ignore - def test_change_currency(self, folder_id: str) -> None: + def test_to_currency(self, folder_id: str) -> None: """Validate the currency conversion rates.""" input_path = pathlib.Path( path_cwd, @@ -757,8 +757,8 @@ def test_change_currency(self, folder_id: str) -> None: output_param = technologydata.Parameter( magnitude=row["input_magnitude"], units=row["input_units"], - ).change_currency( - to_currency=technologydata.extract_currency_units( + ).to_currency( + target_currency=technologydata.extract_currency_units( row["reference_units"] )[0], country=row["country"], diff --git a/test/test_technology.py b/test/test_technology.py new file mode 100644 index 00000000..14495733 --- /dev/null +++ b/test/test_technology.py @@ -0,0 +1,271 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the initialization and methods of the Technology class.""" + +import pathlib + +import technologydata + +path_cwd = pathlib.Path.cwd() + + +class TestTechnology: + """Test suite for the Technology class in the technologydata module.""" + + def test_technology_creation(self) -> None: + """Test the creation of a Technology instance.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "investment": technologydata.Parameter( + magnitude=500, + units="EUR_2022/kW", + provenance="Industry report", + note="Average overnight cost", + ), + "lifetime": technologydata.Parameter( + magnitude=25, + units="years", + provenance="Literature", + ), + }, + ) + assert tech.name == "Solar photovoltaics" + assert tech.detailed_technology == "Si-HC" + assert tech.case == "example-scenario" + assert tech.region == "DEU" + assert tech.year == 2022 + assert len(tech.parameters) == 2 + assert "investment" in tech.parameters + assert "lifetime" in tech.parameters + + def test_technology_to_currency(self) -> None: + """Test currency conversion for all parameters in a Technology.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "investment": technologydata.Parameter( + magnitude=500, + units="EUR_2022/kW", + provenance="Industry report", + note="Average overnight cost", + ), + "fixed_om": technologydata.Parameter( + magnitude=10, + units="EUR_2022/kW/year", + provenance="Literature", + ), + "lifetime": technologydata.Parameter( + magnitude=25, + units="years", + provenance="Literature", + ), + }, + ) + + # Convert to USD_2020 + converted = tech.to_currency("USD_2020") + + # Check that a new Technology object was returned + assert isinstance(converted, technologydata.Technology) + assert converted is not tech # Should be a different object + + # Check that basic attributes are preserved + assert converted.name == tech.name + assert converted.detailed_technology == tech.detailed_technology + assert converted.case == tech.case + assert converted.region == tech.region + assert converted.year == tech.year + + # Check that parameters with currency units are converted + assert "USD_2020" in str(converted.parameters["investment"].units) + assert "EUR_2022" not in str(converted.parameters["investment"].units) + assert "USD_2020" in str(converted.parameters["fixed_om"].units) + assert "EUR_2022" not in str(converted.parameters["fixed_om"].units) + + # Check that parameters without currency units remain unchanged + assert ( + converted.parameters["lifetime"].units == tech.parameters["lifetime"].units + ) + assert ( + converted.parameters["lifetime"].magnitude + == tech.parameters["lifetime"].magnitude + ) + + # Check that magnitude changed for currency parameters + assert ( + converted.parameters["investment"].magnitude + != tech.parameters["investment"].magnitude + ) + assert ( + converted.parameters["fixed_om"].magnitude + != tech.parameters["fixed_om"].magnitude + ) + + def test_technology_to_currency_with_overwrite_country(self) -> None: + """Test currency conversion with a different country for inflation adjustment.""" + tech = technologydata.Technology( + name="Wind turbine", + detailed_technology="Onshore", + case="base-case", + region="DEU", + year=2022, + parameters={ + "investment": technologydata.Parameter( + magnitude=1200, + units="EUR_2020/kW", + provenance="Industry data", + ), + }, + ) + + # Convert using a different country (USA) for inflation adjustment + converted = tech.to_currency("USD_2023", overwrite_country="USA") + + assert isinstance(converted, technologydata.Technology) + assert "USD_2023" in str(converted.parameters["investment"].units) + assert ( + converted.parameters["investment"].magnitude + != tech.parameters["investment"].magnitude + ) + + def test_technology_to_currency_with_source(self) -> None: + """Test currency conversion with different inflation data sources.""" + tech = technologydata.Technology( + name="Battery storage", + detailed_technology="Li-ion", + case="scenario-1", + region="USA", + year=2022, + parameters={ + "investment": technologydata.Parameter( + magnitude=300, + units="USD_2020/kWh", + ), + }, + ) + + # Convert using worldbank source + converted_wb = tech.to_currency("EUR_2022", source="worldbank") + assert isinstance(converted_wb, technologydata.Technology) + assert "EUR_2022" in str(converted_wb.parameters["investment"].units) + + # Convert using IMF source + converted_imf = tech.to_currency("EUR_2022", source="imf") + assert isinstance(converted_imf, technologydata.Technology) + assert "EUR_2022" in str(converted_imf.parameters["investment"].units) + + def test_technology_to_currency_preserves_other_attributes(self) -> None: + """Test that currency conversion preserves other parameter attributes.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "investment": technologydata.Parameter( + magnitude=500, + units="EUR_2022/kW", + carrier="electricity", + provenance="Industry report", + note="Average overnight cost", + sources=technologydata.SourceCollection( + sources=[ + technologydata.Source( + title="Test Source", + authors="Test Authors", + ) + ] + ), + ), + }, + ) + + converted = tech.to_currency("USD_2020") + + # Check that non-currency attributes are preserved + assert ( + converted.parameters["investment"].carrier + == tech.parameters["investment"].carrier + ) + assert ( + converted.parameters["investment"].provenance + == tech.parameters["investment"].provenance + ) + assert ( + converted.parameters["investment"].note + == tech.parameters["investment"].note + ) + assert len(converted.parameters["investment"].sources.sources) == len( + tech.parameters["investment"].sources.sources + ) + + def test_technology_to_currency_empty_parameters(self) -> None: + """Test currency conversion on a Technology with no parameters.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={}, + ) + + # Should handle empty parameters gracefully + converted = tech.to_currency("USD_2020") + + assert isinstance(converted, technologydata.Technology) + assert len(converted.parameters) == 0 + + def test_technology_to_currency_mixed_currencies(self) -> None: + """Test currency conversion when parameters have different currencies.""" + tech = technologydata.Technology( + name="Hybrid system", + detailed_technology="Solar+Wind", + case="scenario-1", + region="DEU", + year=2022, + parameters={ + "investment_solar": technologydata.Parameter( + magnitude=500, + units="EUR_2022/kW", + ), + "investment_wind": technologydata.Parameter( + magnitude=1000, + units="USD_2020/kW", + ), + "capacity": technologydata.Parameter( + magnitude=100, + units="MW", + ), + }, + ) + + # Convert all to GBP_2021 + converted = tech.to_currency("GBP_2021") + + # All currency parameters should be converted to GBP_2021 + assert "GBP_2021" in str(converted.parameters["investment_solar"].units) + assert "EUR_2022" not in str(converted.parameters["investment_solar"].units) + assert "GBP_2021" in str(converted.parameters["investment_wind"].units) + assert "USD_2020" not in str(converted.parameters["investment_wind"].units) + + # Non-currency parameter should remain unchanged + assert ( + converted.parameters["capacity"].units == tech.parameters["capacity"].units + ) + assert ( + converted.parameters["capacity"].magnitude + == tech.parameters["capacity"].magnitude + ) diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index 89e94fd3..c2608f63 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -137,3 +137,110 @@ def test_get( ) assert isinstance(result, technologydata.TechnologyCollection) assert len(result.technologies) == 1 + + def test_to_currency(self) -> None: + """Test currency conversion for all technologies in the collection.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + + # Convert to USD_2020 + converted = technology_collection.to_currency("USD_2020") + + # Check that a new TechnologyCollection object was returned + assert isinstance(converted, technologydata.TechnologyCollection) + assert converted is not technology_collection + + # Check that the number of technologies is the same + assert len(converted) == len(technology_collection) + + # Check that all technologies have been converted + for tech in converted: + for param_name, param in tech.parameters.items(): + if param.units and "EUR_2022" in param.units: + # Should not happen - all EUR_2022 should be converted + assert False, f"Parameter {param_name} still has EUR_2022" + + def test_to_currency_with_overwrite_country(self) -> None: + """Test currency conversion with a different country for inflation adjustment.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + + # Convert using a different country (USA) for inflation adjustment + converted = technology_collection.to_currency( + "USD_2023", overwrite_country="USA" + ) + + assert isinstance(converted, technologydata.TechnologyCollection) + assert len(converted) == len(technology_collection) + + # Check that currencies have been converted + for tech in converted: + for param in tech.parameters.values(): + if param.units and "USD" in param.units: + assert "USD_2023" in param.units + + def test_to_currency_with_source(self) -> None: + """Test currency conversion with different inflation data sources.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + + # Convert using worldbank source + converted_wb = technology_collection.to_currency( + "USD_2022", source="international_monetary_fund" + ) + assert isinstance(converted_wb, technologydata.TechnologyCollection) + assert len(converted_wb) == len(technology_collection) + + # Convert using IMF source + converted_imf = technology_collection.to_currency("USD_2022", source="imf") + assert isinstance(converted_imf, technologydata.TechnologyCollection) + assert len(converted_imf) == len(technology_collection) + + def test_to_currency_preserves_technology_attributes(self) -> None: + """Test that currency conversion preserves technology attributes.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + + converted = technology_collection.to_currency("USD_2020") + + # Check that technology attributes are preserved + for orig_tech, conv_tech in zip( + technology_collection.technologies, converted.technologies + ): + assert orig_tech.name == conv_tech.name + assert orig_tech.detailed_technology == conv_tech.detailed_technology + assert orig_tech.case == conv_tech.case + assert orig_tech.region == conv_tech.region + assert orig_tech.year == conv_tech.year From b8ad7141eebc2fa0c45cd8755a8c8c9e31740b42 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:00:53 +0100 Subject: [PATCH 24/81] Custom error message for CCC_YYYY (#72) * code: modify units.py * code: new attempt to modify registry function * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: add method to patch pint error handling register * code: add validation * code: update test * code: refine message * code: Fix and expand test * code: fix issues in CustomUndefinedUnitError * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * add pre-commit * code: add some extra test --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: euronion --- src/technologydata/utils/units.py | 109 ++++++++++++++++++++++++++++++ test/test_parameter.py | 36 +++++++++- 2 files changed, 143 insertions(+), 2 deletions(-) diff --git a/src/technologydata/utils/units.py b/src/technologydata/utils/units.py index 8e91272d..548d1ef9 100644 --- a/src/technologydata/utils/units.py +++ b/src/technologydata/utils/units.py @@ -6,6 +6,7 @@ import json import logging import re +import typing from functools import lru_cache from pathlib import Path from typing import Any @@ -309,6 +310,112 @@ def get_iso3_from_currency_code( ) from e +def patch_pint_registry_error_handling(registry: pint.registry.UnitRegistry) -> None: + """ + Patch a Pint registry to use CustomUndefinedUnitError. + + Parameters + ---------- + registry : pint.registry.UnitRegistry + The Pint unit registry to patch. + + """ + # Store the original method + original_get_name = registry.get_name + + def patched_get_name( + self: pint.registry.UnitRegistry, name: str, *args: Any, **kwargs: Any + ) -> Any: + try: + return original_get_name(name, *args, **kwargs) + except pint.errors.UndefinedUnitError as e: + # Raise the custom error with the same arguments + raise CustomUndefinedUnitError(e.args[0]) from e + + # Replace the method + registry.get_name = patched_get_name.__get__(registry) + + +class CustomUndefinedUnitError(pint.errors.UndefinedUnitError): # type: ignore + """ + Custom message for undefined unit errors. + + This custom error is raised when a unit is not defined in the unit registry. + It provides more specific error messages, especially for currency units + that are missing the currency year. + + Parameters + ---------- + unit_names : list of str + The names of the units that are not defined in the unit registry. + + Attributes + ---------- + unit_names : list of str + The names of the units that are not defined in the unit registry. + + Notes + ----- + This error is a subclass of `pint.errors.UndefinedUnitError` and is designed + to provide more specific error messages for currency units that are missing + the currency year. + + """ + + def __init__(self, unit_names: str | typing.Iterable[str]) -> None: + """ + Initialize a CustomUndefinedUnitError instance. + + This constructor creates a new `CustomUndefinedUnitError` object, + inheriting all default behaviors from `pint.errors.UndefinedUnitError`. + + Parameters + ---------- + unit_names : str or iterable of str + The name or names of the undefined units that caused the error. + + """ + # Use all defaults definitions from a standard pint.errors.UndefinedUnitError + super().__init__(unit_names) + + def __str__(self) -> str: + """ + Generate a custom error message string. + + This method generates a custom error message string based on the + unit names that are not defined in the unit registry. It provides + specific messages for currency units that are missing the currency year. + + Returns + ------- + str + The custom error message string. + + """ + # Retrieve unit names, defaulting to an empty list if not present + unit_names = getattr(self, "unit_names", []) + + # Precompute valid currency codes for efficiency + all_currency_codes = set(get_iso3_to_currency_codes().values()) + + # Identify currency units without a year specification + currency_errors = [ + code + for unit in unit_names + for code in re.findall(r"[A-Z]{3}", str(unit)) + if code in all_currency_codes + and not CURRENCY_UNIT_PATTERN.search(str(unit)) + ] + + # Generate specific error message for currency units + if currency_errors: + missing_code = currency_errors[0] + return f"Currency unit '{missing_code}' is missing the 4-digit currency year (e.g. {missing_code}_2020)." + + # Fallback to parent class error message if no specific currency error found + return super().__str__() # type: ignore + + class SpecialUnitRegistry(pint.UnitRegistry): # type: ignore """A special pint.UnitRegistry subclass that includes methods for handling currency units and conversion using pydeflate.""" @@ -405,3 +512,5 @@ def ensure_currency_is_unit(self, units: str) -> None: hvreg = pint.UnitRegistry( filename=Path(__file__).parent / "heating_values.txt" ) # For tracking heating values and ensuring compatibility between them + +patch_pint_registry_error_handling(ureg) diff --git a/test/test_parameter.py b/test/test_parameter.py index 98d39ae2..e99a1a42 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -13,8 +13,7 @@ import technologydata from technologydata.constants import EnergyDensityLHV - -# from technologydata.utils.units import extract_currency_units, ureg +from technologydata.utils.units import CustomUndefinedUnitError path_cwd = pathlib.Path.cwd() @@ -55,6 +54,39 @@ def test_parameter_creation(self) -> None: def test_parameter_invalid_units(self) -> None: """Test that an error is raised when invalid units are provided.""" + with pytest.raises(CustomUndefinedUnitError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="USD", + ) + assert ( + str(excinfo.value) + == "Currency unit 'USD' is missing the 4-digit currency year (e.g. USD_2020)." + ) + assert excinfo.type == CustomUndefinedUnitError + + with pytest.raises(CustomUndefinedUnitError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="USD_20/kW", + ) + assert ( + str(excinfo.value) + == "Currency unit 'USD' is missing the 4-digit currency year (e.g. USD_2020)." + ) + assert excinfo.type == CustomUndefinedUnitError + + with pytest.raises(CustomUndefinedUnitError) as excinfo: + technologydata.Parameter( + magnitude=1000, + units="abc_USD_20/kW", + ) + assert ( + str(excinfo.value) + == "Currency unit 'USD' is missing the 4-digit currency year (e.g. USD_2020)." + ) + assert excinfo.type == CustomUndefinedUnitError + with pytest.raises(pint.errors.UndefinedUnitError) as excinfo: technologydata.Parameter( magnitude=1000, From 9a656efa885d1ba41571bd7f21241195e28b70ce Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 5 Nov 2025 10:36:05 +0100 Subject: [PATCH 25/81] Technology collection models (#18) * doc: Add proposal for GrowthModels * doc: Add proposal for LearningModels * code: Add implementation for growth models and linear growth * doc: Document growth models and linear growth * code: Remove model default affected parameters * code: Fix up docstrings * code: Sort imports * code: Fix type annotations * spelling and doc-string fixes * code: Implement exponential growth * code: Cleanup * code: Implement logistical growth * code: Expand package structure * code: Revise implementation for GrowthModel(s), start with LinearGrowth * code: Expand the abstract GrowthModel class * code: Allow starting values to be only a subset of all missing parameters * code: Reimplement LogisticGrowth and ExponentialGrowth * code Fix mypy issues * code: Add missing scipy dependency * Revert "code: Add missing scipy dependency" This reverts commit c053bfc6558a5b5395e2df97b39d67308ea059be. * code: Add missing scipy dependency * code: Cleanup + add GompertzGrowth model * doc: Update docs on GrowthModels * code: Add simple tests for growth_model.py * code: Add GeneralLogisticGrowth and harmonise parameter names * code: Update tests * doc: Update class diagramm * doc: ValueError in docstring * code: Implement fitting and projections on TCs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: Simplify signature * code: Address pydantic deprecations * code: basic tests for fit and project on TechnologyCollection * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: add more tests * code: Update uv.lock file * code: Add x0 to all growth model functions * doc: Update docs for GrowthModel and integration with TechnologyCollection * code: TODO ideas for growth_models.py * git: Ignore dev folder * code: Fix tests * code: Address mypy errors * code: Add support for pydantic in mypy * code: update mypy issues * code: update growth models * doc: change currency to_currency * code: fix mypy issues --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Fabrizio Finozzi --- .gitignore | 3 + .pre-commit-config.yaml | 2 +- docs/models.md | 310 ++ docs/user_guide/class-diagram.puml | 112 +- pyproject.toml | 2 + src/technologydata/datapackage.py | 2 +- src/technologydata/parameter.py | 24 +- src/technologydata/source.py | 2 +- src/technologydata/source_collection.py | 12 +- src/technologydata/technologies/__init__.py | 5 + .../technologies/growth_models.py | 502 ++++ src/technologydata/technology.py | 2 +- src/technologydata/technology_collection.py | 195 +- test/test_growth_models.py | 281 ++ test/test_technology_collection.py | 138 + uv.lock | 2621 +++++++++-------- 16 files changed, 2966 insertions(+), 1247 deletions(-) create mode 100644 docs/models.md create mode 100644 src/technologydata/technologies/__init__.py create mode 100644 src/technologydata/technologies/growth_models.py create mode 100644 test/test_growth_models.py diff --git a/.gitignore b/.gitignore index 3ce78b52..63839d78 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,6 @@ coverage.xml # mypy .mypy_cache/ .dmypy.json + +# folder for misc developments +dev/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 30c759f0..640f85d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: hooks: - id: mypy args: [--strict, --ignore-missing-imports, --config-file=pyproject.toml] - additional_dependencies: [tokenize-rt==3.2.0] + additional_dependencies: [tokenize-rt==3.2.0, pydantic>=2.11.7] exclude: ^docs/ # Pyupgrade: Automatically upgrades Python syntax diff --git a/docs/models.md b/docs/models.md new file mode 100644 index 00000000..21ba4e3c --- /dev/null +++ b/docs/models.md @@ -0,0 +1,310 @@ +# Title + + + +## Models + +Different models can be used to modify assumptions to fit specific scenarios. + +## Supported Model Types + +- **Growth models**: For projecting technology parameters forward in time using mathematical models. + +These are implemented as Python classes and can be used for fitting to data and making projections. + +## Growth Models + +Growth models are mathematical models for projecting technology parameters over time. They are implemented as Pydantic classes in `technologydata.technologies.growth_models` and can be used for both fitting to data and making projections. The following growth models are available: + +### Available Growth Models + +- `LinearGrowth`: Linear model, $f(x) = m \cdot (x - x_0) + c$ +- `ExponentialGrowth`: Exponential model, $f(x) = A \cdot \exp(k \cdot (x - x_0))$ +- `LogisticGrowth`: Logistic (sigmoid) model, $f(x) = \frac{L}{1 + \exp(-k \cdot (x - x_0))}$ +- `GeneralLogisticGrowth`: Generalized logistic model, $f(x) = A + \frac{K - A}{(C + Q \cdot \exp(-B \cdot (x - x_0)))^{1/\nu}}$ +- `GompertzGrowth`: Gompertz model, $f(x) = A \cdot \exp(-b \cdot \exp(-k \cdot (x - x_0)))$ + +Each model exposes: + +- A `function(x, ...)` method for the mathematical form +- A `fit()` method to fit parameters to the data points registered with the model +- A `project(to_year)` method to project to a given year. Requires all parameters of the models to be set, either manually or via fitting. +- Data points can be added via each models constructor or later via the `add_data((x, y))` function + +#### Model Parameters + +Each model has its own parameters, e.g. for `LinearGrowth` those are `x0`, `A` and `m`. +These parameters can either be set when instantiating the model or later by setting the attributes directly. +Not all parameters need to be set, e.g. if you are planning on fitting one parameter based on the data of the model, it makes sense to only set the other parameters. +Omitting parameters can be done by either not providing them at all or setting them to `None`. + +```python +model = LinearGrowth(x0=2020, A=None) # Set only x0; A and m are not set + +# Set A after instantiation of the model +model.A = 5_000_000 + +# All principal model parameters are available as +print(model.model_parameters) +> ['x0', 'A', 'm'] + +# All already set model parameters are available as +print(model.provided_parameters) +> ['x0', 'A'] + +# All parameters that are still missing (None) are available as +print(model.missing_parameters) +> ['m'] +``` + +The meaning of the parameters is documented in the Pydantic field descriptions: + +```python +print(LinearGrowth.model_fields["A"].description) +> Starting value of the linear function. +``` + +and the function docstring: + +```python +::: technologydata.technologies.growth_models.LinearGrowth.function +``` + +#### Creating a model and projecting a value + +To create a model, e.g. for the growth of electric vehicles over time, instantiate the model with the known parameters: + +```python +from technologydata.technologies.growth_models import LinearGrowth + +# start with 5 million in 2020, and grow linearly by 2 million per year +model = LinearGrowth(x0=2020, A=5_000_000, m=2_000_000) + +# Project to 2030, should be 5 million + 2 million * (2030 - 2020) = 25 million +model.project(2030) +> 25000000 + +``` + +The underlying function for each model can also be inspected and called directly, e.g.: + +```python +LinearGrowth().function(2030, x0=2020, A=5_000_000, m=2_000_000) +> 25000000 +``` + +Note that when using the `function` method directly, all parameters must be explicitly provided. +(TODO: maybe function should be a classmethod or read the parameters from the instance if they are set?) + +#### Fitting a model to data + +To fit a model to data points, provide the data points to the model via the `data_points` argument when instantiating the model or add them later via the `add_data((x, y))` method: + +```python +import numpy as np +from technologydata.technologies.growth_models import LinearGrowth + +# Dummy data to fit to +x0 = 2020 +m = 2_000_000 +A = 5_000_000 +x = np.arange(2020, 2025) +y = A + m * (x - x0) + +# Create the model with data points +# note that a linear growth is not a great model for this type data +model = LinearGrowth(data_points=[*zip(x, y)]) + +# More data points can be added later as (x, y) tuples +model.add_data((2030 - x0, A + m * (2030 - x0))) + +# The model can now be fitted to the data points +model.fit() + +# After fitting, the model parameters are set and can be inspected ... +print(model.x0) +> -12173.437639145683 +print(model.m) +> 121803685.25127366 +print(model.A) +> 121803685.25127366 + +# ... or used for projection +print(f"Projected: {model.project(2050)}, expected: {A + m * (2050 - x0)}") +> Projected: 8779498.59552154, expected: 65000000 +``` + +In the above example, the model yielded a projected value and the fitted parameters were not a good what was expected compared to the original values for `x0`, `A` and `m`. +This can have multiple reasons, common problems are: + +1. Insufficient or poor quality data points +2. The model being not suitable for matching the data trend +3. Parameters of the model competing against each other during fitting + +In the example above, the third case applies. +The model has three parameters, `x0`, `A` and `m`, of which `x0` and `A` are competing against each other. +To get a better fit of the model to the data the model parameters can either be partially fixed such that only some of the parameters need to be fitted, or initial guesses for the parameters can be provided to guide the fitting process. + +To fix parameters, simply set them when instantiating the model or later by setting the attributes directly: + +```python +# Fix x0 for the model +model = LinearGrowth(x0=2020, data_points=[*zip(x, y)]) + +# Fix m for the model +model.m = 2_000_000 + +# Now only A is a free and missing parameter +print(model.missing_parameters) +> ['A'] + +# Fitting the model again now yields a better fit +model.fit() +print(model.A) +> 5000000.0 +``` + +Instead of fixing parameters, initial guesses can be provided via the `p0` argument to the `fit` method. +Initial guesses are ways of providing the model with some context information about the data and the expected parameter values. +This method does not guarantee that the parameters will be fitted to the provided values, but it can help to guide the fitting process and find a better fit. +By default, if no initial guesses are provided, the fitting algorithm will start with `1.0` for parameters for which no starting value is provided. +In the example `x0` should be around the current year or slightly in the past and `m` should be a large positive number. +This knowledge is provided as initial guess to the model fitting: + +```python +model = LinearGrowth(data_points=[*zip(x, y)]) + +# Guess x0 to be around the 2010s and m to be a large number +# nothing is known about A, so it is not provided +model.fit(p0={"x0": 2015, "m": 100_000}) + +# Resulting in parameters +print(model.x0, model.A, model.m) +> 2016.759002811191 -1481994.3776179291 2000000.0000000002 +``` + +As we can see, the fit for `m` now is the expected value. +The value for `x0` is still a bit off, and because `A` and `x0` are still competing against each other, the fit for `A` is also not as expected. +The model does however yield projected values that are corresponding to the expected values from the original function: + +```python +print(f"Projected: {model.project(2050)}, expected: {A + m * (2050 - x0)}") +> Projected: 64999999.99999994, expected: 65000000 +``` + +Best results for the quality of a fitted model can be achieved by combining the approaches and partially fixing a model as well as providing initial guesses. + +## Using models to create consistent datasets + +The main intention for models is for them to be used on combination with a `TechnologyCollection` to create consistent scenario for parameters over time. + +Given a `TechnologyCollection` with multiple entries for a technology, e.g. solar photovoltaics and one or more parameters, e.g. electricity supply and lifetime, models can be used to create consistent scenarios for this technology and parameters. + +Take for example the following `TechnologyCollection` for utility scale solar photovoltaics: + +```python +from technologydata import TechnologyCollection, Technology, Parameter +from technologydata.technologies.growth_models import ExponentialGrowth, LinearGrowth + +tc = TechnologyCollection( + technologies=[ + Technology( + case="historic", + name="Solar Photovoltaics", + detailed_technology="Any", + region="Global", + year=2010, + parameters={ + "electricity supply": Parameter(magnitude=1_000, units="PJ", carrier="electricity"), + "lifetime": Parameter(magnitude=20, units="years"), + "efficiency": Parameter(magnitude=0.22, units="%"), + "specific investment cost": Parameter(magnitude=600, units="USD_2024/kW"), + }, + ), + Technology( + case="historic", + name="Solar Photovoltaics", + detailed_technology="Any", + region="Global", + year=2022, + parameters={ + "electricity supply": Parameter(magnitude=6_000, units="PJ", carrier="electricity"), + "lifetime": Parameter(magnitude=24, units="years"), + "efficiency": Parameter(magnitude=0.20, units="%"), + "specific investment cost": Parameter(magnitude=400, units="USD_2024/kW"), + }, + ), + Technology( + case="IEA STEPS 2024", + name="Solar Photovoltaics", + detailed_technology="Any", + region="Global", + year=2030, + parameters={ + "electricity supply": Parameter(magnitude=26_000, units="PJ", carrier="electricity"), + "lifetime": Parameter(magnitude=30, units="years"), + "efficiency": Parameter(magnitude=0.21, units="%"), + "specific investment cost": Parameter(magnitude=300, units="USD_2024/kW"), + }, + ), + ] +) +``` + +By using models it is possible to create consistent scenarios for the parameters over time, e.g. for 2040 and 2050. +Using the `.project()` method of the `TechnologyCollection`, models can be specified for each parameter to be projected to specified years: + +```python +tc.project( + to_years=[2010, 2020, 2030, 2040, 2050], + parameters={ + "electricity supply": ExponentialGrowth(x0=2010, A=1_000), + "lifetime": LinearGrowth(x0=2010), + "efficiency": "mean", + "specific investment cost": "NaN", + }, +) +``` + +This returns a new `TechnologyCollection` with the entries for the years 2010, 2020, 2030, 2040 and 2050 and the four parameters projected according to the specified models: + +- for `electricity supply` an exponential growth model is assumed and fitted to the three data points from the original collection +- for `lifetime` a linear growth model is assumed, with the starting year fixed to 2010 and the remaining model parameters fitted to the data points +- for `efficiency` the mean of the data points is taken for all projected years, representing high quality and expensive solar panels being deployed in earlier years, then cheaper and less efficient panels being deployed in later years and then efficiency increasing again as technology improves and production methods get better +- for `specific investment cost` no model is provided and instead the value is set to `NaN` for all projected years; this carries over the `Parameter` into the projected collection, and only keeps it as a placeholder; this can be useful for cases where other methods will be used to fill the parameter values later, e.g. via an external model or manual input. + +The returning `TechnologyCollection` now has new values for all specified years. +The included values do not represent the original values, but modelled values using the original values. +That is also the reason why values from the original collection are different from the new collection, e.g. for 2010: +With the provided data and the requested model (`ExponentialGrowth`), the modelled yields a value of `1426.5 PJ` for 2010 instead of the original `1000 PJ`. + +An already existing and initialised model can also be provided to the `project` method. +This allows models to be reused across multiple projections, e.g. for different regions or technologies. + +A model can also be fit to data points before being provided to the `project` method, allowing more control over the fitting process like providing initial guesses `p0`: + +```python +model = tc.fit( + parameter="electricity supply", + model=ExponentialGrowth(x0=2010), + p0={"A": 1_000, "k": 0.2}, +) +print(model.model_dump(include=model.provided_parameters)) +> {'x0': 2010.0, 'A': 434.75658280114783, 'm': 565.2434171988522, 'k': 0.19058662818514885} +``` + +TODO: Might be helpful to allow passing `p0` directly to the `project` method or while instantiating a model +TODO: Would a method to allow keeping the original values in the `TechnologyCollection` be useful, or should this rather be done by the user merging the original and the returned collection? I believe the latter would be better design. + +### Model API + +- `add_data((x, y))`: Add a data point for fitting +- `fit()`: Fit model parameters to data +- `project(to_year)`: Project to a given year (parameters must be set) + +See the Python docstrings for each model for parameter details. diff --git a/docs/user_guide/class-diagram.puml b/docs/user_guide/class-diagram.puml index 20dac56c..1892e442 100644 --- a/docs/user_guide/class-diagram.puml +++ b/docs/user_guide/class-diagram.puml @@ -136,7 +136,8 @@ class TechnologyCollection { + to_csv(): str + to_dataframe(): pd.DataFrame + from_json(): TechnologyCollection - + create_projection(): TechnologyCollection + + create_projection(method: GrowthModel): TechnologyCollection + + learn(method: LearningModel): TechnologyCollection + __iter__() + __len__() ' TODO: Think about more methods here @@ -155,6 +156,80 @@ note right of TechnologyCollection::create_projection based on the Technology objects in the collection. Either returns a new TechnologyCollection or adds the Technology objects to the current collection. + Uses a GrowthModel (see below) to project values. +end note + +abstract class GrowthModel { + - data_points: list[tuple[float, float]] + - model_parameters: list[str] + - provided_parameters: dict[str, float] + - missing_parameters: list[str] + + add_data(data_points: tuple[float, float]): self + + project(to_x: float): float + + fit(p0): self + + _kwpartial(func: Callable, **fixed_kwargs): Callable + + function(x, ...): float // abstract method +} + +class LinearGrowth { + Project with linear growth model. + + - A + - m + + function(x, A, m) +} + +class ExponentialGrowth { + Project with exponential growth model. + + - A + - m + - k + - x0 + + function(x, A, m, k, x0) +} + +class LogisticGrowth { + Project with logistic growth model. + + - A + - L + - k + - x0 + + function(x, A, L, k, x0) +} + +class GompertzGrowth { + Project with Gompertz growth model. + + - A + - k + - x0 + - b + + function(x, A, k, x0, b) +} + +class GeneralLogisticGrowth { + Project with a general logistic growth model, + + - A + - K + - B + - Q + - C + - nu + + function(x, A, K, B, Q, C, nu) +} + +note right of GrowthModel + Abstract base for growth models used in projections. + Subclasses implement specific growth curve logic. + Each subclass should support two approaches: fitting around + data from the TechnologyCollection, and extrapolating using a + single value as support with parameters for the GrowthModels specified + by the user. + `project()` returns a new `TechnologyCollection` with + the original Technology objects and new objects for the projection. end note class SourceCollection { @@ -183,7 +258,7 @@ note left of SourceCollection::to_csv Export the source collection into a csv file. end note -note left of SourceCollection::to_dataframe +note right of SourceCollection::to_dataframe Export the source collection into a Pandas dataframe. end note @@ -219,4 +294,37 @@ Technology --> "*" Parameter : uses for its members TechnologyCollection --> "*" Technology : consists of SourceCollection --> "*" Source : consists of Datapackage --> "1" TechnologyCollection : contains +TechnologyCollection --> GrowthModel : used for learn(...) +GrowthModel <|-- LinearGrowth +GrowthModel <|-- ExponentialGrowth +GrowthModel <|-- LogisticGrowth +GrowthModel <|-- GompertzGrowth +GrowthModel <|-- GeneralLogisticGrowth + +abstract class LearningModel { + + project_costs(collection: TechnologyCollection): TechnologyCollection +} + +class ExperienceLearning { + Implements cost change via experience curve \n(cumulative experience). +} + +class ProductionLearning { + Implements cost change via production-based \nlearning (cumulative production). +} + +class TimebasedLearning { + Implements cost change via time-based learning \n(improvement over time). +} + +note right of LearningModel + Abstract base for learning models used in cost projections. + Subclasses implement specific learning logic. + `project_costs()` returns a new TechnologyCollection with cost projections. +end note + +TechnologyCollection --> LearningModel : uses for learn(...) \n (cost modifications) +LearningModel <|-- ExperienceLearning +LearningModel <|-- ProductionLearning +LearningModel <|-- TimebasedLearning @enduml diff --git a/pyproject.toml b/pyproject.toml index 299f7a5b..7e168f7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,7 @@ dependencies = [ "pydeflate>=2.1.3", "requests>=2.32.3", "savepagenow>=1.3.0", + "scipy>=1.16.1", ] [project.urls] @@ -114,6 +115,7 @@ source = [ # Static type checker settings [tool.mypy] +plugins = ["pydantic.mypy"] ignore_missing_imports = true no_implicit_optional = true warn_unused_ignores = true diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index d52e8361..10c0c340 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -23,7 +23,7 @@ logger = logging.getLogger(__name__) -class DataPackage(pydantic.BaseModel): # type: ignore +class DataPackage(pydantic.BaseModel): """ Container for a collection of Technology objects and/or Source objects, with batch operations and loading utilities. diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 07da137d..34d59200 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -26,7 +26,7 @@ logger = logging.getLogger(__name__) -class Parameter(BaseModel): # type: ignore +class Parameter(BaseModel): """ Encapsulate a value with its unit, provenance, notes, sources, and more optional attributes required to describe technology parameters, like carrier, and heating value. @@ -143,7 +143,7 @@ def to(self, units: str) -> Self: ) != technologydata.extract_currency_units(units): raise NotImplementedError( "Currency conversion is not supported in the `to` method. " - "Use `change_currency` for currency conversions." + "Use `to_currency` for currency conversions." ) self._pint_quantity = self._pint_quantity.to(units) @@ -155,7 +155,7 @@ def to(self, units: str) -> Self: provenance=self.provenance, note=self.note, sources=self.sources, - ) + ) # type: ignore def to_currency( self, target_currency: str, country: str, source: str = "worldbank" @@ -266,7 +266,7 @@ def to_currency( provenance=self.provenance, note=self.note, sources=self.sources, - ) + ) # type: ignore def change_heating_value(self, to_heating_value: str) -> Self: """ @@ -370,7 +370,7 @@ def change_heating_value(self, to_heating_value: str) -> Self: provenance=self.provenance, # TODO implement for this function note=self.note, sources=self.sources, - ) + ) # type: ignore def _check_parameter_compatibility(self, other: Self) -> None: """ @@ -433,7 +433,7 @@ def __add__(self, other: Self) -> Self: sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) ), - ) + ) # type: ignore def __sub__(self, other: Self) -> Self: """ @@ -468,7 +468,7 @@ def __sub__(self, other: Self) -> Self: sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) ), - ) + ) # type: ignore def __truediv__(self, other: int | float | Self) -> Self: """ @@ -504,7 +504,7 @@ def __truediv__(self, other: int | float | Self) -> Self: provenance=self.provenance, note=self.note, sources=self.sources, - ) + ) # type: ignore # We don't check general compatibility here, as division is not a common operation for parameters. # Only ensure that the heating values are compatible. @@ -537,7 +537,7 @@ def __truediv__(self, other: int | float | Self) -> Self: sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) ), - ) + ) # type: ignore def __mul__(self, other: int | float | Self) -> Self: """ @@ -576,7 +576,7 @@ def __mul__(self, other: int | float | Self) -> Self: provenance=self.provenance, note=self.note, sources=self.sources, - ) + ) # type: ignore # We don't check general compatibility here, as multiplication is not a common operation for parameters. # Only ensure that the heating values are compatible. @@ -605,7 +605,7 @@ def __mul__(self, other: int | float | Self) -> Self: sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) ), - ) + ) # type: ignore def __eq__(self, other: object) -> bool: """ @@ -669,4 +669,4 @@ def __pow__(self, exponent: float | int) -> Self: provenance=self.provenance, note=self.note, sources=self.sources, - ) + ) # type: ignore diff --git a/src/technologydata/source.py b/src/technologydata/source.py index c18a76c8..7fda6b9b 100644 --- a/src/technologydata/source.py +++ b/src/technologydata/source.py @@ -26,7 +26,7 @@ logger = logging.getLogger(__name__) -class Source(pydantic.BaseModel): # type: ignore +class Source(pydantic.BaseModel): """ Represent a data source, including bibliographic and web information. diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index f989f291..f4beb955 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -8,7 +8,6 @@ import json import pathlib import re -import typing from collections.abc import Iterator from typing import Annotated, Self @@ -19,7 +18,7 @@ from technologydata.source import Source -class SourceCollection(pydantic.BaseModel): # type: ignore +class SourceCollection(pydantic.BaseModel): """ Represent a collection of sources. @@ -34,7 +33,7 @@ class SourceCollection(pydantic.BaseModel): # type: ignore list[Source], pydantic.Field(description="List of Source objects.") ] - def __iter__(self) -> Iterator["Source"]: + def __iter__(self) -> Iterator["Source"]: # type: ignore """ Return an iterator over the list of Source objects. @@ -102,7 +101,7 @@ def get(self, title: str, authors: str) -> Self: s for s in filtered_sources if pattern_authors.search(s.authors) ] - return SourceCollection(sources=filtered_sources) + return SourceCollection(sources=filtered_sources) # type: ignore def retrieve_all_from_wayback( self, download_directory: pathlib.Path @@ -232,7 +231,6 @@ def from_json( # pydantic_core.from_json return Any. Therefore, typing.cast makes sure that # the output is indeed a TechnologyCollection - return typing.cast( - SourceCollection, - cls.model_validate(pydantic_core.from_json(json_data, allow_partial=True)), + return cls.model_validate( + pydantic_core.from_json(json_data, allow_partial=True) ) diff --git a/src/technologydata/technologies/__init__.py b/src/technologydata/technologies/__init__.py new file mode 100644 index 00000000..5cbb4a64 --- /dev/null +++ b/src/technologydata/technologies/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2025 The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Provide models to create scenario-specific technology projections.""" diff --git a/src/technologydata/technologies/growth_models.py b/src/technologydata/technologies/growth_models.py new file mode 100644 index 00000000..dbfa2774 --- /dev/null +++ b/src/technologydata/technologies/growth_models.py @@ -0,0 +1,502 @@ +# SPDX-FileCopyrightText: 2025 The technology-data authors +# +# SPDX-License-Identifier: MIT +"""Growth models for projecting technology parameters over time.""" + +import inspect +import logging +import typing +from abc import abstractmethod +from collections.abc import Callable +from typing import Annotated, Self + +import numpy as np +from pydantic import BaseModel, ConfigDict, Field +from scipy.optimize import curve_fit + +logger = logging.getLogger(__name__) + + +class GrowthModel(BaseModel): + """ + Abstract base for growth models used in projections. + + To implement a new growth model that inherits from this class, the following must be provided: + 1. A mathematical function representing the growth model by implementing the abstract method `function(self, x: float, **parameters) -> float`. + The parameters of the function (besides `x`) will be automatically detected and used for fitting and projection. + 2. The parameters should be defined as attributes of the class, initialized to `None` if they are to be fitted. + + pydantic configuration: + - `validate_assignment = True`: Ensures that any assignment to model attributes is validated, + as growth models may be created first with missing parameters (set to None) and then fitted later + and data points may be added after creation. + """ + + model_config = ConfigDict(validate_assignment=True) + + data_points: Annotated[ + list[tuple[float, float]], + Field(description="Data points (x, y) for fitting the model, where f(x) = y."), + ] = list() + + @abstractmethod + def function(self, *args: typing.Any, **kwargs: typing.Any) -> float | np.ndarray: + """Represent the growth model function.""" + pass + + @property + def model_parameters(self) -> list[str]: + """Return the set of model parameters that have been provided (are not None).""" + return [f for f in type(self).model_fields.keys() if f != "data_points"] + + @property + def provided_parameters(self) -> list[str]: + """Return the set of model parameters that have been provided (are not None).""" + return list( + self.model_dump( + include=set(self.model_parameters), exclude_none=True + ).keys() + ) + + @property + def missing_parameters(self) -> list[str]: + """Return the set of model parameters that are missing (have not been provided).""" + return [p for p in self.model_parameters if p not in self.provided_parameters] + + def add_data(self, data_point: tuple[float, float]) -> Self: + """Add a data point to the model for fitting.""" + self.data_points.append(data_point) + return self + + def project( + self, + to_year: int, + ) -> float: + """ + Project using the model to the specified year. + + This function uses the parameters that have been provided for the model either directly or through fitting to data points. + + Parameters + ---------- + to_year : int + The year to which to project the values. + + Returns + ------- + float + The projected value for the specified year. + + """ + if len(self.missing_parameters) > 0: + raise ValueError( + f"Cannot project. The following parameters have not been specified yet and are missing: {self.missing_parameters}." + ) + + return self.function( + to_year, **self.model_dump(include=set(self.provided_parameters)) + ) + + @classmethod + def _kwpartial( + cls, f: Callable[..., float], **fixed_params: dict[str, float] + ) -> Callable[..., float]: + """ + Like functools.partial, but for keyword arguments. + + Enables us to wrap a function in a way that is compatible with scipy.optimize.curve_fit, + which does not play nicely with standard functools.partial. + For details see: https://stackoverflow.com/questions/79749129/use-curve-fit-with-partial-using-named-parameters-instead-of-positional-para/79749198#79749198 + + """ + f_sig = inspect.signature(f) + positional_params = ( + inspect.Parameter.POSITIONAL_OR_KEYWORD, + inspect.Parameter.POSITIONAL_ONLY, + ) + args = [ + p.name for p in f_sig.parameters.values() if p.kind in positional_params + ] + new_args = [ + inspect.Parameter(arg, inspect.Parameter.POSITIONAL_OR_KEYWORD) + for arg in args + if arg not in fixed_params + ] + new_sig = inspect.Signature(new_args) + + def wrapper(*f_args: float, **f_kwargs: dict[str, float]) -> float: + bound_args = new_sig.bind(*f_args, **f_kwargs) + bound_args.apply_defaults() + return f(**bound_args.arguments, **fixed_params) + + wrapper.__signature__ = new_sig # type: ignore[attr-defined] + wrapper.__name__ = f"kwpartial({f.__name__}, {fixed_params})" + + return wrapper + + def fit(self, p0: dict[str, float] | None = None) -> Self: + """ + Fit the growth model using the parameters and data points provided to the model. + + Parameters + ---------- + p0 : dict[str, float], optional + Initial guesses for the missing parameters to be fitted. + May contain all or a subset of the missing parameters. + Any parameter not provided will be initialized with a starting guess of 1.0 (scipy's default). + + Returns + ------- + Self + The model instance with the fitted parameters set. + + Raises + ------ + ValueError + If there are not enough data points to fit the model. + + """ + # if all parameters of the model are already fixed, then we cannot fit anything + if len(self.provided_parameters) == len(self.model_parameters): + logger.info("All parameters are already fixed, cannot fit anything.") + return self + + # The number of data points must be at least equal to the number of parameters to fit + if len(self.data_points) < len(self.missing_parameters): + raise ValueError( + f"Not enough data points to fit the model. Need at least {len(self.missing_parameters)}, got {len(self.data_points)}." + ) + + # Fit the model to the data points: + # build a partial function that includes the already fixed parameters + func = self._kwpartial( + self.function, + **self.model_dump(include=set(self.provided_parameters), exclude_none=True), + ) + + # p0 optionally allows to provide initial guesses for the parameters to fit + if p0 is None: + p0 = {} + + # the dict needs to be transformed into a list with the parameters in the correct order + # if a parameter is missing from p0, we use 1 as a default initial guess (scipy's default) + p0_ = [p0.get(param, 1) for param in self.missing_parameters] + + # fit the function to the data points + xdata, ydata = zip(*self.data_points) + popt, pcov = curve_fit(f=func, xdata=xdata, ydata=ydata, p0=p0_) + + logger.debug(f"Fitted parameters: {popt}") + logger.debug(f"Covariance of the parameters: {pcov}") + + # assign the fitted parameters to the model + for param, value in zip(self.missing_parameters, popt): + logger.debug(f"Setting parameter {param} to fitted value {value}") + setattr(self, param, value) + + return self + + +class LinearGrowth(GrowthModel): + """Project with linear growth model.""" + + x0: Annotated[ + float | None, + Field( + description="The reference x-value (e.g., starting year) for the linear function.", + ), + ] = None + m: Annotated[ + float | None, + Field(description="Annual growth rate for the linear function."), + ] = None + A: Annotated[ + float | None, + Field(description="Starting value for the linear function."), + ] = None + + def function( + self, x: float | np.ndarray, x0: float, m: float, A: float + ) -> float | np.ndarray: + """ + Linear function for the growth model. + + f(x) = m * (x - x0) + a + + Parameters + ---------- + x : float | numpy Array + The input value(s) on which to evaluate the function, e.g. a year '2025'. + x0 : float + The reference x-value (e.g., starting year) for the linear function. + m : float, optional + The slope of the linear function. + A : float, optional + The constant offset of the linear function. + + Returns + ------- + float | numpy Array + The result(s) of the linear function evaluation at x. + + """ + return m * (x - x0) + A + + +class ExponentialGrowth(GrowthModel): + """Project with exponential growth model.""" + + x0: Annotated[ + float | None, + Field( + description="The reference x-value (e.g., starting year) for the exponential function.", + ), + ] = None + A: Annotated[ + float | None, + Field(description="Initial value for the exponential function."), + ] = None + m: Annotated[ + float | None, + Field(description="The multiplier for the exponential function."), + ] = None + k: Annotated[ + float | None, + Field(description="Growth rate for the exponential function."), + ] = None + + def function( + self, x: float | np.ndarray, x0: float, A: float, m: float, k: float + ) -> float | np.ndarray: + """ + Exponential function for the growth model. + + f(x) = A + m * exp(k * (x - x0)) + + Parameters + ---------- + x : float | numpy Array + The input value(s) on which to evaluate the function, e.g. a year '2025'. + x0 : float + The reference x-value (e.g., starting year) for the exponential function. + A : float + The lower horizontal asymptote of the exponential function. + m : float + The initial value of the exponential function. + k : float + The growth rate of the exponential function. + + Returns + ------- + float | numpy Array + The result(s) of the exponential function evaluation at x. + + """ + return A + m * np.exp(k * (x - x0)) + + +class GeneralLogisticGrowth(GrowthModel): + """Project with a generalized logistic growth model.""" + + x0: Annotated[ + float | None, + Field( + description="The x-value of the sigmoid's midpoint (inflection point/midpoint year).", + ), + ] = None + A: Annotated[ + float | None, + Field( + description="The lower horizontal asymptote of the logistic function.", + ), + ] = None + K: Annotated[ + float | None, + Field( + description="The upper horizontal asymptote of the logistic function for C=1.", + ), + ] = None + B: Annotated[ + float | None, + Field( + description="The growth rate of the logistic function.", + ), + ] = None + Q: Annotated[ + float | None, + Field( + description="Parameter related to the value of f(0).", + ), + ] = None + C: Annotated[ + float | None, + Field( + description="Parameter related to the upper horizontal asymptote, often set to 1.", + ), + ] = None + nu: Annotated[ + float | None, + Field( + description="Parameter affecting near which asymptote the maximum growth occurs.", + ), + ] = None + + def function( + self, + x: float | np.ndarray, + x0: float, + A: float, + K: float, + B: float, + Q: float, + C: float, + nu: float, + ) -> float | np.ndarray: + """ + Generalized logistic function for the growth model. + + f(x) = A + (K - A) / (C + Q * exp(-B * (x - M)))^(1/nu) + + Parameters + ---------- + x : float | numpy Array + The input value(s) on which to evaluate the function, e.g. a year '2025'. + x0 : float + The x-value of the sigmoid's midpoint (inflection point). + A : float + The lower horizontal asymptote of the logistic function. + K : float + The upper horizontal asymptote of the logistic function for C=1. + If A=0 and C=1, then K is the carrying capacity. + B : float + The growth rate of the logistic function. + Q : float + Related to the value of f(0). + C : float + Parameter related to the upper horizontal asymptote, often set to 1. + nu : float + Parameter affecting near which asymptote the maximum growth occurs. + + Returns + ------- + float | numpy Array + The result(s) of the generalized logistic function evaluation at x. + + """ + return A + (K - A) / (C + Q * np.exp(-B * (x - x0))) ** (1.0 / nu) + + +class LogisticGrowth(GrowthModel): + """Project with a logistic growth model.""" + + x0: Annotated[ + float | None, + Field( + description="The x-value of the sigmoid's midpoint (inflection point/midpoint year).", + ), + ] = None + A: Annotated[ + float | None, + Field( + description="The lower horizontal asymptote of the logistic function.", + ), + ] = None + L: Annotated[ + float | None, + Field( + description="Carrying capacity of the logistic function.", + ), + ] = None + k: Annotated[ + float | None, + Field( + description="Growth rate of the logistic function.", + ), + ] = None + + def function( + self, x: float | np.ndarray, x0: float, A: float, L: float, k: float + ) -> float | np.ndarray: + """ + Logistic function for the growth model. + + f(x) = A + L / (1 + exp(-k * (x - x0))) + + Parameters + ---------- + x : float | numpy Array + The input value(s) on which to evaluate the function, e.g. a year '2025'. + x0 : float + The x-value of the sigmoid's midpoint (inflection point). + A : float + The lower horizontal asymptote of the logistic function. + L : float + The carrying capacity of the logistic function. + k : float + The growth rate of the logistic function. + + Returns + ------- + float | numpy Array + The result(s) of the logistic function evaluation at x. + + """ + return A + L / (1 + np.exp(-k * (x - x0))) + + +class GompertzGrowth(GrowthModel): + """Project with a Gompertz growth model.""" + + A: Annotated[ + float | None, + Field( + description="The upper asymptote (maximum value) of the Gompertz function.", + ), + ] = None + k: Annotated[ + float | None, + Field( + description="The growth rate of the Gompertz function.", + ), + ] = None + x0: Annotated[ + float | None, + Field( + description="The x-value of the inflection point (midpoint year) of the Gompertz function.", + ), + ] = None + b: Annotated[ + float | None, + Field( + description="The displacement along the x-axis of the Gompertz function.", + ), + ] = None + + def function( + self, x: float | np.ndarray, A: float, k: float, x0: float, b: float + ) -> float | np.ndarray: + """ + Gompertz function for the growth model. + + f(x) = A * exp(-b * exp(-k * (x - x0))) + + Parameters + ---------- + x : float | numpy Array + The input value(s) on which to evaluate the function, e.g. a year '2025'. + A : float + The upper asymptote (maximum value) of the Gompertz function. + k : float + The growth rate of the Gompertz function. + x0 : float + The x-value of the inflection point (midpoint year) of the Gompertz function. + b : float + The displacement along the x-axis of the Gompertz function. + + Returns + ------- + float | numpy Array + The result(s) of the Gompertz function evaluation at x. + + """ + return A * np.exp(-b * np.exp(-k * (x - x0))) diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 304053ea..6f94a5cb 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -14,7 +14,7 @@ from technologydata.parameter import Parameter -class Technology(pydantic.BaseModel): # type: ignore +class Technology(pydantic.BaseModel): """ Represent a technology with region, year, and a flexible set of parameters. diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index c51e53d8..00b88005 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -6,9 +6,9 @@ import csv import json +import logging import pathlib import re -import typing from collections.abc import Iterator from typing import Annotated, Self @@ -16,10 +16,14 @@ import pydantic import pydantic_core +from technologydata.parameter import Parameter +from technologydata.technologies.growth_models import GrowthModel, LinearGrowth from technologydata.technology import Technology +logger = logging.getLogger(__name__) -class TechnologyCollection(pydantic.BaseModel): # type: ignore + +class TechnologyCollection(pydantic.BaseModel): """ Represent a collection of technologies. @@ -34,7 +38,7 @@ class TechnologyCollection(pydantic.BaseModel): # type: ignore list[Technology], pydantic.Field(description="List of Technology objects.") ] - def __iter__(self) -> Iterator[Technology]: + def __iter__(self) -> Iterator[Technology]: # type: ignore """ Return an iterator over the list of Technology objects. @@ -117,7 +121,7 @@ def get( if pattern_detailed_technology.search(t.detailed_technology) ] - return TechnologyCollection(technologies=filtered_technologies) + return TechnologyCollection(technologies=filtered_technologies) # type: ignore def to_dataframe(self) -> pandas.DataFrame: """ @@ -232,9 +236,8 @@ def from_json(cls, file_path: pathlib.Path | str) -> Self: # pydantic_core.from_json return Any. Therefore, typing.cast makes sure that # the output is indeed a TechnologyCollection - return typing.cast( - TechnologyCollection, - cls.model_validate(pydantic_core.from_json(json_data, allow_partial=True)), + return cls.model_validate( + pydantic_core.from_json(json_data, allow_partial=True) ) def to_currency( @@ -277,4 +280,180 @@ def to_currency( ) ) - return TechnologyCollection(technologies=new_techs) + return TechnologyCollection(technologies=new_techs) # type: ignore + + def fit( + self, parameter: str, model: GrowthModel, p0: dict[str, float] | None = None + ) -> GrowthModel: + """ + Fit a growth model to a specified parameter across all technologies in the collection. + + This method aggregates data points for the specified parameter from all technologies + in the collection, adds them to the provided growth model, and fits the model using + the initial parameter guesses provided in `p0`. + + Parameters + ---------- + parameter : str + The name of the parameter to fit the model to (e.g., "installed capacity"). + model : GrowthModel + An instance of a growth model (e.g., LinearGrowth, ExponentialGrowth) to be fitted. + May already be partially initialized with some parameters and/or data points. + p0 : dict[str, float], optional + Initial guess for the model parameters. + + Returns + ------- + GrowthModel + The fitted growth model with optimized parameters. + + Raises + ------ + ValueError + If the collection contains incompatible parameters with different units, heating values, or carriers. + + """ + first_param = None + # Aggregate data points for the specified parameter from all technologies + for tech in self.technologies: + param = tech.parameters[parameter] + if first_param is None: + first_param = param + + try: + first_param._check_parameter_compatibility(param) + except ValueError as e: + raise ValueError( + f"The collection contains one or more parameters with incompatible units/heating values/carriers:\n" + f"* {first_param}, and\n" + f"* {param}." + ) from e + + model.add_data((tech.year, param.magnitude)) + + # Fit the model using the provided initial parameter guesses + model.fit(p0=p0) + + return model + + def project( + self, + to_years: list[int], + parameters: dict[str, GrowthModel | str], + ) -> Self: + """ + Project specified parameters for all technologies in the collection to future years. + + This method uses the provided growth models to project the specified parameters + for each technology in the collection to the given future years. + + To keep other parameters that should not be projected, add them to the dictionary as well + without a growth model. Instead, there are other options available: + 'mean', 'closest' and 'NaN'. + 'mean' will set the parameter to the mean of all existing values in the collection, + while 'NaN' will add the parameter with NaN values as a placeholder. + 'closest' will set the parameter to the value of the closest year in the original data, + with a preference for past years if equidistant. (Not yet implemented.) + + The method creates new Technology objects for each combination of original technology + and future year, applying the appropriate growth model projections. + + Parameters + ---------- + to_years : list[int] + List of future years to which the parameters should be projected. + parameters : dict[str, GrowthModel | str] + A dictionary mapping parameter names to their respective growth models for projection. + If provided, `parameter` and `model` cannot be used. + To keep other parameters without projecting, available options are 'mean', 'closest' and 'NaN'. + + Returns + ------- + TechnologyCollection + A new TechnologyCollection with technologies projected to the specified future years. + + Raises + ------ + ValueError + If neither `parameter` and `model`, or `parameters` are not or all provided. + + Examples + -------- + >>> tc.project( + ... to_years=[2030, 2040], + ... parameters={ + ... "installed capacity": LinearGrowth(m=0.5, A=10), + ... "lifetime": "mean", + ... "efficiency": "NaN" + ... } + ... ) + + """ + logger.debug(f"Projecting parameters as follows: {parameters}") + + projected_technologies = [] + for to_year in to_years: + # Create a new Technology object for the projected year + new_tech = Technology( + name=self.technologies[0].name, + region=self.technologies[0].region, + year=to_year, + case=self.technologies[0].case, + detailed_technology=self.technologies[0].detailed_technology, + parameters={}, + ) + + for param, model in parameters.items(): + new_param: Parameter + + # Trick: A linear growth with m=0 returns the mean of the provided data points + # this way we can reuse the logic already implemented for fitting and projecting below + if model == "mean": + model = LinearGrowth(m=0) + + if isinstance(model, GrowthModel): + # Fit the model to the parameter data + model = self.fit(param, model.model_copy()) + + # Project the model to the specified future years + param_value = model.project(to_year) + + logger.debug( + f"Resulting model for {param} in year {to_year}: {model}" + ) + # Add the projected parameter to the new technology + new_param = ( + self.technologies[0] + .parameters[param] + .model_copy( + deep=True, + update={ + "magnitude": param_value, + "provenance": f"Projected to {to_year} using {model}.", + "note": None, # Clear any existing note + "sources": None, # Clear any existing sources + }, + ) + ) + + elif model == "NaN": + new_param = Parameter( + magnitude=float("nan"), + note="Placeholder parameters with NaN value.", + ) + elif model == "closest": + raise NotImplementedError( + "'closest' option for '{param}' not yet implemented." + ) # TODO + else: + raise ValueError( + f"Unexpected model type for parameter '{param}': {model}" + ) + + new_tech.parameters[param] = new_param + + logger.debug(f"Projected technology for year {to_year}: {new_tech}") + + projected_technologies.append(new_tech) + + return TechnologyCollection(technologies=projected_technologies) # type: ignore diff --git a/test/test_growth_models.py b/test/test_growth_models.py new file mode 100644 index 00000000..a29a10f9 --- /dev/null +++ b/test/test_growth_models.py @@ -0,0 +1,281 @@ +# SPDX-FileCopyrightText: 2025 The technology-data authors +# SPDX-License-Identifier: MIT +"""Unit tests for growth models in technologydata.technologies.growth_models.""" + +import numpy as np +import pytest + +from technologydata.technologies.growth_models import ( + ExponentialGrowth, + GeneralLogisticGrowth, + GompertzGrowth, + LinearGrowth, + LogisticGrowth, +) + + +def test_linear_add_data_points() -> None: + """Test adding data points to LinearGrowth model.""" + x0 = 0 + m = 2.0 + A = 1.0 + + x = np.arange(-10, 30) + y = m * x + A + + model = LinearGrowth() + for xi, yi in zip(x, y): + model.add_data((xi, yi)) + model.fit(p0={"x0": x0, "m": m, "A": A}) + + assert model.x0 == pytest.approx(x0, rel=1e-2) + assert model.m == pytest.approx(m, rel=1e-2) + assert model.A == pytest.approx(A, rel=1e-2) + + +def test_linear_growth_projection() -> None: + """Test the projection method of LinearGrowth.""" + x0 = 0 + m = 2.0 + A = 5.0 + x = 10 + model = LinearGrowth(x0=x0, m=2.0, A=5.0, data_points=[]) + assert model.project(10) == pytest.approx(m * x + A) + + +def test_linear_growth_fit() -> None: + """Test fitting of the LinearGrowth model.""" + x0 = 0 + m = 2.0 + A = 1.0 + + x = np.arange(-10, 30) + y = m * x + A + + model = LinearGrowth(x0=x0, m=None, A=None, data_points=[*zip(x, y)]) + model.fit(p0={"x0": x0, "m": m, "A": A}) + assert model.x0 == pytest.approx(x0, rel=1e-2) + assert model.m == pytest.approx(m, rel=1e-2) + assert model.A == pytest.approx(A, rel=1e-2) + + +def test_exponential_growth_projection() -> None: + """Test the projection method of ExponentialGrowth.""" + A = 2.0 + m = 1.0 + k = 0.5 + x0 = 0.0 + x = 2 + + model = ExponentialGrowth(A=A, m=m, k=k, x0=x0, data_points=[]) + assert model.project(2) == pytest.approx(A + m * np.exp(k * (x - x0))) + + +def test_exponential_growth_fit() -> None: + """Test fitting of the ExponentialGrowth model.""" + A = 2.0 + m = 1.0 + k = 0.5 + x0 = 0.0 + + x = np.arange(0, 30) + y = A + m * np.exp(k * (x - x0)) + + model = ExponentialGrowth(A=None, m=None, k=None, x0=None, data_points=[*zip(x, y)]) + model.fit(p0={"A": A, "m": m, "k": k, "x0": x0}) + + assert model.A == pytest.approx(A, rel=1e-2) + assert model.m == pytest.approx(m, rel=1e-2) + assert model.k == pytest.approx(k, rel=1e-2) + assert model.x0 == pytest.approx(x0, rel=1e-2) + + +def test_logistic_growth_projection() -> None: + """Test the projection method of LogisticGrowth.""" + A = 2.0 + L = 10.0 + k = 1.0 + x0 = 0.0 + + model = LogisticGrowth(A=A, L=L, k=k, x0=x0, data_points=[]) + assert model.project(0) == pytest.approx(A + L / (1 + np.exp(-k * (0 - x0)))) + + +def test_logistic_growth_fit() -> None: + """Test fitting of the LogisticGrowth model.""" + A = 2.0 + L = 10.0 + k = 1.0 + x0 = 0.0 + + x = np.arange(-2, 30) + y = A + L / (1 + np.exp(-k * (x - x0))) + + model = LogisticGrowth(A=None, L=None, k=None, x0=None, data_points=[*zip(x, y)]) + model.fit(p0={"A": A, "L": L, "k": k, "x0": x0}) + + assert model.A == pytest.approx(A, rel=1e-2) + assert model.L == pytest.approx(L, rel=1e-2) + assert model.k == pytest.approx(k, rel=1e-2) + assert model.x0 == pytest.approx(x0, rel=1e-2) + + +def test_gompertz_growth_projection() -> None: + """Test the projection method of GompertzGrowth.""" + A = 10.0 + k = 1.0 + x0 = 0.0 + b = 1.0 + + model = GompertzGrowth(A=A, k=k, x0=x0, b=b, data_points=[]) + + assert model.project(0) == pytest.approx(A * np.exp(-b * np.exp(-k * (0 - x0)))) + + +def test_gompertz_growth_fit() -> None: + """Test fitting of the GompertzGrowth model.""" + A = 10.0 + k = 1.0 + x0 = 0.0 + b = 1.0 + + x = np.arange(-2, 30) + y = A * np.exp(-b * np.exp(-k * (x - x0))) + + model = GompertzGrowth(A=None, k=None, x0=None, b=None, data_points=[*zip(x, y)]) + model.fit(p0={"A": A, "k": k, "x0": x0, "b": b}) + + assert model.A == pytest.approx(A, rel=1e-2) + assert model.k == pytest.approx(k, rel=1e-2) + assert model.x0 == pytest.approx(x0, rel=1e-2) + assert model.b == pytest.approx(b, rel=1e-2) + + +def test_general_logistic_growth_projection() -> None: + """Test the projection method of GeneralLogisticGrowth.""" + x0 = 0 + A = 2.0 + K = 10.0 + B = 1.0 + nu = 1.0 + Q = 1.0 + C = 1.0 + + model = GeneralLogisticGrowth(x0=x0, A=A, K=K, B=B, nu=nu, Q=Q, C=C, data_points=[]) + + assert model.project(0) == pytest.approx(model.function(0, x0, A, K, B, nu, Q, C)) + + +def test_general_logistic_growth_fit() -> None: + """Test fitting of the GeneralLogisticGrowth model.""" + x0 = 0 + A = 2.0 + K = 10.0 + B = 1.0 + nu = 1.0 + Q = 1.0 + C = 1.0 + + x: np.array = np.arange(-2, 30) + y: np.array = GeneralLogisticGrowth().function(x, x0, A, K, B, Q, C, nu) + + model = GeneralLogisticGrowth(data_points=[*zip(x, y)]) + model.fit(p0={"x0": x0, "A": A, "K": K, "B": B, "nu": nu, "Q": Q, "C": C}) + + assert model.A == pytest.approx(A, rel=1e-2) + assert model.K == pytest.approx(K, rel=1e-2) + assert model.B == pytest.approx(B, rel=1e-2) + assert model.nu == pytest.approx(nu, rel=1e-2) + assert model.Q == pytest.approx(Q, rel=1e-2) + assert model.C == pytest.approx(C, rel=1e-2) + + +# TODO: Add tests for +# - partial fitting (some parameters fixed) +# - fitting with noise/without p0 +# - illegal arguments to p0 + + +def test_partial_fitting_linear_growth() -> None: + """Test fitting LinearGrowth with one parameter fixed and one to fit.""" + x0 = 0 + m = 2.0 + A = 1.0 + x: np.array = np.arange(-10, 30) + y: np.array = LinearGrowth().function(x, x0, m, A) + + # Fix x0 and m, only fit A + model = LinearGrowth(x0=x0, m=m, A=None, data_points=[*zip(x, y)]) + model.fit(p0={"A": A * 0.5}) + + assert model.m == pytest.approx(m, rel=1e-2) + assert model.A == pytest.approx(A, rel=1e-2) + + +def test_fit_with_noisy_data() -> None: + """Test fitting LinearGrowth with noisy data to check robustness.""" + rng = np.random.default_rng(42) + x0 = 0 + m = 2.0 + A = 20.0 + x: np.array = np.arange(-10, 30) + noise = rng.normal(0, 0.1, size=x.shape) + y: np.array = LinearGrowth().function(x, x0, m, A) + noise + + # Fitting with x0 and A free can lead to competing solutions, so fix x0 + model = LinearGrowth(x0=x0, data_points=[*zip(x, y)]) + model.fit() + + # Should be close to true values despite noise + assert model.m == pytest.approx(m, rel=1e-1) + assert model.A == pytest.approx(A, rel=1e-1) + + +def test_fit_without_p0() -> None: + """Test fitting LinearGrowth without providing p0 (should use defaults and still work).""" + x0 = 0 + m = 10.0 + A = 5.0 + x: np.array = np.arange(-25, 25) + y: np.array = LinearGrowth().function(x, x0, m, A) + + # Fix x0 to avoid competing solutions + model = LinearGrowth(x0=x0, data_points=[*zip(x, y)]) + model.fit() # No p0 provided + + assert model.m == pytest.approx(m, rel=1e-2) + assert model.A == pytest.approx(A, rel=1e-2) + + +def test_illegal_p0_argument() -> None: + """Test that fitting works with missing p0 keys (should use defaults, not raise).""" + x0 = 5 + m = 2.0 + A = 1.0 + x: np.array = np.arange(-10, 30) + y: np.array = LinearGrowth().function(x, x0, m, A) + + model = LinearGrowth(data_points=[*zip(x, y)]) + # Provide p0 missing one parameter (A missing) + model.fit(p0={"x0": x0, "m": m}) + + # Should still fit correctly + assert model.m == pytest.approx(m, rel=1e-2) + assert model.A == pytest.approx(A, rel=1e-2) + + +def test_fit_with_p0_far_from_target() -> None: + """Test fitting LinearGrowth with p0 far from the true values (should still converge).""" + x0 = 0 + m = 20.0 + A = 5.0 + x: np.array = np.arange(-10, 30) + y: np.array = LinearGrowth().function(x, x0, m, A) + + # Fix x0 to avoid competing solutions + model = LinearGrowth(x0=x0, data_points=[*zip(x, y)]) + # Provide p0 far from the actual values + model.fit(p0={"m": m * 10, "A": A * -2}) + + assert model.m == pytest.approx(m, rel=1e-2) + assert model.A == pytest.approx(A, rel=1e-2) diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index c2608f63..57b0f609 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -138,6 +138,144 @@ def test_get( assert isinstance(result, technologydata.TechnologyCollection) assert len(result.technologies) == 1 + def test_fit_linear_growth(self) -> None: + """Test TechnologyCollection.fit with LinearGrowth model.""" + tech = technologydata.Technology( + name="Amazing technology", + detailed_technology="", + region="", + case="", + year=2020, + parameters={ + "total units": technologydata.Parameter(magnitude=2020), + }, + ) + + tc = technologydata.TechnologyCollection( + technologies=[ + tech, + tech.model_copy( + deep=True, + update={ + "year": 2030, + "parameters": { + "total units": technologydata.Parameter(magnitude=2030), + }, + }, + ), + tech.model_copy( + deep=True, + update={ + "year": 2040, + "parameters": { + "total units": technologydata.Parameter(magnitude=2040), + }, + }, + ), + ] + ) + + # Fit 'total units' parameter with LinearGrowth + from technologydata.technologies.growth_models import LinearGrowth + + model = LinearGrowth() + fitted = tc.fit("total units", model, p0={"x0": 0, "m": 1, "A": 0}) + assert isinstance(fitted, LinearGrowth) + print(fitted) + assert pytest.approx(fitted.x0) == 0 + assert pytest.approx(fitted.m) == 1 + assert pytest.approx(fitted.A) == 0 + + def test_project_linear_growth(self) -> None: + """Test TechnologyCollection.project with LinearGrowth model.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + tc = technologydata.TechnologyCollection.from_json(input_file) + from technologydata.technologies.growth_models import LinearGrowth + + projected_tc = tc.project( + to_years=[2030], + parameters={"capacity": LinearGrowth(x0=2020)}, + ) + assert isinstance(projected_tc, technologydata.TechnologyCollection) + assert projected_tc.technologies[0].year == 2030 + assert "capacity" in projected_tc.technologies[0].parameters + assert isinstance( + projected_tc.technologies[0].parameters["capacity"].magnitude, float + ) + + # non-projected parameters should not be present + assert "investment" not in projected_tc.technologies[0].parameters + + def test_project_other_parameter_options(self) -> None: + """Test projection of parameters using 'mean', 'closest', and 'NaN' options.""" + tech = technologydata.Technology( + name="Amazing technology", + detailed_technology="", + region="", + case="", + year=2020, + parameters={ + "total units": technologydata.Parameter(magnitude=2000), + }, + ) + + tc = technologydata.TechnologyCollection( + technologies=[ + tech, + tech.model_copy( + deep=True, + update={ + "year": 2030, + "parameters": { + "total units": technologydata.Parameter(magnitude=3000), + }, + }, + ), + ] + ) + + ptc = tc.project( + to_years=[2025], + parameters={ + "total units": "mean", + }, + ) + + assert ( + pytest.approx( + ( + tc.technologies[0].parameters["total units"].magnitude + + tc.technologies[1].parameters["total units"].magnitude + ) + / 2, + ) + == ptc.technologies[0].parameters["total units"].magnitude + ) + + ptc = tc.project( + to_years=[2025], + parameters={ + "total units": "NaN", + }, + ) + + assert pandas.isna(ptc.technologies[0].parameters["total units"].magnitude) + + # "closest" currently raises NotImplementedError + with pytest.raises(NotImplementedError): + _ = tc.project( + to_years=[2025], + parameters={ + "total units": "closest", + }, + ) + def test_to_currency(self) -> None: """Test currency conversion for all technologies in the collection.""" input_file = pathlib.Path( diff --git a/uv.lock b/uv.lock index d1d98700..6f09e707 100644 --- a/uv.lock +++ b/uv.lock @@ -1,77 +1,82 @@ version = 1 -revision = 2 +revision = 1 requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.14' and platform_python_implementation != 'PyPy'", + "platform_python_implementation == 'PyPy'", +] [[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, upload_time = "2024-05-20T21:33:25.928Z" } +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, upload_time = "2024-05-20T21:33:24.1Z" }, + { 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 = "appnope" version = "0.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } +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, upload_time = "2024-02-06T09:43:09.663Z" }, + { 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 = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } +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, upload_time = "2024-11-30T04:30:10.946Z" }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] [[package]] name = "backrefs" version = "5.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload_time = "2025-06-22T19:34:13.97Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857 } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload_time = "2025-06-22T19:34:05.252Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload_time = "2025-06-22T19:34:06.743Z" }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload_time = "2025-06-22T19:34:08.172Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload_time = "2025-06-22T19:34:09.68Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload_time = "2025-06-22T19:34:11.037Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267 }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072 }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947 }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843 }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762 }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265 }, ] [[package]] name = "beautifulsoup4" -version = "4.13.4" +version = "4.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113 }, ] [[package]] @@ -81,9 +86,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload_time = "2017-08-03T15:55:25.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054 } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload_time = "2017-08-03T15:55:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006 }, ] [[package]] @@ -93,9 +98,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload_time = "2024-10-29T18:30:40.477Z" } +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, upload_time = "2024-10-29T18:30:38.186Z" }, + { 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] @@ -107,9 +112,9 @@ css = [ name = "boolean-py" version = "5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577 }, ] [[package]] @@ -119,9 +124,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload_time = "2024-06-18T10:56:06.741Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096 } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload_time = "2024-06-18T10:55:59.489Z" }, + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611 }, ] [[package]] @@ -135,104 +140,135 @@ dependencies = [ { name = "pillow" }, { name = "tinycss2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload_time = "2025-05-15T06:56:32.653Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590 } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload_time = "2025-05-15T06:56:28.552Z" }, + { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773 }, ] [[package]] name = "certifi" -version = "2025.7.9" +version = "2025.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/8a/c729b6b60c66a38f590c4e774decc4b2ec7b0576be8f1aa984a53ffa812a/certifi-2025.7.9.tar.gz", hash = "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", size = 160386, upload_time = "2025-07-09T02:13:58.874Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386 } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/f3/80a3f974c8b535d394ff960a11ac20368e06b736da395b551a49ce950cce/certifi-2025.7.9-py3-none-any.whl", hash = "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39", size = 159230, upload_time = "2025-07-09T02:13:57.007Z" }, + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216 }, ] [[package]] name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271 }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048 }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529 }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097 }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519 }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572 }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963 }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361 }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932 }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557 }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762 }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230 }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043 }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446 }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101 }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948 }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422 }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499 }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928 }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302 }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909 }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402 }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780 }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320 }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487 }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049 }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793 }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300 }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244 }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828 }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926 }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328 }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650 }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687 }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773 }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013 }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593 }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354 }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480 }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584 }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443 }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437 }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487 }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726 }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195 }, ] [[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, upload_time = "2023-08-12T20:38:17.776Z" } +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, upload_time = "2023-08-12T20:38:16.269Z" }, + { 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 = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, ] [[package]] name = "charset-normalizer" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload_time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload_time = "2025-05-02T08:32:33.712Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload_time = "2025-05-02T08:32:35.768Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload_time = "2025-05-02T08:32:37.284Z" }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload_time = "2025-05-02T08:32:38.803Z" }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload_time = "2025-05-02T08:32:40.251Z" }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload_time = "2025-05-02T08:32:41.705Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload_time = "2025-05-02T08:32:43.709Z" }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload_time = "2025-05-02T08:32:46.197Z" }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload_time = "2025-05-02T08:32:48.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload_time = "2025-05-02T08:32:49.719Z" }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload_time = "2025-05-02T08:32:51.404Z" }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload_time = "2025-05-02T08:32:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload_time = "2025-05-02T08:32:54.573Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload_time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload_time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload_time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload_time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload_time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload_time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload_time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload_time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload_time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload_time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload_time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload_time = "2025-05-02T08:33:17.06Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload_time = "2025-05-02T08:33:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload_time = "2025-05-02T08:34:40.053Z" }, +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655 }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223 }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366 }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104 }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830 }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854 }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670 }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501 }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173 }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822 }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543 }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326 }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008 }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196 }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819 }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350 }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644 }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468 }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187 }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699 }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580 }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366 }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342 }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995 }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640 }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636 }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939 }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580 }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870 }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797 }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224 }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086 }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400 }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175 }, ] [[package]] @@ -242,136 +278,164 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload_time = "2025-05-20T23:19:49.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload_time = "2025-05-20T23:19:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +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, upload_time = "2022-10-25T02:36:20.889Z" }, + { 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" +version = "0.2.3" 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, upload_time = "2024-03-12T16:53:41.133Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload_time = "2024-03-12T16:53:39.226Z" }, + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294 }, ] [[package]] name = "coverage" -version = "7.10.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938, upload_time = "2025-07-27T14:13:39.045Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934, upload_time = "2025-07-27T14:11:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173, upload_time = "2025-07-27T14:11:38.005Z" }, - { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190, upload_time = "2025-07-27T14:11:39.887Z" }, - { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618, upload_time = "2025-07-27T14:11:41.841Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081, upload_time = "2025-07-27T14:11:43.705Z" }, - { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990, upload_time = "2025-07-27T14:11:45.244Z" }, - { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191, upload_time = "2025-07-27T14:11:47.093Z" }, - { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400, upload_time = "2025-07-27T14:11:48.643Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338, upload_time = "2025-07-27T14:11:50.258Z" }, - { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125, upload_time = "2025-07-27T14:11:52.034Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523, upload_time = "2025-07-27T14:11:53.965Z" }, - { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960, upload_time = "2025-07-27T14:11:55.959Z" }, - { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220, upload_time = "2025-07-27T14:11:57.899Z" }, - { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772, upload_time = "2025-07-27T14:12:00.422Z" }, - { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116, upload_time = "2025-07-27T14:12:03.099Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554, upload_time = "2025-07-27T14:12:04.668Z" }, - { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766, upload_time = "2025-07-27T14:12:06.234Z" }, - { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735, upload_time = "2025-07-27T14:12:08.305Z" }, - { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118, upload_time = "2025-07-27T14:12:09.903Z" }, - { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381, upload_time = "2025-07-27T14:12:11.535Z" }, - { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152, upload_time = "2025-07-27T14:12:13.182Z" }, - { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559, upload_time = "2025-07-27T14:12:14.807Z" }, - { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677, upload_time = "2025-07-27T14:12:16.68Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899, upload_time = "2025-07-27T14:12:18.758Z" }, - { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140, upload_time = "2025-07-27T14:12:20.357Z" }, - { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005, upload_time = "2025-07-27T14:12:22.007Z" }, - { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143, upload_time = "2025-07-27T14:12:23.746Z" }, - { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735, upload_time = "2025-07-27T14:12:25.73Z" }, - { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871, upload_time = "2025-07-27T14:12:27.767Z" }, - { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692, upload_time = "2025-07-27T14:12:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059, upload_time = "2025-07-27T14:12:31.076Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150, upload_time = "2025-07-27T14:12:32.746Z" }, - { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014, upload_time = "2025-07-27T14:12:34.406Z" }, - { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951, upload_time = "2025-07-27T14:12:36.069Z" }, - { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229, upload_time = "2025-07-27T14:12:37.759Z" }, - { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738, upload_time = "2025-07-27T14:12:39.453Z" }, - { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045, upload_time = "2025-07-27T14:12:41.387Z" }, - { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666, upload_time = "2025-07-27T14:12:43.056Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692, upload_time = "2025-07-27T14:12:44.83Z" }, - { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536, upload_time = "2025-07-27T14:12:46.527Z" }, - { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954, upload_time = "2025-07-27T14:12:49.279Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616, upload_time = "2025-07-27T14:12:51.214Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412, upload_time = "2025-07-27T14:12:53.429Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776, upload_time = "2025-07-27T14:12:55.482Z" }, - { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698, upload_time = "2025-07-27T14:12:57.225Z" }, - { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902, upload_time = "2025-07-27T14:12:59.071Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230, upload_time = "2025-07-27T14:13:01.248Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194, upload_time = "2025-07-27T14:13:03.247Z" }, - { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316, upload_time = "2025-07-27T14:13:04.957Z" }, - { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794, upload_time = "2025-07-27T14:13:06.715Z" }, - { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869, upload_time = "2025-07-27T14:13:08.933Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765, upload_time = "2025-07-27T14:13:10.778Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420, upload_time = "2025-07-27T14:13:12.882Z" }, - { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536, upload_time = "2025-07-27T14:13:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190, upload_time = "2025-07-27T14:13:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597, upload_time = "2025-07-27T14:13:37.221Z" }, +version = "7.10.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290 }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515 }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020 }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769 }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901 }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413 }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820 }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941 }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519 }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375 }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699 }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512 }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147 }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320 }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575 }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568 }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174 }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447 }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779 }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604 }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497 }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350 }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111 }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746 }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541 }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170 }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029 }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259 }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592 }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768 }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995 }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546 }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544 }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308 }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920 }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434 }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403 }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469 }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731 }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302 }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578 }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629 }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162 }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517 }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632 }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520 }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455 }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287 }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946 }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009 }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804 }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384 }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266 }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767 }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931 }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186 }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470 }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626 }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386 }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852 }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534 }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784 }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905 }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922 }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952 }, ] [[package]] name = "cryptography" -version = "45.0.6" +version = "46.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/0d/d13399c94234ee8f3df384819dc67e0c5ce215fb751d567a55a1f4b028c7/cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", size = 744949, upload_time = "2025-08-05T23:59:27.93Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/29/2793d178d0eda1ca4a09a7c4e09a5185e75738cc6d526433e8663b460ea6/cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", size = 7042702, upload_time = "2025-08-05T23:58:23.464Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b6/cabd07410f222f32c8d55486c464f432808abaa1f12af9afcbe8f2f19030/cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", size = 4206483, upload_time = "2025-08-05T23:58:27.132Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9e/f9c7d36a38b1cfeb1cc74849aabe9bf817990f7603ff6eb485e0d70e0b27/cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", size = 4429679, upload_time = "2025-08-05T23:58:29.152Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2a/4434c17eb32ef30b254b9e8b9830cee4e516f08b47fdd291c5b1255b8101/cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", size = 4210553, upload_time = "2025-08-05T23:58:30.596Z" }, - { url = "https://files.pythonhosted.org/packages/ef/1d/09a5df8e0c4b7970f5d1f3aff1b640df6d4be28a64cae970d56c6cf1c772/cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", size = 3894499, upload_time = "2025-08-05T23:58:32.03Z" }, - { url = "https://files.pythonhosted.org/packages/79/62/120842ab20d9150a9d3a6bdc07fe2870384e82f5266d41c53b08a3a96b34/cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", size = 4458484, upload_time = "2025-08-05T23:58:33.526Z" }, - { url = "https://files.pythonhosted.org/packages/fd/80/1bc3634d45ddfed0871bfba52cf8f1ad724761662a0c792b97a951fb1b30/cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", size = 4210281, upload_time = "2025-08-05T23:58:35.445Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fe/ffb12c2d83d0ee625f124880a1f023b5878f79da92e64c37962bbbe35f3f/cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", size = 4456890, upload_time = "2025-08-05T23:58:36.923Z" }, - { url = "https://files.pythonhosted.org/packages/8c/8e/b3f3fe0dc82c77a0deb5f493b23311e09193f2268b77196ec0f7a36e3f3e/cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", size = 4333247, upload_time = "2025-08-05T23:58:38.781Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a6/c3ef2ab9e334da27a1d7b56af4a2417d77e7806b2e0f90d6267ce120d2e4/cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", size = 4565045, upload_time = "2025-08-05T23:58:40.415Z" }, - { url = "https://files.pythonhosted.org/packages/31/c3/77722446b13fa71dddd820a5faab4ce6db49e7e0bf8312ef4192a3f78e2f/cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159", size = 2928923, upload_time = "2025-08-05T23:58:41.919Z" }, - { url = "https://files.pythonhosted.org/packages/38/63/a025c3225188a811b82932a4dcc8457a26c3729d81578ccecbcce2cb784e/cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec", size = 3403805, upload_time = "2025-08-05T23:58:43.792Z" }, - { url = "https://files.pythonhosted.org/packages/5b/af/bcfbea93a30809f126d51c074ee0fac5bd9d57d068edf56c2a73abedbea4/cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", size = 7020111, upload_time = "2025-08-05T23:58:45.316Z" }, - { url = "https://files.pythonhosted.org/packages/98/c6/ea5173689e014f1a8470899cd5beeb358e22bb3cf5a876060f9d1ca78af4/cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", size = 4198169, upload_time = "2025-08-05T23:58:47.121Z" }, - { url = "https://files.pythonhosted.org/packages/ba/73/b12995edc0c7e2311ffb57ebd3b351f6b268fed37d93bfc6f9856e01c473/cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", size = 4421273, upload_time = "2025-08-05T23:58:48.557Z" }, - { url = "https://files.pythonhosted.org/packages/f7/6e/286894f6f71926bc0da67408c853dd9ba953f662dcb70993a59fd499f111/cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", size = 4199211, upload_time = "2025-08-05T23:58:50.139Z" }, - { url = "https://files.pythonhosted.org/packages/de/34/a7f55e39b9623c5cb571d77a6a90387fe557908ffc44f6872f26ca8ae270/cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", size = 3883732, upload_time = "2025-08-05T23:58:52.253Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b9/c6d32edbcba0cd9f5df90f29ed46a65c4631c4fbe11187feb9169c6ff506/cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", size = 4450655, upload_time = "2025-08-05T23:58:53.848Z" }, - { url = "https://files.pythonhosted.org/packages/77/2d/09b097adfdee0227cfd4c699b3375a842080f065bab9014248933497c3f9/cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", size = 4198956, upload_time = "2025-08-05T23:58:55.209Z" }, - { url = "https://files.pythonhosted.org/packages/55/66/061ec6689207d54effdff535bbdf85cc380d32dd5377173085812565cf38/cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", size = 4449859, upload_time = "2025-08-05T23:58:56.639Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/e7d5a2ad2d035e5a2af116e1a3adb4d8fcd0be92a18032917a089c6e5028/cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", size = 4320254, upload_time = "2025-08-05T23:58:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/82/27/092d311af22095d288f4db89fcaebadfb2f28944f3d790a4cf51fe5ddaeb/cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", size = 4554815, upload_time = "2025-08-05T23:59:00.283Z" }, - { url = "https://files.pythonhosted.org/packages/7e/01/aa2f4940262d588a8fdf4edabe4cda45854d00ebc6eaac12568b3a491a16/cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02", size = 2912147, upload_time = "2025-08-05T23:59:01.716Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bc/16e0276078c2de3ceef6b5a34b965f4436215efac45313df90d55f0ba2d2/cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b", size = 3390459, upload_time = "2025-08-05T23:59:03.358Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a9/62/e3664e6ffd7743e1694b244dde70b43a394f6f7fbcacf7014a8ff5197c73/cryptography-46.0.1.tar.gz", hash = "sha256:ed570874e88f213437f5cf758f9ef26cbfc3f336d889b1e592ee11283bb8d1c7", size = 749198 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/8c/44ee01267ec01e26e43ebfdae3f120ec2312aa72fa4c0507ebe41a26739f/cryptography-46.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:1cd6d50c1a8b79af1a6f703709d8973845f677c8e97b1268f5ff323d38ce8475", size = 7285044 }, + { url = "https://files.pythonhosted.org/packages/22/59/9ae689a25047e0601adfcb159ec4f83c0b4149fdb5c3030cc94cd218141d/cryptography-46.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ff483716be32690c14636e54a1f6e2e1b7bf8e22ca50b989f88fa1b2d287080", size = 4308182 }, + { url = "https://files.pythonhosted.org/packages/c4/ee/ca6cc9df7118f2fcd142c76b1da0f14340d77518c05b1ebfbbabca6b9e7d/cryptography-46.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9873bf7c1f2a6330bdfe8621e7ce64b725784f9f0c3a6a55c3047af5849f920e", size = 4572393 }, + { url = "https://files.pythonhosted.org/packages/7f/a3/0f5296f63815d8e985922b05c31f77ce44787b3127a67c0b7f70f115c45f/cryptography-46.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0dfb7c88d4462a0cfdd0d87a3c245a7bc3feb59de101f6ff88194f740f72eda6", size = 4308400 }, + { url = "https://files.pythonhosted.org/packages/5d/8c/74fcda3e4e01be1d32775d5b4dd841acaac3c1b8fa4d0774c7ac8d52463d/cryptography-46.0.1-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e22801b61613ebdebf7deb18b507919e107547a1d39a3b57f5f855032dd7cfb8", size = 4015786 }, + { url = "https://files.pythonhosted.org/packages/dc/b8/85d23287baeef273b0834481a3dd55bbed3a53587e3b8d9f0898235b8f91/cryptography-46.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:757af4f6341ce7a1e47c326ca2a81f41d236070217e5fbbad61bbfe299d55d28", size = 4982606 }, + { url = "https://files.pythonhosted.org/packages/e5/d3/de61ad5b52433b389afca0bc70f02a7a1f074651221f599ce368da0fe437/cryptography-46.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f7a24ea78de345cfa7f6a8d3bde8b242c7fac27f2bd78fa23474ca38dfaeeab9", size = 4604234 }, + { url = "https://files.pythonhosted.org/packages/dc/1f/dbd4d6570d84748439237a7478d124ee0134bf166ad129267b7ed8ea6d22/cryptography-46.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e8776dac9e660c22241b6587fae51a67b4b0147daa4d176b172c3ff768ad736", size = 4307669 }, + { url = "https://files.pythonhosted.org/packages/ec/fd/ca0a14ce7f0bfe92fa727aacaf2217eb25eb7e4ed513b14d8e03b26e63ed/cryptography-46.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9f40642a140c0c8649987027867242b801486865277cbabc8c6059ddef16dc8b", size = 4947579 }, + { url = "https://files.pythonhosted.org/packages/89/6b/09c30543bb93401f6f88fce556b3bdbb21e55ae14912c04b7bf355f5f96c/cryptography-46.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:449ef2b321bec7d97ef2c944173275ebdab78f3abdd005400cc409e27cd159ab", size = 4603669 }, + { url = "https://files.pythonhosted.org/packages/23/9a/38cb01cb09ce0adceda9fc627c9cf98eb890fc8d50cacbe79b011df20f8a/cryptography-46.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2dd339ba3345b908fa3141ddba4025568fa6fd398eabce3ef72a29ac2d73ad75", size = 4435828 }, + { url = "https://files.pythonhosted.org/packages/0f/53/435b5c36a78d06ae0bef96d666209b0ecd8f8181bfe4dda46536705df59e/cryptography-46.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7411c910fb2a412053cf33cfad0153ee20d27e256c6c3f14d7d7d1d9fec59fd5", size = 4709553 }, + { url = "https://files.pythonhosted.org/packages/f5/c4/0da6e55595d9b9cd3b6eb5dc22f3a07ded7f116a3ea72629cab595abb804/cryptography-46.0.1-cp311-abi3-win32.whl", hash = "sha256:cbb8e769d4cac884bb28e3ff620ef1001b75588a5c83c9c9f1fdc9afbe7f29b0", size = 3058327 }, + { url = "https://files.pythonhosted.org/packages/95/0f/cd29a35e0d6e78a0ee61793564c8cff0929c38391cb0de27627bdc7525aa/cryptography-46.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:92e8cfe8bd7dd86eac0a677499894862cd5cc2fd74de917daa881d00871ac8e7", size = 3523893 }, + { url = "https://files.pythonhosted.org/packages/f2/dd/eea390f3e78432bc3d2f53952375f8b37cb4d37783e626faa6a51e751719/cryptography-46.0.1-cp311-abi3-win_arm64.whl", hash = "sha256:db5597a4c7353b2e5fb05a8e6cb74b56a4658a2b7bf3cb6b1821ae7e7fd6eaa0", size = 2932145 }, + { url = "https://files.pythonhosted.org/packages/0a/fb/c73588561afcd5e24b089952bd210b14676c0c5bf1213376350ae111945c/cryptography-46.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:4c49eda9a23019e11d32a0eb51a27b3e7ddedde91e099c0ac6373e3aacc0d2ee", size = 7193928 }, + { url = "https://files.pythonhosted.org/packages/26/34/0ff0bb2d2c79f25a2a63109f3b76b9108a906dd2a2eb5c1d460b9938adbb/cryptography-46.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9babb7818fdd71394e576cf26c5452df77a355eac1a27ddfa24096665a27f8fd", size = 4293515 }, + { url = "https://files.pythonhosted.org/packages/df/b7/d4f848aee24ecd1be01db6c42c4a270069a4f02a105d9c57e143daf6cf0f/cryptography-46.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9f2c4cc63be3ef43c0221861177cee5d14b505cd4d4599a89e2cd273c4d3542a", size = 4545619 }, + { url = "https://files.pythonhosted.org/packages/44/a5/42fedefc754fd1901e2d95a69815ea4ec8a9eed31f4c4361fcab80288661/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:41c281a74df173876da1dc9a9b6953d387f06e3d3ed9284e3baae3ab3f40883a", size = 4299160 }, + { url = "https://files.pythonhosted.org/packages/86/a1/cd21174f56e769c831fbbd6399a1b7519b0ff6280acec1b826d7b072640c/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0a17377fa52563d730248ba1f68185461fff36e8bc75d8787a7dd2e20a802b7a", size = 3994491 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/a8cbfa1c029987ddc746fd966711d4fa71efc891d37fbe9f030fe5ab4eec/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:0d1922d9280e08cde90b518a10cd66831f632960a8d08cb3418922d83fce6f12", size = 4960157 }, + { url = "https://files.pythonhosted.org/packages/67/ae/63a84e6789e0d5a2502edf06b552bcb0fa9ff16147265d5c44a211942abe/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:af84e8e99f1a82cea149e253014ea9dc89f75b82c87bb6c7242203186f465129", size = 4577263 }, + { url = "https://files.pythonhosted.org/packages/ef/8f/1b9fa8e92bd9cbcb3b7e1e593a5232f2c1e6f9bd72b919c1a6b37d315f92/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ef648d2c690703501714588b2ba640facd50fd16548133b11b2859e8655a69da", size = 4298703 }, + { url = "https://files.pythonhosted.org/packages/c3/af/bb95db070e73fea3fae31d8a69ac1463d89d1c084220f549b00dd01094a8/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:e94eb5fa32a8a9f9bf991f424f002913e3dd7c699ef552db9b14ba6a76a6313b", size = 4926363 }, + { url = "https://files.pythonhosted.org/packages/f5/3b/d8fb17ffeb3a83157a1cc0aa5c60691d062aceecba09c2e5e77ebfc1870c/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:534b96c0831855e29fc3b069b085fd185aa5353033631a585d5cd4dd5d40d657", size = 4576958 }, + { url = "https://files.pythonhosted.org/packages/d9/46/86bc3a05c10c8aa88c8ae7e953a8b4e407c57823ed201dbcba55c4d655f4/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9b55038b5c6c47559aa33626d8ecd092f354e23de3c6975e4bb205df128a2a0", size = 4422507 }, + { url = "https://files.pythonhosted.org/packages/a8/4e/387e5a21dfd2b4198e74968a541cfd6128f66f8ec94ed971776e15091ac3/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ec13b7105117dbc9afd023300fb9954d72ca855c274fe563e72428ece10191c0", size = 4683964 }, + { url = "https://files.pythonhosted.org/packages/25/a3/f9f5907b166adb8f26762071474b38bbfcf89858a5282f032899075a38a1/cryptography-46.0.1-cp314-cp314t-win32.whl", hash = "sha256:504e464944f2c003a0785b81668fe23c06f3b037e9cb9f68a7c672246319f277", size = 3029705 }, + { url = "https://files.pythonhosted.org/packages/12/66/4d3a4f1850db2e71c2b1628d14b70b5e4c1684a1bd462f7fffb93c041c38/cryptography-46.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c52fded6383f7e20eaf70a60aeddd796b3677c3ad2922c801be330db62778e05", size = 3502175 }, + { url = "https://files.pythonhosted.org/packages/52/c7/9f10ad91435ef7d0d99a0b93c4360bea3df18050ff5b9038c489c31ac2f5/cryptography-46.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:9495d78f52c804b5ec8878b5b8c7873aa8e63db9cd9ee387ff2db3fffe4df784", size = 2912354 }, + { url = "https://files.pythonhosted.org/packages/98/e5/fbd632385542a3311915976f88e0dfcf09e62a3fc0aff86fb6762162a24d/cryptography-46.0.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d84c40bdb8674c29fa192373498b6cb1e84f882889d21a471b45d1f868d8d44b", size = 7255677 }, + { url = "https://files.pythonhosted.org/packages/56/3e/13ce6eab9ad6eba1b15a7bd476f005a4c1b3f299f4c2f32b22408b0edccf/cryptography-46.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ed64e5083fa806709e74fc5ea067dfef9090e5b7a2320a49be3c9df3583a2d8", size = 4301110 }, + { url = "https://files.pythonhosted.org/packages/a2/67/65dc233c1ddd688073cf7b136b06ff4b84bf517ba5529607c9d79720fc67/cryptography-46.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:341fb7a26bc9d6093c1b124b9f13acc283d2d51da440b98b55ab3f79f2522ead", size = 4562369 }, + { url = "https://files.pythonhosted.org/packages/17/db/d64ae4c6f4e98c3dac5bf35dd4d103f4c7c345703e43560113e5e8e31b2b/cryptography-46.0.1-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6ef1488967e729948d424d09c94753d0167ce59afba8d0f6c07a22b629c557b2", size = 4302126 }, + { url = "https://files.pythonhosted.org/packages/3d/19/5f1eea17d4805ebdc2e685b7b02800c4f63f3dd46cfa8d4c18373fea46c8/cryptography-46.0.1-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7823bc7cdf0b747ecfb096d004cc41573c2f5c7e3a29861603a2871b43d3ef32", size = 4009431 }, + { url = "https://files.pythonhosted.org/packages/81/b5/229ba6088fe7abccbfe4c5edb96c7a5ad547fac5fdd0d40aa6ea540b2985/cryptography-46.0.1-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f736ab8036796f5a119ff8211deda416f8c15ce03776db704a7a4e17381cb2ef", size = 4980739 }, + { url = "https://files.pythonhosted.org/packages/3a/9c/50aa38907b201e74bc43c572f9603fa82b58e831bd13c245613a23cff736/cryptography-46.0.1-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e46710a240a41d594953012213ea8ca398cd2448fbc5d0f1be8160b5511104a0", size = 4592289 }, + { url = "https://files.pythonhosted.org/packages/5a/33/229858f8a5bb22f82468bb285e9f4c44a31978d5f5830bb4ea1cf8a4e454/cryptography-46.0.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:84ef1f145de5aee82ea2447224dc23f065ff4cc5791bb3b506615957a6ba8128", size = 4301815 }, + { url = "https://files.pythonhosted.org/packages/52/cb/b76b2c87fbd6ed4a231884bea3ce073406ba8e2dae9defad910d33cbf408/cryptography-46.0.1-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9394c7d5a7565ac5f7d9ba38b2617448eba384d7b107b262d63890079fad77ca", size = 4943251 }, + { url = "https://files.pythonhosted.org/packages/94/0f/f66125ecf88e4cb5b8017ff43f3a87ede2d064cb54a1c5893f9da9d65093/cryptography-46.0.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ed957044e368ed295257ae3d212b95456bd9756df490e1ac4538857f67531fcc", size = 4591247 }, + { url = "https://files.pythonhosted.org/packages/f6/22/9f3134ae436b63b463cfdf0ff506a0570da6873adb4bf8c19b8a5b4bac64/cryptography-46.0.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7de12fa0eee6234de9a9ce0ffcfa6ce97361db7a50b09b65c63ac58e5f22fc7", size = 4428534 }, + { url = "https://files.pythonhosted.org/packages/89/39/e6042bcb2638650b0005c752c38ea830cbfbcbb1830e4d64d530000aa8dc/cryptography-46.0.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7fab1187b6c6b2f11a326f33b036f7168f5b996aedd0c059f9738915e4e8f53a", size = 4699541 }, + { url = "https://files.pythonhosted.org/packages/68/46/753d457492d15458c7b5a653fc9a84a1c9c7a83af6ebdc94c3fc373ca6e8/cryptography-46.0.1-cp38-abi3-win32.whl", hash = "sha256:45f790934ac1018adeba46a0f7289b2b8fe76ba774a88c7f1922213a56c98bc1", size = 3043779 }, + { url = "https://files.pythonhosted.org/packages/2f/50/b6f3b540c2f6ee712feeb5fa780bb11fad76634e71334718568e7695cb55/cryptography-46.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:7176a5ab56fac98d706921f6416a05e5aff7df0e4b91516f450f8627cda22af3", size = 3517226 }, + { url = "https://files.pythonhosted.org/packages/ff/e8/77d17d00981cdd27cc493e81e1749a0b8bbfb843780dbd841e30d7f50743/cryptography-46.0.1-cp38-abi3-win_arm64.whl", hash = "sha256:efc9e51c3e595267ff84adf56e9b357db89ab2279d7e375ffcaf8f678606f3d9", size = 2923149 }, ] [[package]] name = "csscompressor" version = "0.9.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808 } [[package]] name = "cssselect2" @@ -381,98 +445,102 @@ dependencies = [ { name = "tinycss2" }, { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload_time = "2025-03-05T14:46:07.988Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload_time = "2025-03-05T14:46:06.463Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454 }, ] [[package]] name = "debugpy" -version = "1.8.14" +version = "1.8.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload_time = "2025-04-10T19:46:10.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload_time = "2025-04-10T19:46:26.044Z" }, - { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload_time = "2025-04-10T19:46:27.464Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload_time = "2025-04-10T19:46:29.467Z" }, - { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload_time = "2025-04-10T19:46:31.538Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload_time = "2025-04-10T19:46:32.96Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload_time = "2025-04-10T19:46:34.336Z" }, - { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload_time = "2025-04-10T19:46:36.199Z" }, - { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload_time = "2025-04-10T19:46:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload_time = "2025-04-10T19:46:54.077Z" }, + { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522 }, + { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417 }, + { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130 }, + { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053 }, + { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386 }, + { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100 }, + { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002 }, + { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047 }, + { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899 }, + { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254 }, + { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203 }, + { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493 }, + { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210 }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload_time = "2021-03-08T10:59:26.269Z" } +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, upload_time = "2021-03-08T10:59:24.45Z" }, + { 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 = "distlib" -version = "0.3.9" +version = "0.4.0" 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, upload_time = "2024-10-09T18:35:47.551Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload_time = "2024-10-09T18:35:44.272Z" }, + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047 }, ] [[package]] name = "et-xmlfile" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, ] [[package]] name = "executing" -version = "2.2.0" +version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload_time = "2025-01-22T15:41:29.403Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload_time = "2025-01-22T15:41:25.929Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317 }, ] [[package]] name = "fastjsonschema" version = "2.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload_time = "2025-08-14T18:49:36.666Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload_time = "2025-08-14T18:49:34.776Z" }, + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024 }, ] [[package]] name = "filelock" -version = "3.18.0" +version = "3.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988 }, ] [[package]] @@ -482,9 +550,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816 } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263 }, ] [[package]] @@ -494,9 +562,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625 }, ] [[package]] @@ -524,20 +592,20 @@ dependencies = [ { name = "typing-extensions" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615 }, ] [[package]] name = "frozendict" version = "2.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload_time = "2024-10-13T12:15:32.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload_time = "2024-10-13T12:15:26.839Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload_time = "2024-10-13T12:15:28.16Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload_time = "2024-10-13T12:15:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148 }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146 }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146 }, ] [[package]] @@ -547,9 +615,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload_time = "2022-05-02T15:47:16.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload_time = "2022-05-02T15:47:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, ] [[package]] @@ -559,33 +627,33 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, ] [[package]] name = "gitpython" -version = "3.1.44" +version = "3.1.45" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload_time = "2025-01-02T07:32:43.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload_time = "2025-01-02T07:32:40.731Z" }, + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168 }, ] [[package]] name = "griffe" -version = "1.7.3" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/3e/5aa9a61f7c3c47b0b52a1d930302992229d191bf4bc76447b324b731510a/griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b", size = 395137, upload_time = "2025-04-23T11:29:09.147Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684 } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/c6/5c20af38c2a57c15d87f7f38bee77d63c1d2a3689f74fefaf35915dd12b2/griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75", size = 129303, upload_time = "2025-04-23T11:29:07.145Z" }, + { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439 }, ] [[package]] @@ -593,33 +661,33 @@ name = "gurobipy" version = "12.0.3" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/bb/b3784497115c64c2bd122cc9d411f167026d4ec42a26b1ff3c43a779275d/gurobipy-12.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:020f23277f630e079eac114385eabd1bd9fb4ac22f8796ed5ba6d915ce4f141b", size = 12222234, upload_time = "2025-07-15T07:19:24.64Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/c065984de5287c99fd30ee8d700fd78f83692e992471f9667ab5d36612b9/gurobipy-12.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:72bbf544bc05060bb93909b79715ace4c0f416198f7622a985cabb9e8e99aa1c", size = 62583866, upload_time = "2025-07-15T07:20:17.576Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8b/2b9f26e4e19a258229b8a8ffc377ca372cc2059a22a0a7c67572efe308d8/gurobipy-12.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3f971caf270f671b6ffcf5b937b3c0430a5264b0f01529dc8681d61c221f215", size = 14268480, upload_time = "2025-07-15T07:20:26.898Z" }, - { url = "https://files.pythonhosted.org/packages/26/0f/3544a323635f37cdfe1e011d2903b7ef94ba18e10224fa1419f64d0c1968/gurobipy-12.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:af18fd03d5dc3f6e5f590c372ad288b8430a6d88a5b5e66cfcd8432f86ee8650", size = 11121565, upload_time = "2025-07-15T07:20:34.576Z" }, - { url = "https://files.pythonhosted.org/packages/5e/95/f0e5b5cf85298f42482cf4e53d8114c45bb962f55195d531fe4e62b5afa1/gurobipy-12.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a8552e47673cb6f1fd351edf8fcad86b02f832cbfb57d90ef21e0397e96d138e", size = 12183439, upload_time = "2025-07-15T07:20:44.224Z" }, - { url = "https://files.pythonhosted.org/packages/61/6e/aea725b4143faa4eb6878414a91fa74e7871aba0ab9453803a9eeef781c2/gurobipy-12.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:be05c074141c8a126c8aaeccc41795ab091a666eabb39ca1ff98a74bde81e663", size = 62583451, upload_time = "2025-07-15T07:21:38.825Z" }, - { url = "https://files.pythonhosted.org/packages/75/47/7b9c63ce2cd85d796403b91a6d211d5c8baac7b694edd94e2151f365d6a9/gurobipy-12.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:79a333766e27fef7902ceeefbcf0279a1ca393a27a72ea62f8e301b21aa17d59", size = 14271076, upload_time = "2025-07-15T07:21:55.102Z" }, - { url = "https://files.pythonhosted.org/packages/2a/93/b10cd6112c05675fed5c817fd7933c9d4ba3a7039e42cba844a9ac09242a/gurobipy-12.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:e0f9ed55077e622021369bb9df2ca3b00c86b678792a3b1556cc59f67348fab0", size = 11111414, upload_time = "2025-07-15T07:22:05.079Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/b3784497115c64c2bd122cc9d411f167026d4ec42a26b1ff3c43a779275d/gurobipy-12.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:020f23277f630e079eac114385eabd1bd9fb4ac22f8796ed5ba6d915ce4f141b", size = 12222234 }, + { url = "https://files.pythonhosted.org/packages/18/ea/c065984de5287c99fd30ee8d700fd78f83692e992471f9667ab5d36612b9/gurobipy-12.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:72bbf544bc05060bb93909b79715ace4c0f416198f7622a985cabb9e8e99aa1c", size = 62583866 }, + { url = "https://files.pythonhosted.org/packages/9b/8b/2b9f26e4e19a258229b8a8ffc377ca372cc2059a22a0a7c67572efe308d8/gurobipy-12.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3f971caf270f671b6ffcf5b937b3c0430a5264b0f01529dc8681d61c221f215", size = 14268480 }, + { url = "https://files.pythonhosted.org/packages/26/0f/3544a323635f37cdfe1e011d2903b7ef94ba18e10224fa1419f64d0c1968/gurobipy-12.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:af18fd03d5dc3f6e5f590c372ad288b8430a6d88a5b5e66cfcd8432f86ee8650", size = 11121565 }, + { url = "https://files.pythonhosted.org/packages/5e/95/f0e5b5cf85298f42482cf4e53d8114c45bb962f55195d531fe4e62b5afa1/gurobipy-12.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a8552e47673cb6f1fd351edf8fcad86b02f832cbfb57d90ef21e0397e96d138e", size = 12183439 }, + { url = "https://files.pythonhosted.org/packages/61/6e/aea725b4143faa4eb6878414a91fa74e7871aba0ab9453803a9eeef781c2/gurobipy-12.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:be05c074141c8a126c8aaeccc41795ab091a666eabb39ca1ff98a74bde81e663", size = 62583451 }, + { url = "https://files.pythonhosted.org/packages/75/47/7b9c63ce2cd85d796403b91a6d211d5c8baac7b694edd94e2151f365d6a9/gurobipy-12.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:79a333766e27fef7902ceeefbcf0279a1ca393a27a72ea62f8e301b21aa17d59", size = 14271076 }, + { url = "https://files.pythonhosted.org/packages/2a/93/b10cd6112c05675fed5c817fd7933c9d4ba3a7039e42cba844a9ac09242a/gurobipy-12.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:e0f9ed55077e622021369bb9df2ca3b00c86b678792a3b1556cc59f67348fab0", size = 11111414 }, ] [[package]] name = "hdx-python-country" -version = "3.9.6" +version = "3.9.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hdx-python-utilities" }, { name = "libhxl" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/96/ac55b204699cd216a22a943f64aafac32bba818f624a5d44879d60368fad/hdx_python_country-3.9.6.tar.gz", hash = "sha256:7791f4b9c5ae3e62e82795c266a3ca6ee23c7bab706c91533844edf2ebd9bb18", size = 529232, upload_time = "2025-07-09T22:56:32.162Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/5621c48b79a510a87288495f4bdde38a292f0f97dd14177e2cc77c8a79bb/hdx_python_country-3.9.8.tar.gz", hash = "sha256:de9d928e490490fe6fa2d743597464fa8bae317f808667a947e734c1ea26e4d9", size = 531031 } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/90/646b56ec12df459799510d6d0869ada210ad9f765ad104e50dae4867eb50/hdx_python_country-3.9.6-py3-none-any.whl", hash = "sha256:4c1833bdf3cbd14dfff0146e0bdcae5763931d344fce5f1b42493dc8751e3d4a", size = 55554, upload_time = "2025-07-09T22:56:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8f/7d961e17372bb9df875e988432a2abb9ca4883b4a0592dfccefa50cb697f/hdx_python_country-3.9.8-py3-none-any.whl", hash = "sha256:602e495028e474e2f93094136007b2c0e765d88af55b2cae7e0ba778e178bcaf", size = 56383 }, ] [[package]] name = "hdx-python-utilities" -version = "3.8.7" +version = "3.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frictionless" }, @@ -637,9 +705,9 @@ dependencies = [ { name = "xlsx2csv" }, { name = "xlwt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/de/b812b6b242f47db98ed043b7f3211c81443f0e59959377e97a93915331c0/hdx_python_utilities-3.8.7.tar.gz", hash = "sha256:41212cd5b682777d393ee991b546f1b4326665d981714a829e5483101fd15a60", size = 656009, upload_time = "2025-05-14T02:31:28.578Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/13/f22d36f9146beaefe27b1a888acd31ddd09c1a9730ed1d42df9af33f99e2/hdx_python_utilities-3.9.2.tar.gz", hash = "sha256:de39248afdca00ab636fdfa0c3259fa80e4b95dba026170a4efc5bee14eda3f3", size = 656826 } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/38/44f2a0b83e103bb3d47dbc66dfaa4aaa65c34c60fd26d5445fb2bbd3c09a/hdx_python_utilities-3.8.7-py3-none-any.whl", hash = "sha256:47e67810e81a481504b8653c429b31b8c237da594dc27604075c8e79077c8640", size = 60787, upload_time = "2025-05-14T02:31:26.794Z" }, + { url = "https://files.pythonhosted.org/packages/95/6d/06994f86c2cc172b5ea127dedbb19e809205e06b1ba7532e2f0aea5631cd/hdx_python_utilities-3.9.2-py3-none-any.whl", hash = "sha256:fae3cc241420ae7ebb0a7a53cc8034c6851886396b2f0880685aba9045973111", size = 61187 }, ] [[package]] @@ -649,28 +717,28 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/aa1325331c320598ce60cc31060087681cd05123b6fb2a8a571e882b7f05/highspy-1.11.0.tar.gz", hash = "sha256:771e58c076122d207ff1b19759c21d3227f0da5b80dfd89a4145681524969cef", size = 1285415, upload_time = "2025-06-06T00:47:22.562Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/ad/b54ad6740b950faab3b7f1465fbb5c740fc522928a8d9f01cac181f8f9a6/highspy-1.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28fffd3e733833a7b2569df6761088046e8aca868ab328828711dbe15b102ad4", size = 2232856, upload_time = "2025-06-06T00:46:11.161Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0c/3921a207f47d52abc81a9d00d8f4d579b05b85670e23bc7140e39268490d/highspy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20a3adf8820a5f7a9cee6fc76df625e651ecfd8b5898af2a77042e79269ce0bc", size = 1908641, upload_time = "2025-06-06T00:46:12.706Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/ea7ea6c4c3f781b007fe928b2aefa40c49287b4689985d04c3b20d383475/highspy-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d4bc0a84cf613bb8565f9b5f610eb0655384162f509b5d86f9c888570275fdc", size = 2119574, upload_time = "2025-06-06T00:46:14.261Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0c/94f1ccb6606e8445a7a0c68d983e47f64899582c64fcea651f488eaaaea0/highspy-1.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:543789b75c396a904cb550de34eb333f1a184e123dadc9903b5e6dbca18a007b", size = 2441487, upload_time = "2025-06-06T00:46:16.286Z" }, - { url = "https://files.pythonhosted.org/packages/ad/aa/e7c4ac05162187c484bb121f50d8e037c13bf894ed5cf4e781e1cff68762/highspy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23949e4f44b6df0ed8c387a7c733d683a0fa66e3ff15d65719979ce2099ee99", size = 2302302, upload_time = "2025-06-06T00:46:18.819Z" }, - { url = "https://files.pythonhosted.org/packages/04/ce/fd2473bed635eb06d116f987767d5c5fe3c62b317fb1a788c31966d7fa0a/highspy-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50dacf300ebe7c4dca92891c0bf61b694f2ca744207cf7d0d24f2a30ffb5608c", size = 3101885, upload_time = "2025-06-06T00:46:20.774Z" }, - { url = "https://files.pythonhosted.org/packages/6e/e1/bf174389656de5d302ed53dd5cdeb5f7e9ad84156ad2fc95d5a63ba023f2/highspy-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a782c242b4b047f86110787b0dafce9d77cc10f079adab1fd51c5331e5760127", size = 3647952, upload_time = "2025-06-06T00:46:22.847Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f5/42f6f2ce99c5b9d7aa864ac3abeaf8a2b66da707821ab42b0a31ec2a0dc1/highspy-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15b804387089a389e5f01b056a4b3ad74c7d1cf00ab00a0faaf3b4a582bb664c", size = 3309616, upload_time = "2025-06-06T00:46:24.888Z" }, - { url = "https://files.pythonhosted.org/packages/47/f5/cf13640ed65ea934b45e0c3e786497f4696f286faf45e8e62579a0f15462/highspy-1.11.0-cp312-cp312-win32.whl", hash = "sha256:8c33f68df8ab9666d379b0d64d04775c0a9db31882d4f87b3ec8cece0003b47d", size = 1710641, upload_time = "2025-06-06T00:46:26.462Z" }, - { url = "https://files.pythonhosted.org/packages/b7/2f/7acfea5b8d32b86bdec018f858bc195236b804a22a7cd3349da711498692/highspy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0aed8c80d33e2fc2eb1def75dbd34c9fa463acb589d19a5ed5dcc0178ae7062", size = 1985767, upload_time = "2025-06-06T00:46:28.144Z" }, - { url = "https://files.pythonhosted.org/packages/96/84/3e899c5d95dc9d5400a308e0aaf4a5143f69016a4f46dd528ff7cd65d341/highspy-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f675cda73860c7c8a22546db3c80db985720baea84866b08a971cfa03cc7a156", size = 2232867, upload_time = "2025-06-06T00:46:29.651Z" }, - { url = "https://files.pythonhosted.org/packages/74/e2/2853095a74e9fc2c2081340647be8edba7122696534ebbaf159ceb53f9b4/highspy-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7babebfc01b7682c69c95e0520614ec9400e10cec1b84d3fb7cd48535c606244", size = 1908601, upload_time = "2025-06-06T00:46:31.232Z" }, - { url = "https://files.pythonhosted.org/packages/e6/36/3cabdd3ae8610912962bad96f4d4d6702255d6c01d050754e4050a9eaa4a/highspy-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39fb60d84d7a58e58f923ea6f0641e6978eb9049033b84de1a2add723e01cd3f", size = 2119726, upload_time = "2025-06-06T00:46:32.796Z" }, - { url = "https://files.pythonhosted.org/packages/a9/da/200d3f13ca9ad3f9fc11a1f3f76cc2734de42dae064510365d42caeb5ed4/highspy-1.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c2e7cf4d504287cd8910de322a726d58428af43bb985d6bae602bf84a7454b9", size = 2441449, upload_time = "2025-06-06T00:46:35.147Z" }, - { url = "https://files.pythonhosted.org/packages/6c/58/fc3775850dc668006039637a4f23f03a9c0eb533643c9d3a7370f9d63de2/highspy-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79682aa7855d94106ccbbb750082d156dcbb57dff9d489f167320ae0ce768867", size = 2302685, upload_time = "2025-06-06T00:46:36.791Z" }, - { url = "https://files.pythonhosted.org/packages/b5/16/e13326a9706c407d32e39ad14aa79a696c1eb49bb13d50fde5d96afb02b5/highspy-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:65232aa496fb27be56cc85b2c7c785fac866107c32ea00cc38ec474d6a9f6494", size = 3102306, upload_time = "2025-06-06T00:46:38.341Z" }, - { url = "https://files.pythonhosted.org/packages/0e/93/468e63b16d9bf123174e7f8f7b8bd5a2f96b18d7370a2cc35e6485871749/highspy-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f78f27e18275d3c7868dcd0314ea535ed361322e7f0817363872d75a4cc15abc", size = 3648234, upload_time = "2025-06-06T00:46:40.895Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c5/37b849a69c9cbccf533a9a51e309a49e83d704f06bf45370c2e78ceb15d4/highspy-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6156a7d643268456427b6fe310626ad9ee9d908ff812cc64ee8bad7b9872ea98", size = 3309724, upload_time = "2025-06-06T00:46:43.083Z" }, - { url = "https://files.pythonhosted.org/packages/90/0f/89c579b2f718dc419fd76067a03ecb3c96e6919b7cffee1b9f5a2dfe4f56/highspy-1.11.0-cp313-cp313-win32.whl", hash = "sha256:e61facebb0127eb3661db79a11c7665e47229ec63d2b425996d04aeede26d46b", size = 1710676, upload_time = "2025-06-06T00:46:45.132Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/ba2af91f2418bee0d0e99df71dcd171ca863675de6a5260bbf06c120f084/highspy-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ceac08be37f75dc0af95669a0cfb073e5db5f07ead05cdcc81fd4b4394708d53", size = 1985967, upload_time = "2025-06-06T00:46:46.767Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/aa1325331c320598ce60cc31060087681cd05123b6fb2a8a571e882b7f05/highspy-1.11.0.tar.gz", hash = "sha256:771e58c076122d207ff1b19759c21d3227f0da5b80dfd89a4145681524969cef", size = 1285415 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/ad/b54ad6740b950faab3b7f1465fbb5c740fc522928a8d9f01cac181f8f9a6/highspy-1.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28fffd3e733833a7b2569df6761088046e8aca868ab328828711dbe15b102ad4", size = 2232856 }, + { url = "https://files.pythonhosted.org/packages/a3/0c/3921a207f47d52abc81a9d00d8f4d579b05b85670e23bc7140e39268490d/highspy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20a3adf8820a5f7a9cee6fc76df625e651ecfd8b5898af2a77042e79269ce0bc", size = 1908641 }, + { url = "https://files.pythonhosted.org/packages/0a/b6/ea7ea6c4c3f781b007fe928b2aefa40c49287b4689985d04c3b20d383475/highspy-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d4bc0a84cf613bb8565f9b5f610eb0655384162f509b5d86f9c888570275fdc", size = 2119574 }, + { url = "https://files.pythonhosted.org/packages/ff/0c/94f1ccb6606e8445a7a0c68d983e47f64899582c64fcea651f488eaaaea0/highspy-1.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:543789b75c396a904cb550de34eb333f1a184e123dadc9903b5e6dbca18a007b", size = 2441487 }, + { url = "https://files.pythonhosted.org/packages/ad/aa/e7c4ac05162187c484bb121f50d8e037c13bf894ed5cf4e781e1cff68762/highspy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23949e4f44b6df0ed8c387a7c733d683a0fa66e3ff15d65719979ce2099ee99", size = 2302302 }, + { url = "https://files.pythonhosted.org/packages/04/ce/fd2473bed635eb06d116f987767d5c5fe3c62b317fb1a788c31966d7fa0a/highspy-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50dacf300ebe7c4dca92891c0bf61b694f2ca744207cf7d0d24f2a30ffb5608c", size = 3101885 }, + { url = "https://files.pythonhosted.org/packages/6e/e1/bf174389656de5d302ed53dd5cdeb5f7e9ad84156ad2fc95d5a63ba023f2/highspy-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a782c242b4b047f86110787b0dafce9d77cc10f079adab1fd51c5331e5760127", size = 3647952 }, + { url = "https://files.pythonhosted.org/packages/f3/f5/42f6f2ce99c5b9d7aa864ac3abeaf8a2b66da707821ab42b0a31ec2a0dc1/highspy-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15b804387089a389e5f01b056a4b3ad74c7d1cf00ab00a0faaf3b4a582bb664c", size = 3309616 }, + { url = "https://files.pythonhosted.org/packages/47/f5/cf13640ed65ea934b45e0c3e786497f4696f286faf45e8e62579a0f15462/highspy-1.11.0-cp312-cp312-win32.whl", hash = "sha256:8c33f68df8ab9666d379b0d64d04775c0a9db31882d4f87b3ec8cece0003b47d", size = 1710641 }, + { url = "https://files.pythonhosted.org/packages/b7/2f/7acfea5b8d32b86bdec018f858bc195236b804a22a7cd3349da711498692/highspy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0aed8c80d33e2fc2eb1def75dbd34c9fa463acb589d19a5ed5dcc0178ae7062", size = 1985767 }, + { url = "https://files.pythonhosted.org/packages/96/84/3e899c5d95dc9d5400a308e0aaf4a5143f69016a4f46dd528ff7cd65d341/highspy-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f675cda73860c7c8a22546db3c80db985720baea84866b08a971cfa03cc7a156", size = 2232867 }, + { url = "https://files.pythonhosted.org/packages/74/e2/2853095a74e9fc2c2081340647be8edba7122696534ebbaf159ceb53f9b4/highspy-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7babebfc01b7682c69c95e0520614ec9400e10cec1b84d3fb7cd48535c606244", size = 1908601 }, + { url = "https://files.pythonhosted.org/packages/e6/36/3cabdd3ae8610912962bad96f4d4d6702255d6c01d050754e4050a9eaa4a/highspy-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39fb60d84d7a58e58f923ea6f0641e6978eb9049033b84de1a2add723e01cd3f", size = 2119726 }, + { url = "https://files.pythonhosted.org/packages/a9/da/200d3f13ca9ad3f9fc11a1f3f76cc2734de42dae064510365d42caeb5ed4/highspy-1.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c2e7cf4d504287cd8910de322a726d58428af43bb985d6bae602bf84a7454b9", size = 2441449 }, + { url = "https://files.pythonhosted.org/packages/6c/58/fc3775850dc668006039637a4f23f03a9c0eb533643c9d3a7370f9d63de2/highspy-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79682aa7855d94106ccbbb750082d156dcbb57dff9d489f167320ae0ce768867", size = 2302685 }, + { url = "https://files.pythonhosted.org/packages/b5/16/e13326a9706c407d32e39ad14aa79a696c1eb49bb13d50fde5d96afb02b5/highspy-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:65232aa496fb27be56cc85b2c7c785fac866107c32ea00cc38ec474d6a9f6494", size = 3102306 }, + { url = "https://files.pythonhosted.org/packages/0e/93/468e63b16d9bf123174e7f8f7b8bd5a2f96b18d7370a2cc35e6485871749/highspy-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f78f27e18275d3c7868dcd0314ea535ed361322e7f0817363872d75a4cc15abc", size = 3648234 }, + { url = "https://files.pythonhosted.org/packages/dc/c5/37b849a69c9cbccf533a9a51e309a49e83d704f06bf45370c2e78ceb15d4/highspy-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6156a7d643268456427b6fe310626ad9ee9d908ff812cc64ee8bad7b9872ea98", size = 3309724 }, + { url = "https://files.pythonhosted.org/packages/90/0f/89c579b2f718dc419fd76067a03ecb3c96e6919b7cffee1b9f5a2dfe4f56/highspy-1.11.0-cp313-cp313-win32.whl", hash = "sha256:e61facebb0127eb3661db79a11c7665e47229ec63d2b425996d04aeede26d46b", size = 1710676 }, + { url = "https://files.pythonhosted.org/packages/20/ca/ba2af91f2418bee0d0e99df71dcd171ca863675de6a5260bbf06c120f084/highspy-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ceac08be37f75dc0af95669a0cfb073e5db5f07ead05cdcc81fd4b4394708d53", size = 1985967 }, ] [[package]] @@ -678,75 +746,75 @@ name = "htmlmin2" version = "0.1.13" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, + { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486 }, ] [[package]] name = "humanize" -version = "4.12.3" +version = "4.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/d1/bbc4d251187a43f69844f7fd8941426549bbe4723e8ff0a7441796b0789f/humanize-4.12.3.tar.gz", hash = "sha256:8430be3a615106fdfceb0b2c1b41c4c98c6b0fc5cc59663a5539b111dd325fb0", size = 80514, upload_time = "2025-04-30T11:51:07.98Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1e/62a2ec3104394a2975a2629eec89276ede9dbe717092f6966fcf963e1bf0/humanize-4.12.3-py3-none-any.whl", hash = "sha256:2cbf6370af06568fa6d2da77c86edb7886f3160ecd19ee1ffef07979efc597f6", size = 128487, upload_time = "2025-04-30T11:51:06.468Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869 }, ] [[package]] name = "identify" -version = "2.6.12" +version = "2.6.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload_time = "2025-05-23T20:37:53.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload_time = "2025-05-23T20:37:51.495Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172 }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } +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, upload_time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] name = "ijson" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212 }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175 }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011 }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094 }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903 }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339 }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580 }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280 }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512 }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081 }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216 }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170 }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013 }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564 }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917 }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897 }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711 }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691 }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738 }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512 }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074 }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694 }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390 }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140 }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739 }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338 }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515 }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081 }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253 }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816 }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760 }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948 }, ] [[package]] @@ -759,23 +827,23 @@ dependencies = [ { name = "pandas" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990, upload_time = "2025-02-06T09:16:10.723Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520, upload_time = "2025-02-06T09:16:09.042Z" }, + { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520 }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] [[package]] name = "ipykernel" -version = "6.29.5" +version = "6.30.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "appnope", marker = "sys_platform == 'darwin'" }, @@ -792,14 +860,14 @@ dependencies = [ { 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, upload_time = "2024-07-01T14:07:22.543Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/76/11082e338e0daadc89c8ff866185de11daf67d181901038f9e139d109761/ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b", size = 166260 } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload_time = "2024-07-01T14:07:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c7/b445faca8deb954fe536abebff4ece5b097b923de482b26e78448c89d1dd/ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4", size = 117484 }, ] [[package]] name = "ipython" -version = "9.4.0" +version = "9.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -813,9 +881,9 @@ dependencies = [ { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload_time = "2025-07-01T11:11:30.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137 } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload_time = "2025-07-01T11:11:27.85Z" }, + { url = "https://files.pythonhosted.org/packages/08/2a/5628a99d04acb2d2f2e749cdf4ea571d2575e898df0528a090948018b726/ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72", size = 612426 }, ] [[package]] @@ -825,18 +893,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, ] [[package]] @@ -846,9 +914,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } +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, upload_time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, ] [[package]] @@ -858,25 +926,25 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] name = "joblib" -version = "1.5.1" +version = "1.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload_time = "2025-05-23T12:04:37.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload_time = "2025-05-23T12:04:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396 }, ] [[package]] name = "jsmin" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925 } [[package]] name = "jsonlines" @@ -885,9 +953,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701 }, ] [[package]] @@ -897,14 +965,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838 } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105 }, ] [[package]] name = "jsonschema" -version = "4.24.0" +version = "4.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -912,21 +980,21 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480, upload_time = "2025-05-26T18:48:10.459Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709, upload_time = "2025-05-26T18:48:08.417Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040 }, ] [[package]] name = "jsonschema-specifications" -version = "2025.4.1" +version = "2025.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855 } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437 }, ] [[package]] @@ -940,9 +1008,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } +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, upload_time = "2024-09-17T10:44:15.218Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, ] [[package]] @@ -954,23 +1022,23 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload_time = "2025-05-27T07:38:16.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, ] [[package]] name = "jupyterlab-pygments" version = "0.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload_time = "2023-11-23T09:26:37.44Z" } +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, upload_time = "2023-11-23T09:26:34.325Z" }, + { 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 = "jupytext" -version = "1.17.2" +version = "1.17.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, @@ -979,9 +1047,9 @@ dependencies = [ { name = "packaging" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/ce/0bd5290ca4978777154e2683413dca761781aacf57f7dc0146f5210df8b1/jupytext-1.17.2.tar.gz", hash = "sha256:772d92898ac1f2ded69106f897b34af48ce4a85c985fa043a378ff5a65455f02", size = 3748577, upload_time = "2025-06-01T21:31:48.231Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/14/41faf71e168fcc6c48268f0fc67ba0d6acf6ee4e2c5c785c2bccb967c29d/jupytext-1.17.3.tar.gz", hash = "sha256:8b6dae76d63c95cad47b493c38f0d9c74491fb621dcd0980abfcac4c8f168679", size = 3753151 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/f1/82ea8e783433707cafd9790099a2d19f113c22f32a31c8bb5abdc7a61dbb/jupytext-1.17.2-py3-none-any.whl", hash = "sha256:4f85dc43bb6a24b75491c5c434001ad5ef563932f68f15dd3e1c8ce12a4a426b", size = 164401, upload_time = "2025-06-01T21:31:46.319Z" }, + { url = "https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-py3-none-any.whl", hash = "sha256:09b0a94cd904416e823a5ba9f41bd181031215b6fc682d2b5c18e68354feb17c", size = 166548 }, ] [[package]] @@ -1000,7 +1068,7 @@ dependencies = [ { name = "wheel" }, { name = "xlrd3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736 } [[package]] name = "license-expression" @@ -1009,9 +1077,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload_time = "2025-07-22T11:13:32.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402 } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615 }, ] [[package]] @@ -1022,139 +1090,157 @@ dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, ] [[package]] name = "lxml" -version = "6.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/bd/f9d01fd4132d81c6f43ab01983caea69ec9614b913c290a26738431a015d/lxml-6.0.1.tar.gz", hash = "sha256:2b3a882ebf27dd026df3801a87cf49ff791336e0f94b0fad195db77e01240690", size = 4070214, upload_time = "2025-08-22T10:37:53.525Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/a9/82b244c8198fcdf709532e39a1751943a36b3e800b420adc739d751e0299/lxml-6.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c03ac546adaabbe0b8e4a15d9ad815a281afc8d36249c246aecf1aaad7d6f200", size = 8422788, upload_time = "2025-08-22T10:32:56.612Z" }, - { url = "https://files.pythonhosted.org/packages/c9/8d/1ed2bc20281b0e7ed3e6c12b0a16e64ae2065d99be075be119ba88486e6d/lxml-6.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33b862c7e3bbeb4ba2c96f3a039f925c640eeba9087a4dc7a572ec0f19d89392", size = 4593547, upload_time = "2025-08-22T10:32:59.016Z" }, - { url = "https://files.pythonhosted.org/packages/76/53/d7fd3af95b72a3493bf7fbe842a01e339d8f41567805cecfecd5c71aa5ee/lxml-6.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a3ec1373f7d3f519de595032d4dcafae396c29407cfd5073f42d267ba32440d", size = 4948101, upload_time = "2025-08-22T10:33:00.765Z" }, - { url = "https://files.pythonhosted.org/packages/9d/51/4e57cba4d55273c400fb63aefa2f0d08d15eac021432571a7eeefee67bed/lxml-6.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03b12214fb1608f4cffa181ec3d046c72f7e77c345d06222144744c122ded870", size = 5108090, upload_time = "2025-08-22T10:33:03.108Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6e/5f290bc26fcc642bc32942e903e833472271614e24d64ad28aaec09d5dae/lxml-6.0.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:207ae0d5f0f03b30f95e649a6fa22aa73f5825667fee9c7ec6854d30e19f2ed8", size = 5021791, upload_time = "2025-08-22T10:33:06.972Z" }, - { url = "https://files.pythonhosted.org/packages/13/d4/2e7551a86992ece4f9a0f6eebd4fb7e312d30f1e372760e2109e721d4ce6/lxml-6.0.1-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:32297b09ed4b17f7b3f448de87a92fb31bb8747496623483788e9f27c98c0f00", size = 5358861, upload_time = "2025-08-22T10:33:08.967Z" }, - { url = "https://files.pythonhosted.org/packages/8a/5f/cb49d727fc388bf5fd37247209bab0da11697ddc5e976ccac4826599939e/lxml-6.0.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e18224ea241b657a157c85e9cac82c2b113ec90876e01e1f127312006233756", size = 5652569, upload_time = "2025-08-22T10:33:10.815Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b8/66c1ef8c87ad0f958b0a23998851e610607c74849e75e83955d5641272e6/lxml-6.0.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a07a994d3c46cd4020c1ea566345cf6815af205b1e948213a4f0f1d392182072", size = 5252262, upload_time = "2025-08-22T10:33:12.673Z" }, - { url = "https://files.pythonhosted.org/packages/1a/ef/131d3d6b9590e64fdbb932fbc576b81fcc686289da19c7cb796257310e82/lxml-6.0.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:2287fadaa12418a813b05095485c286c47ea58155930cfbd98c590d25770e225", size = 4710309, upload_time = "2025-08-22T10:33:14.952Z" }, - { url = "https://files.pythonhosted.org/packages/bc/3f/07f48ae422dce44902309aa7ed386c35310929dc592439c403ec16ef9137/lxml-6.0.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b4e597efca032ed99f418bd21314745522ab9fa95af33370dcee5533f7f70136", size = 5265786, upload_time = "2025-08-22T10:33:16.721Z" }, - { url = "https://files.pythonhosted.org/packages/11/c7/125315d7b14ab20d9155e8316f7d287a4956098f787c22d47560b74886c4/lxml-6.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9696d491f156226decdd95d9651c6786d43701e49f32bf23715c975539aa2b3b", size = 5062272, upload_time = "2025-08-22T10:33:18.478Z" }, - { url = "https://files.pythonhosted.org/packages/8b/c3/51143c3a5fc5168a7c3ee626418468ff20d30f5a59597e7b156c1e61fba8/lxml-6.0.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e4e3cd3585f3c6f87cdea44cda68e692cc42a012f0131d25957ba4ce755241a7", size = 4786955, upload_time = "2025-08-22T10:33:20.34Z" }, - { url = "https://files.pythonhosted.org/packages/11/86/73102370a420ec4529647b31c4a8ce8c740c77af3a5fae7a7643212d6f6e/lxml-6.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:45cbc92f9d22c28cd3b97f8d07fcefa42e569fbd587dfdac76852b16a4924277", size = 5673557, upload_time = "2025-08-22T10:33:22.282Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2d/aad90afaec51029aef26ef773b8fd74a9e8706e5e2f46a57acd11a421c02/lxml-6.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f8c9bcfd2e12299a442fba94459adf0b0d001dbc68f1594439bfa10ad1ecb74b", size = 5254211, upload_time = "2025-08-22T10:33:24.15Z" }, - { url = "https://files.pythonhosted.org/packages/63/01/c9e42c8c2d8b41f4bdefa42ab05448852e439045f112903dd901b8fbea4d/lxml-6.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e9dc2b9f1586e7cd77753eae81f8d76220eed9b768f337dc83a3f675f2f0cf9", size = 5275817, upload_time = "2025-08-22T10:33:26.007Z" }, - { url = "https://files.pythonhosted.org/packages/bc/1f/962ea2696759abe331c3b0e838bb17e92224f39c638c2068bf0d8345e913/lxml-6.0.1-cp312-cp312-win32.whl", hash = "sha256:987ad5c3941c64031f59c226167f55a04d1272e76b241bfafc968bdb778e07fb", size = 3610889, upload_time = "2025-08-22T10:33:28.169Z" }, - { url = "https://files.pythonhosted.org/packages/41/e2/22c86a990b51b44442b75c43ecb2f77b8daba8c4ba63696921966eac7022/lxml-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:abb05a45394fd76bf4a60c1b7bec0e6d4e8dfc569fc0e0b1f634cd983a006ddc", size = 4010925, upload_time = "2025-08-22T10:33:29.874Z" }, - { url = "https://files.pythonhosted.org/packages/b2/21/dc0c73325e5eb94ef9c9d60dbb5dcdcb2e7114901ea9509735614a74e75a/lxml-6.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:c4be29bce35020d8579d60aa0a4e95effd66fcfce31c46ffddf7e5422f73a299", size = 3671922, upload_time = "2025-08-22T10:33:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/43/c4/cd757eeec4548e6652eff50b944079d18ce5f8182d2b2cf514e125e8fbcb/lxml-6.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:485eda5d81bb7358db96a83546949c5fe7474bec6c68ef3fa1fb61a584b00eea", size = 8405139, upload_time = "2025-08-22T10:33:34.09Z" }, - { url = "https://files.pythonhosted.org/packages/ff/99/0290bb86a7403893f5e9658490c705fcea103b9191f2039752b071b4ef07/lxml-6.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d12160adea318ce3d118f0b4fbdff7d1225c75fb7749429541b4d217b85c3f76", size = 4585954, upload_time = "2025-08-22T10:33:36.294Z" }, - { url = "https://files.pythonhosted.org/packages/88/a7/4bb54dd1e626342a0f7df6ec6ca44fdd5d0e100ace53acc00e9a689ead04/lxml-6.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48c8d335d8ab72f9265e7ba598ae5105a8272437403f4032107dbcb96d3f0b29", size = 4944052, upload_time = "2025-08-22T10:33:38.19Z" }, - { url = "https://files.pythonhosted.org/packages/71/8d/20f51cd07a7cbef6214675a8a5c62b2559a36d9303fe511645108887c458/lxml-6.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:405e7cf9dbdbb52722c231e0f1257214202dfa192327fab3de45fd62e0554082", size = 5098885, upload_time = "2025-08-22T10:33:40.035Z" }, - { url = "https://files.pythonhosted.org/packages/5a/63/efceeee7245d45f97d548e48132258a36244d3c13c6e3ddbd04db95ff496/lxml-6.0.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:299a790d403335a6a057ade46f92612ebab87b223e4e8c5308059f2dc36f45ed", size = 5017542, upload_time = "2025-08-22T10:33:41.896Z" }, - { url = "https://files.pythonhosted.org/packages/57/5d/92cb3d3499f5caba17f7933e6be3b6c7de767b715081863337ced42eb5f2/lxml-6.0.1-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:48da704672f6f9c461e9a73250440c647638cc6ff9567ead4c3b1f189a604ee8", size = 5347303, upload_time = "2025-08-22T10:33:43.868Z" }, - { url = "https://files.pythonhosted.org/packages/69/f8/606fa16a05d7ef5e916c6481c634f40870db605caffed9d08b1a4fb6b989/lxml-6.0.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:21e364e1bb731489e3f4d51db416f991a5d5da5d88184728d80ecfb0904b1d68", size = 5641055, upload_time = "2025-08-22T10:33:45.784Z" }, - { url = "https://files.pythonhosted.org/packages/b3/01/15d5fc74ebb49eac4e5df031fbc50713dcc081f4e0068ed963a510b7d457/lxml-6.0.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bce45a2c32032afddbd84ed8ab092130649acb935536ef7a9559636ce7ffd4a", size = 5242719, upload_time = "2025-08-22T10:33:48.089Z" }, - { url = "https://files.pythonhosted.org/packages/42/a5/1b85e2aaaf8deaa67e04c33bddb41f8e73d07a077bf9db677cec7128bfb4/lxml-6.0.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:fa164387ff20ab0e575fa909b11b92ff1481e6876835014e70280769920c4433", size = 4717310, upload_time = "2025-08-22T10:33:49.852Z" }, - { url = "https://files.pythonhosted.org/packages/42/23/f3bb1292f55a725814317172eeb296615db3becac8f1a059b53c51fc1da8/lxml-6.0.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7587ac5e000e1594e62278422c5783b34a82b22f27688b1074d71376424b73e8", size = 5254024, upload_time = "2025-08-22T10:33:52.22Z" }, - { url = "https://files.pythonhosted.org/packages/b4/be/4d768f581ccd0386d424bac615d9002d805df7cc8482ae07d529f60a3c1e/lxml-6.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:57478424ac4c9170eabf540237125e8d30fad1940648924c058e7bc9fb9cf6dd", size = 5055335, upload_time = "2025-08-22T10:33:54.041Z" }, - { url = "https://files.pythonhosted.org/packages/40/07/ed61d1a3e77d1a9f856c4fab15ee5c09a2853fb7af13b866bb469a3a6d42/lxml-6.0.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:09c74afc7786c10dd6afaa0be2e4805866beadc18f1d843cf517a7851151b499", size = 4784864, upload_time = "2025-08-22T10:33:56.382Z" }, - { url = "https://files.pythonhosted.org/packages/01/37/77e7971212e5c38a55431744f79dff27fd751771775165caea096d055ca4/lxml-6.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7fd70681aeed83b196482d42a9b0dc5b13bab55668d09ad75ed26dff3be5a2f5", size = 5657173, upload_time = "2025-08-22T10:33:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/32/a3/e98806d483941cd9061cc838b1169626acef7b2807261fbe5e382fcef881/lxml-6.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:10a72e456319b030b3dd900df6b1f19d89adf06ebb688821636dc406788cf6ac", size = 5245896, upload_time = "2025-08-22T10:34:00.586Z" }, - { url = "https://files.pythonhosted.org/packages/07/de/9bb5a05e42e8623bf06b4638931ea8c8f5eb5a020fe31703abdbd2e83547/lxml-6.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0fa45fb5f55111ce75b56c703843b36baaf65908f8b8d2fbbc0e249dbc127ed", size = 5267417, upload_time = "2025-08-22T10:34:02.719Z" }, - { url = "https://files.pythonhosted.org/packages/f2/43/c1cb2a7c67226266c463ef8a53b82d42607228beb763b5fbf4867e88a21f/lxml-6.0.1-cp313-cp313-win32.whl", hash = "sha256:01dab65641201e00c69338c9c2b8a0f2f484b6b3a22d10779bb417599fae32b5", size = 3610051, upload_time = "2025-08-22T10:34:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/34/96/6a6c3b8aa480639c1a0b9b6faf2a63fb73ab79ffcd2a91cf28745faa22de/lxml-6.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:bdf8f7c8502552d7bff9e4c98971910a0a59f60f88b5048f608d0a1a75e94d1c", size = 4009325, upload_time = "2025-08-22T10:34:06.24Z" }, - { url = "https://files.pythonhosted.org/packages/8c/66/622e8515121e1fd773e3738dae71b8df14b12006d9fb554ce90886689fd0/lxml-6.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a6aeca75959426b9fd8d4782c28723ba224fe07cfa9f26a141004210528dcbe2", size = 3670443, upload_time = "2025-08-22T10:34:07.974Z" }, - { url = "https://files.pythonhosted.org/packages/38/e3/b7eb612ce07abe766918a7e581ec6a0e5212352194001fd287c3ace945f0/lxml-6.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:29b0e849ec7030e3ecb6112564c9f7ad6881e3b2375dd4a0c486c5c1f3a33859", size = 8426160, upload_time = "2025-08-22T10:34:10.154Z" }, - { url = "https://files.pythonhosted.org/packages/35/8f/ab3639a33595cf284fe733c6526da2ca3afbc5fd7f244ae67f3303cec654/lxml-6.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:02a0f7e629f73cc0be598c8b0611bf28ec3b948c549578a26111b01307fd4051", size = 4589288, upload_time = "2025-08-22T10:34:12.972Z" }, - { url = "https://files.pythonhosted.org/packages/2c/65/819d54f2e94d5c4458c1db8c1ccac9d05230b27c1038937d3d788eb406f9/lxml-6.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:beab5e54de016e730875f612ba51e54c331e2fa6dc78ecf9a5415fc90d619348", size = 4964523, upload_time = "2025-08-22T10:34:15.474Z" }, - { url = "https://files.pythonhosted.org/packages/5b/4a/d4a74ce942e60025cdaa883c5a4478921a99ce8607fc3130f1e349a83b28/lxml-6.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a08aefecd19ecc4ebf053c27789dd92c87821df2583a4337131cf181a1dffa", size = 5101108, upload_time = "2025-08-22T10:34:17.348Z" }, - { url = "https://files.pythonhosted.org/packages/cb/48/67f15461884074edd58af17b1827b983644d1fae83b3d909e9045a08b61e/lxml-6.0.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36c8fa7e177649470bc3dcf7eae6bee1e4984aaee496b9ccbf30e97ac4127fa2", size = 5053498, upload_time = "2025-08-22T10:34:19.232Z" }, - { url = "https://files.pythonhosted.org/packages/b6/d4/ec1bf1614828a5492f4af0b6a9ee2eb3e92440aea3ac4fa158e5228b772b/lxml-6.0.1-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:5d08e0f1af6916267bb7eff21c09fa105620f07712424aaae09e8cb5dd4164d1", size = 5351057, upload_time = "2025-08-22T10:34:21.143Z" }, - { url = "https://files.pythonhosted.org/packages/65/2b/c85929dacac08821f2100cea3eb258ce5c8804a4e32b774f50ebd7592850/lxml-6.0.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9705cdfc05142f8c38c97a61bd3a29581ceceb973a014e302ee4a73cc6632476", size = 5671579, upload_time = "2025-08-22T10:34:23.528Z" }, - { url = "https://files.pythonhosted.org/packages/d0/36/cf544d75c269b9aad16752fd9f02d8e171c5a493ca225cb46bb7ba72868c/lxml-6.0.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74555e2da7c1636e30bff4e6e38d862a634cf020ffa591f1f63da96bf8b34772", size = 5250403, upload_time = "2025-08-22T10:34:25.642Z" }, - { url = "https://files.pythonhosted.org/packages/c2/e8/83dbc946ee598fd75fdeae6151a725ddeaab39bb321354a9468d4c9f44f3/lxml-6.0.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:e38b5f94c5a2a5dadaddd50084098dfd005e5a2a56cd200aaf5e0a20e8941782", size = 4696712, upload_time = "2025-08-22T10:34:27.753Z" }, - { url = "https://files.pythonhosted.org/packages/f4/72/889c633b47c06205743ba935f4d1f5aa4eb7f0325d701ed2b0540df1b004/lxml-6.0.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a5ec101a92ddacb4791977acfc86c1afd624c032974bfb6a21269d1083c9bc49", size = 5268177, upload_time = "2025-08-22T10:34:29.804Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b6/f42a21a1428479b66ea0da7bd13e370436aecaff0cfe93270c7e165bd2a4/lxml-6.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5c17e70c82fd777df586c12114bbe56e4e6f823a971814fd40dec9c0de518772", size = 5094648, upload_time = "2025-08-22T10:34:31.703Z" }, - { url = "https://files.pythonhosted.org/packages/51/b0/5f8c1e8890e2ee1c2053c2eadd1cb0e4b79e2304e2912385f6ca666f48b1/lxml-6.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:45fdd0415a0c3d91640b5d7a650a8f37410966a2e9afebb35979d06166fd010e", size = 4745220, upload_time = "2025-08-22T10:34:33.595Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f9/820b5125660dae489ca3a21a36d9da2e75dd6b5ffe922088f94bbff3b8a0/lxml-6.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d417eba28981e720a14fcb98f95e44e7a772fe25982e584db38e5d3b6ee02e79", size = 5692913, upload_time = "2025-08-22T10:34:35.482Z" }, - { url = "https://files.pythonhosted.org/packages/23/8e/a557fae9eec236618aecf9ff35fec18df41b6556d825f3ad6017d9f6e878/lxml-6.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8e5d116b9e59be7934febb12c41cce2038491ec8fdb743aeacaaf36d6e7597e4", size = 5259816, upload_time = "2025-08-22T10:34:37.482Z" }, - { url = "https://files.pythonhosted.org/packages/fa/fd/b266cfaab81d93a539040be699b5854dd24c84e523a1711ee5f615aa7000/lxml-6.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c238f0d0d40fdcb695c439fe5787fa69d40f45789326b3bb6ef0d61c4b588d6e", size = 5276162, upload_time = "2025-08-22T10:34:39.507Z" }, - { url = "https://files.pythonhosted.org/packages/25/6c/6f9610fbf1de002048e80585ea4719591921a0316a8565968737d9f125ca/lxml-6.0.1-cp314-cp314-win32.whl", hash = "sha256:537b6cf1c5ab88cfd159195d412edb3e434fee880f206cbe68dff9c40e17a68a", size = 3669595, upload_time = "2025-08-22T10:34:41.783Z" }, - { url = "https://files.pythonhosted.org/packages/72/a5/506775e3988677db24dc75a7b03e04038e0b3d114ccd4bccea4ce0116c15/lxml-6.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:911d0a2bb3ef3df55b3d97ab325a9ca7e438d5112c102b8495321105d25a441b", size = 4079818, upload_time = "2025-08-22T10:34:44.04Z" }, - { url = "https://files.pythonhosted.org/packages/0a/44/9613f300201b8700215856e5edd056d4e58dd23368699196b58877d4408b/lxml-6.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:2834377b0145a471a654d699bdb3a2155312de492142ef5a1d426af2c60a0a31", size = 3753901, upload_time = "2025-08-22T10:34:45.799Z" }, +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887 }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818 }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807 }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179 }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044 }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685 }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127 }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958 }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541 }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426 }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917 }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795 }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759 }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666 }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989 }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456 }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793 }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836 }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494 }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146 }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932 }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060 }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000 }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496 }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779 }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072 }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675 }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171 }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175 }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688 }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655 }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695 }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841 }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700 }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347 }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248 }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801 }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403 }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974 }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953 }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054 }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421 }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684 }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463 }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437 }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890 }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185 }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895 }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246 }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797 }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404 }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072 }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617 }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930 }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380 }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632 }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171 }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109 }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061 }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233 }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739 }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119 }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665 }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997 }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957 }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372 }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653 }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795 }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023 }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420 }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837 }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205 }, ] [[package]] name = "markdown" -version = "3.8.2" +version = "3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071, upload_time = "2025-06-19T17:12:44.483Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585 } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload_time = "2025-06-19T17:12:42.994Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441 }, ] [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.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, upload_time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070 } 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, upload_time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321 }, ] [[package]] name = "marko" -version = "2.1.4" +version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/dc/c8cadbd83de1b38d95a48568b445a5553005ebdd32e00a333ca940113db4/marko-2.1.4.tar.gz", hash = "sha256:dd7d66f3706732bf8f994790e674649a4fd0a6c67f16b80246f30de8e16a1eac", size = 142795, upload_time = "2025-06-13T03:25:50.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/6a/32545d2379822fb9a8843f01150011402888492541977a1193fe8d695df0/marko-2.2.0.tar.gz", hash = "sha256:213c146ba197c1d6bcb06ae3658b7d87e45f6def35c09905b86aa6bb1984eba6", size = 143406 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/66/49e3691d14898fb6e34ccb337c7677dfb7e18269ed170f12e4b85315eae6/marko-2.1.4-py3-none-any.whl", hash = "sha256:81c2b9f570ca485bc356678d9ba1a1b3eb78b4a315d01f3ded25442fdc796990", size = 42186, upload_time = "2025-06-13T03:25:49.858Z" }, + { url = "https://files.pythonhosted.org/packages/94/b1/87f54d8842b2aafdbb162301ac730587e04f30ad0fe9aabb12fa29f7a6f7/marko-2.2.0-py3-none-any.whl", hash = "sha256:d84f867429142627e896322c8ef167664f3a6cd6ea5a2b70c6af055998041bb7", size = 42683 }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, +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/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]] @@ -1164,9 +1250,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } +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, upload_time = "2024-04-15T13:44:43.265Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, ] [[package]] @@ -1176,36 +1262,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload_time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload_time = "2025-08-11T07:25:47.597Z" }, + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205 }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +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, upload_time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload_time = "2021-02-05T18:55:30.623Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload_time = "2021-02-05T18:55:29.583Z" }, + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, ] [[package]] name = "mistune" -version = "3.1.3" +version = "3.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347, upload_time = "2025-03-19T14:27:24.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588 } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410, upload_time = "2025-03-19T14:27:23.451Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481 }, ] [[package]] @@ -1227,9 +1313,9 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload_time = "2024-08-30T12:24:06.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload_time = "2024-08-30T12:24:05.054Z" }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, ] [[package]] @@ -1239,9 +1325,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012, upload_time = "2024-08-25T12:50:09.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790, upload_time = "2024-08-25T12:50:08.151Z" }, + { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790 }, ] [[package]] @@ -1251,23 +1337,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload_time = "2023-08-04T14:42:25.67Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload_time = "2023-08-04T14:42:23.955Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235 }, ] [[package]] name = "mkdocs-autorefs" -version = "1.4.2" +version = "1.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/0c/c9826f35b99c67fa3a7cddfa094c1a6c43fafde558c309c6e4403e5b37dc/mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749", size = 54961, upload_time = "2025-05-20T13:09:09.886Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425 } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/dc/fc063b78f4b769d1956319351704e23ebeba1e9e1d6a41b4b602325fd7e4/mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13", size = 24969, upload_time = "2025-05-20T13:09:08.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034 }, ] [[package]] @@ -1278,7 +1364,7 @@ dependencies = [ { name = "mkdocs" }, { name = "pygtrie" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/3b/490d1b51fba7da69394e5a17f2c081eb65a10fb73565dc6793d53e4e4206/mkdocs-ezlinks-plugin-0.1.14.tar.gz", hash = "sha256:3e2085c16a850e022393e80194c17612e7b55de87fb45b3ffb618b5dfdb10811", size = 13366, upload_time = "2022-01-24T20:10:30.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/3b/490d1b51fba7da69394e5a17f2c081eb65a10fb73565dc6793d53e4e4206/mkdocs-ezlinks-plugin-0.1.14.tar.gz", hash = "sha256:3e2085c16a850e022393e80194c17612e7b55de87fb45b3ffb618b5dfdb10811", size = 13366 } [[package]] name = "mkdocs-get-deps" @@ -1289,9 +1375,9 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload_time = "2023-11-20T17:51:09.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload_time = "2023-11-20T17:51:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, ] [[package]] @@ -1302,9 +1388,9 @@ dependencies = [ { name = "mkdocs" }, { name = "pygithub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/88/e724563e9ff1b119869ef0704157caa8d7b9b9b4a8a8faf8120aa01620e2/mkdocs-git-committers-plugin-0.2.3.tar.gz", hash = "sha256:77188d8aacc11d5233d6949435670e3d6545ffb7a0e274d56f32ed3984353c61", size = 5379, upload_time = "2023-11-06T17:13:30.207Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/88/e724563e9ff1b119869ef0704157caa8d7b9b9b4a8a8faf8120aa01620e2/mkdocs-git-committers-plugin-0.2.3.tar.gz", hash = "sha256:77188d8aacc11d5233d6949435670e3d6545ffb7a0e274d56f32ed3984353c61", size = 5379 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/56/15fdbb6afa718a6c9de626bd11672040832ba547c03daf205e295be4e0d4/mkdocs_git_committers_plugin-0.2.3-py3-none-any.whl", hash = "sha256:4ca79efb7e61a72652d3512d61af5c40a4572e36667e1a00032aad524250780d", size = 4340, upload_time = "2023-11-06T17:13:28.979Z" }, + { url = "https://files.pythonhosted.org/packages/81/56/15fdbb6afa718a6c9de626bd11672040832ba547c03daf205e295be4e0d4/mkdocs_git_committers_plugin-0.2.3-py3-none-any.whl", hash = "sha256:4ca79efb7e61a72652d3512d61af5c40a4572e36667e1a00032aad524250780d", size = 4340 }, ] [[package]] @@ -1317,9 +1403,9 @@ dependencies = [ { name = "mkdocs" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload_time = "2025-05-28T18:26:20.697Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473 } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload_time = "2025-05-28T18:26:18.907Z" }, + { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382 }, ] [[package]] @@ -1334,18 +1420,19 @@ dependencies = [ { name = "nbconvert" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747, upload_time = "2024-10-15T14:56:32.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197, upload_time = "2024-10-15T14:56:29.854Z" }, + { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197 }, ] [[package]] name = "mkdocs-material" -version = "9.6.15" +version = "9.6.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, { name = "backrefs" }, + { name = "click" }, { name = "colorama" }, { name = "jinja2" }, { name = "markdown" }, @@ -1356,18 +1443,18 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/c1/f804ba2db2ddc2183e900befe7dad64339a34fa935034e1ab405289d0a97/mkdocs_material-9.6.15.tar.gz", hash = "sha256:64adf8fa8dba1a17905b6aee1894a5aafd966d4aeb44a11088519b0f5ca4f1b5", size = 3951836, upload_time = "2025-07-01T10:14:15.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/ee/6ed7fc739bd7591485c8bec67d5984508d3f2733e708f32714c21593341a/mkdocs_material-9.6.20.tar.gz", hash = "sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790", size = 4037822 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/30/dda19f0495a9096b64b6b3c07c4bfcff1c76ee0fc521086d53593f18b4c0/mkdocs_material-9.6.15-py3-none-any.whl", hash = "sha256:ac969c94d4fe5eb7c924b6d2f43d7db41159ea91553d18a9afc4780c34f2717a", size = 8716840, upload_time = "2025-07-01T10:14:13.18Z" }, + { url = "https://files.pythonhosted.org/packages/67/d8/a31dd52e657bf12b20574706d07df8d767e1ab4340f9bfb9ce73950e5e59/mkdocs_material-9.6.20-py3-none-any.whl", hash = "sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82", size = 9193367 }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload_time = "2023-11-22T19:09:45.208Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload_time = "2023-11-22T19:09:43.465Z" }, + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, ] [[package]] @@ -1380,9 +1467,9 @@ dependencies = [ { name = "jsmin" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366, upload_time = "2024-01-29T16:11:32.982Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723, upload_time = "2024-01-29T16:11:31.851Z" }, + { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723 }, ] [[package]] @@ -1392,9 +1479,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791, upload_time = "2024-11-18T13:15:13.977Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791 } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717, upload_time = "2024-11-18T13:15:12.286Z" }, + { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717 }, ] [[package]] @@ -1404,9 +1491,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162, upload_time = "2024-11-07T14:57:21.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142, upload_time = "2024-11-07T14:57:19.143Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142 }, ] [[package]] @@ -1419,9 +1506,9 @@ dependencies = [ { name = "pyyaml" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510, upload_time = "2024-08-29T14:08:09.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564, upload_time = "2024-08-29T14:08:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564 }, ] [[package]] @@ -1432,14 +1519,14 @@ dependencies = [ { name = "lxml" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633, upload_time = "2023-03-17T17:36:43.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570, upload_time = "2023-03-17T17:36:40.776Z" }, + { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570 }, ] [[package]] name = "mkdocstrings" -version = "0.29.1" +version = "0.30.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -1449,58 +1536,64 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686, upload_time = "2025-03-31T08:33:11.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350 } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075, upload_time = "2025-03-31T08:33:09.661Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704 }, ] [[package]] name = "mkdocstrings-python" -version = "1.16.12" +version = "1.18.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffe" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ed/b886f8c714fd7cccc39b79646b627dbea84cd95c46be43459ef46852caf0/mkdocstrings_python-1.16.12.tar.gz", hash = "sha256:9b9eaa066e0024342d433e332a41095c4e429937024945fea511afe58f63175d", size = 206065, upload_time = "2025-06-03T12:52:49.276Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/dd/a24ee3de56954bfafb6ede7cd63c2413bb842cc48eb45e41c43a05a33074/mkdocstrings_python-1.16.12-py3-none-any.whl", hash = "sha256:22ded3a63b3d823d57457a70ff9860d5a4de9e8b1e482876fc9baabaf6f5f374", size = 124287, upload_time = "2025-06-03T12:52:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215 }, ] [[package]] name = "mypy" -version = "1.16.1" +version = "1.18.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747, upload_time = "2025-06-16T16:51:35.145Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493, upload_time = "2025-06-16T16:47:01.683Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687, upload_time = "2025-06-16T16:48:19.367Z" }, - { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723, upload_time = "2025-06-16T16:49:20.912Z" }, - { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980, upload_time = "2025-06-16T16:37:40.929Z" }, - { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328, upload_time = "2025-06-16T16:34:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321, upload_time = "2025-06-16T16:48:58.823Z" }, - { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480, upload_time = "2025-06-16T16:47:56.205Z" }, - { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538, upload_time = "2025-06-16T16:46:43.92Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839, upload_time = "2025-06-16T16:36:28.039Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634, upload_time = "2025-06-16T16:50:34.441Z" }, - { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584, upload_time = "2025-06-16T16:34:54.857Z" }, - { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886, upload_time = "2025-06-16T16:36:43.589Z" }, - { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923, upload_time = "2025-06-16T16:48:02.366Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273 }, + { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910 }, + { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585 }, + { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562 }, + { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296 }, + { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828 }, + { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728 }, + { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758 }, + { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342 }, + { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709 }, + { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806 }, + { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262 }, + { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775 }, + { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852 }, + { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242 }, + { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683 }, + { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749 }, + { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959 }, + { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367 }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, ] [[package]] @@ -1513,9 +1606,9 @@ dependencies = [ { name = "nbformat" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload_time = "2024-12-19T10:32:27.164Z" } +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, upload_time = "2024-12-19T10:32:24.139Z" }, + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, ] [[package]] @@ -1538,9 +1631,9 @@ dependencies = [ { name = "pygments" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload_time = "2025-01-28T09:29:14.724Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload_time = "2025-01-28T09:29:12.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525 }, ] [[package]] @@ -1553,77 +1646,99 @@ dependencies = [ { name = "jupyter-core" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload_time = "2024-04-04T11:20:37.371Z" } +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, upload_time = "2024-04-04T11:20:34.895Z" }, + { 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, upload_time = "2024-01-21T14:25:19.227Z" } +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, upload_time = "2024-01-21T14:25:17.223Z" }, + { 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 = "networkx" version = "3.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload_time = "2025-05-29T11:35:07.804Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065 } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload_time = "2025-05-29T11:35:04.961Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406 }, ] [[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, upload_time = "2024-06-04T18:44:11.171Z" } +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, upload_time = "2024-06-04T18:44:08.352Z" }, + { 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 = "numpy" -version = "2.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372, upload_time = "2025-06-21T12:28:33.469Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/56/71ad5022e2f63cfe0ca93559403d0edef14aea70a841d640bd13cdba578e/numpy-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", size = 20896664, upload_time = "2025-06-21T12:15:30.845Z" }, - { url = "https://files.pythonhosted.org/packages/25/65/2db52ba049813670f7f987cc5db6dac9be7cd95e923cc6832b3d32d87cef/numpy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", size = 14131078, upload_time = "2025-06-21T12:15:52.23Z" }, - { url = "https://files.pythonhosted.org/packages/57/dd/28fa3c17b0e751047ac928c1e1b6990238faad76e9b147e585b573d9d1bd/numpy-2.3.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", size = 5112554, upload_time = "2025-06-21T12:16:01.434Z" }, - { url = "https://files.pythonhosted.org/packages/c9/fc/84ea0cba8e760c4644b708b6819d91784c290288c27aca916115e3311d17/numpy-2.3.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", size = 6646560, upload_time = "2025-06-21T12:16:11.895Z" }, - { url = "https://files.pythonhosted.org/packages/61/b2/512b0c2ddec985ad1e496b0bd853eeb572315c0f07cd6997473ced8f15e2/numpy-2.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", size = 14260638, upload_time = "2025-06-21T12:16:32.611Z" }, - { url = "https://files.pythonhosted.org/packages/6e/45/c51cb248e679a6c6ab14b7a8e3ead3f4a3fe7425fc7a6f98b3f147bec532/numpy-2.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", size = 16632729, upload_time = "2025-06-21T12:16:57.439Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ff/feb4be2e5c09a3da161b412019caf47183099cbea1132fd98061808c2df2/numpy-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", size = 15565330, upload_time = "2025-06-21T12:17:20.638Z" }, - { url = "https://files.pythonhosted.org/packages/bc/6d/ceafe87587101e9ab0d370e4f6e5f3f3a85b9a697f2318738e5e7e176ce3/numpy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77", size = 18361734, upload_time = "2025-06-21T12:17:47.938Z" }, - { url = "https://files.pythonhosted.org/packages/2b/19/0fb49a3ea088be691f040c9bf1817e4669a339d6e98579f91859b902c636/numpy-2.3.1-cp312-cp312-win32.whl", hash = "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", size = 6320411, upload_time = "2025-06-21T12:17:58.475Z" }, - { url = "https://files.pythonhosted.org/packages/b1/3e/e28f4c1dd9e042eb57a3eb652f200225e311b608632bc727ae378623d4f8/numpy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", size = 12734973, upload_time = "2025-06-21T12:18:17.601Z" }, - { url = "https://files.pythonhosted.org/packages/04/a8/8a5e9079dc722acf53522b8f8842e79541ea81835e9b5483388701421073/numpy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", size = 10191491, upload_time = "2025-06-21T12:18:33.585Z" }, - { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381, upload_time = "2025-06-21T12:19:04.103Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726, upload_time = "2025-06-21T12:19:25.599Z" }, - { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145, upload_time = "2025-06-21T12:19:34.782Z" }, - { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409, upload_time = "2025-06-21T12:19:45.228Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630, upload_time = "2025-06-21T12:20:06.544Z" }, - { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546, upload_time = "2025-06-21T12:20:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538, upload_time = "2025-06-21T12:20:54.322Z" }, - { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327, upload_time = "2025-06-21T12:21:21.053Z" }, - { url = "https://files.pythonhosted.org/packages/40/8d/2ddd6c9b30fcf920837b8672f6c65590c7d92e43084c25fc65edc22e93ca/numpy-2.3.1-cp313-cp313-win32.whl", hash = "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", size = 6312330, upload_time = "2025-06-21T12:25:07.447Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c8/beaba449925988d415efccb45bf977ff8327a02f655090627318f6398c7b/numpy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", size = 12731565, upload_time = "2025-06-21T12:25:26.444Z" }, - { url = "https://files.pythonhosted.org/packages/0b/c3/5c0c575d7ec78c1126998071f58facfc124006635da75b090805e642c62e/numpy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", size = 10190262, upload_time = "2025-06-21T12:25:42.196Z" }, - { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593, upload_time = "2025-06-21T12:21:51.664Z" }, - { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523, upload_time = "2025-06-21T12:22:13.583Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993, upload_time = "2025-06-21T12:22:22.53Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652, upload_time = "2025-06-21T12:22:33.629Z" }, - { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561, upload_time = "2025-06-21T12:22:55.056Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349, upload_time = "2025-06-21T12:23:20.53Z" }, - { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053, upload_time = "2025-06-21T12:23:43.697Z" }, - { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184, upload_time = "2025-06-21T12:24:10.708Z" }, - { url = "https://files.pythonhosted.org/packages/22/8a/ccdf201457ed8ac6245187850aff4ca56a79edbea4829f4e9f14d46fa9a5/numpy-2.3.1-cp313-cp313t-win32.whl", hash = "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", size = 6440678, upload_time = "2025-06-21T12:24:21.596Z" }, - { url = "https://files.pythonhosted.org/packages/f1/7e/7f431d8bd8eb7e03d79294aed238b1b0b174b3148570d03a8a8a8f6a0da9/numpy-2.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", size = 12870697, upload_time = "2025-06-21T12:24:40.644Z" }, - { url = "https://files.pythonhosted.org/packages/d4/ca/af82bf0fad4c3e573c6930ed743b5308492ff19917c7caaf2f9b6f9e2e98/numpy-2.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", size = 10260376, upload_time = "2025-06-21T12:24:56.884Z" }, +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014 }, + { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220 }, + { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918 }, + { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922 }, + { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991 }, + { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643 }, + { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787 }, + { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598 }, + { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800 }, + { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615 }, + { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936 }, + { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588 }, + { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802 }, + { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537 }, + { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743 }, + { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881 }, + { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301 }, + { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645 }, + { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179 }, + { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250 }, + { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269 }, + { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314 }, + { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025 }, + { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053 }, + { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444 }, + { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039 }, + { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722 }, + { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755 }, + { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560 }, + { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776 }, + { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281 }, + { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275 }, + { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527 }, + { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159 }, + { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624 }, + { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627 }, + { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926 }, + { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958 }, + { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920 }, + { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076 }, + { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952 }, + { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322 }, + { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630 }, + { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987 }, + { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076 }, + { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491 }, + { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913 }, + { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811 }, + { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689 }, + { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855 }, + { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520 }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371 }, + { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576 }, + { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953 }, ] [[package]] @@ -1637,9 +1752,9 @@ dependencies = [ { name = "pyarrow" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630, upload_time = "2025-06-16T16:15:05.49Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314, upload_time = "2025-06-16T16:15:04.328Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314 }, ] [[package]] @@ -1649,32 +1764,32 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "et-xmlfile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] [[package]] name = "paginate" version = "0.5.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload_time = "2024-08-25T14:17:24.139Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload_time = "2024-08-25T14:17:22.55Z" }, + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, ] [[package]] name = "pandas" -version = "2.3.1" +version = "2.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -1682,62 +1797,65 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload_time = "2025-07-07T19:20:04.079Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload_time = "2025-07-07T19:18:52.054Z" }, - { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload_time = "2025-07-07T19:18:54.785Z" }, - { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload_time = "2025-07-07T19:18:57.045Z" }, - { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload_time = "2025-07-07T19:18:59.771Z" }, - { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload_time = "2025-07-07T19:19:02.944Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload_time = "2025-07-07T19:19:06.82Z" }, - { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload_time = "2025-07-07T19:19:09.589Z" }, - { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload_time = "2025-07-07T19:19:12.245Z" }, - { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload_time = "2025-07-07T19:19:14.612Z" }, - { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload_time = "2025-07-07T19:19:16.857Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload_time = "2025-07-07T19:19:19.265Z" }, - { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload_time = "2025-07-07T19:19:21.547Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload_time = "2025-07-07T19:19:23.939Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload_time = "2025-07-07T19:19:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload_time = "2025-07-07T19:19:26.362Z" }, - { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload_time = "2025-07-07T19:19:29.157Z" }, - { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload_time = "2025-07-07T19:19:31.436Z" }, - { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload_time = "2025-07-07T19:19:34.267Z" }, - { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload_time = "2025-07-07T19:19:36.856Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload_time = "2025-07-07T19:19:39.999Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652 }, + { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686 }, + { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722 }, + { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803 }, + { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345 }, + { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314 }, + { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326 }, + { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061 }, + { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666 }, + { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835 }, + { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211 }, + { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277 }, + { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256 }, + { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579 }, + { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163 }, + { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860 }, + { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830 }, + { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216 }, + { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743 }, + { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141 }, ] [[package]] name = "pandocfilters" version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload_time = "2024-01-18T20:08:13.726Z" } +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, upload_time = "2024-01-18T20:08:11.28Z" }, + { 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" +version = "0.8.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload_time = "2024-04-05T09:43:55.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload_time = "2024-04-05T09:43:53.299Z" }, + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668 }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, ] [[package]] name = "petl" -version = "1.7.16" +version = "1.7.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/28/ce7321fbd3b981fd9c212adf7455e0e4e42babebd83b92e24f8265d13dd3/petl-1.7.16.tar.gz", hash = "sha256:9c2fea64d859da45e120fd86d471e5387396cc45d5d4986efa79679f18eb8752", size = 420780, upload_time = "2025-04-04T23:54:50.921Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/07/16a40e30700f7c6975e62cba01c2f94afbb347dd8ed224a5918c686a47fe/petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b", size = 424376 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/5c/ea831abc18dd3268046d7d9a0119f1f8ddc69642e0a5245f839602b8114d/petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1", size = 233093 }, +] [[package]] name = "pexpect" @@ -1746,80 +1864,80 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } +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, upload_time = "2023-11-25T06:56:14.81Z" }, + { 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.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload_time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload_time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload_time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload_time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload_time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload_time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload_time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload_time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload_time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload_time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload_time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload_time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload_time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload_time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload_time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload_time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload_time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload_time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload_time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload_time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload_time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload_time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload_time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload_time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload_time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload_time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload_time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload_time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload_time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload_time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload_time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload_time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload_time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload_time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload_time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload_time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload_time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload_time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload_time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload_time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload_time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload_time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload_time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload_time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload_time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload_time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload_time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload_time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload_time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload_time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload_time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload_time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload_time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload_time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload_time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload_time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload_time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload_time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload_time = "2025-07-01T09:15:50.399Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726 }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652 }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358 }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079 }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324 }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067 }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520 }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116 }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597 }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246 }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336 }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699 }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789 }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386 }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911 }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383 }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385 }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129 }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580 }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860 }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694 }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888 }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089 }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206 }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370 }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500 }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835 }, ] [[package]] name = "pint" -version = "0.24.4" +version = "0.25" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flexcache" }, @@ -1827,41 +1945,41 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload_time = "2024-11-07T16:29:46.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/cb/e6ffaf3d019e8501b1264dac529bf829ac2f1fe1d488cfcf67f1fccadacf/pint-0.25.tar.gz", hash = "sha256:22911a30d682ee0540d656571c19a7b1806ce00b2be88a16f67218108b7b8cc2", size = 253010 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload_time = "2024-11-07T16:29:43.976Z" }, + { url = "https://files.pythonhosted.org/packages/76/cc/c528311d798e22ec884b816e8aa2989e0f1f28cdc8e5969e2be5f10bce85/pint-0.25-py3-none-any.whl", hash = "sha256:cc20ae3dff010b9bbea41fb80c2de008f683cc83512cea73633d55aead80aa1e", size = 305462 }, ] [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload_time = "2025-05-07T22:47:42.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload_time = "2025-05-07T22:47:40.376Z" }, + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654 }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, ] [[package]] name = "ply" version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567 }, ] [[package]] name = "pre-commit" -version = "4.2.0" +version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -1870,103 +1988,98 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload_time = "2025-03-18T21:35:20.987Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload_time = "2025-03-18T21:35:19.343Z" }, + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965 }, ] [[package]] name = "prompt-toolkit" -version = "3.0.51" +version = "3.0.52" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload_time = "2025-04-15T09:18:47.731Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload_time = "2025-04-15T09:18:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431 }, ] [[package]] name = "psutil" -version = "7.0.0" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload_time = "2025-02-13T21:54:07.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/31/4723d756b59344b643542936e37a31d1d3204bcdc42a7daa8ee9eb06fb50/psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2", size = 497660 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload_time = "2025-02-13T21:54:12.36Z" }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload_time = "2025-02-13T21:54:16.07Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload_time = "2025-02-13T21:54:18.662Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload_time = "2025-02-13T21:54:21.811Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload_time = "2025-02-13T21:54:24.68Z" }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload_time = "2025-02-13T21:54:34.31Z" }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload_time = "2025-02-13T21:54:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/46/62/ce4051019ee20ce0ed74432dd73a5bb087a6704284a470bb8adff69a0932/psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13", size = 245242 }, + { url = "https://files.pythonhosted.org/packages/38/61/f76959fba841bf5b61123fbf4b650886dc4094c6858008b5bf73d9057216/psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5", size = 246682 }, + { url = "https://files.pythonhosted.org/packages/88/7a/37c99d2e77ec30d63398ffa6a660450b8a62517cabe44b3e9bae97696e8d/psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3", size = 287994 }, + { url = "https://files.pythonhosted.org/packages/9d/de/04c8c61232f7244aa0a4b9a9fbd63a89d5aeaf94b2fc9d1d16e2faa5cbb0/psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3", size = 291163 }, + { url = "https://files.pythonhosted.org/packages/f4/58/c4f976234bf6d4737bc8c02a81192f045c307b72cf39c9e5c5a2d78927f6/psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d", size = 293625 }, + { url = "https://files.pythonhosted.org/packages/79/87/157c8e7959ec39ced1b11cc93c730c4fb7f9d408569a6c59dbd92ceb35db/psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca", size = 244812 }, + { url = "https://files.pythonhosted.org/packages/bf/e9/b44c4f697276a7a95b8e94d0e320a7bf7f3318521b23de69035540b39838/psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d", size = 247965 }, + { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971 }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } +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, upload_time = "2020-12-28T15:15:28.35Z" }, + { 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, upload_time = "2024-07-21T12:58:21.801Z" } +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, upload_time = "2024-07-21T12:58:20.04Z" }, + { 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 = "pyarrow" -version = "20.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload_time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/d6/0c10e0d54f6c13eb464ee9b67a68b8c71bcf2f67760ef5b6fbcddd2ab05f/pyarrow-20.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:75a51a5b0eef32727a247707d4755322cb970be7e935172b6a3a9f9ae98404ba", size = 30815067, upload_time = "2025-04-27T12:29:44.384Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e2/04e9874abe4094a06fd8b0cbb0f1312d8dd7d707f144c2ec1e5e8f452ffa/pyarrow-20.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:211d5e84cecc640c7a3ab900f930aaff5cd2702177e0d562d426fb7c4f737781", size = 32297128, upload_time = "2025-04-27T12:29:52.038Z" }, - { url = "https://files.pythonhosted.org/packages/31/fd/c565e5dcc906a3b471a83273039cb75cb79aad4a2d4a12f76cc5ae90a4b8/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba3cf4182828be7a896cbd232aa8dd6a31bd1f9e32776cc3796c012855e1199", size = 41334890, upload_time = "2025-04-27T12:29:59.452Z" }, - { url = "https://files.pythonhosted.org/packages/af/a9/3bdd799e2c9b20c1ea6dc6fa8e83f29480a97711cf806e823f808c2316ac/pyarrow-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c3a01f313ffe27ac4126f4c2e5ea0f36a5fc6ab51f8726cf41fee4b256680bd", size = 42421775, upload_time = "2025-04-27T12:30:06.875Z" }, - { url = "https://files.pythonhosted.org/packages/10/f7/da98ccd86354c332f593218101ae56568d5dcedb460e342000bd89c49cc1/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a2791f69ad72addd33510fec7bb14ee06c2a448e06b649e264c094c5b5f7ce28", size = 40687231, upload_time = "2025-04-27T12:30:13.954Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1b/2168d6050e52ff1e6cefc61d600723870bf569cbf41d13db939c8cf97a16/pyarrow-20.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4250e28a22302ce8692d3a0e8ec9d9dde54ec00d237cff4dfa9c1fbf79e472a8", size = 42295639, upload_time = "2025-04-27T12:30:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/2d976c0c7158fd25591c8ca55aee026e6d5745a021915a1835578707feb3/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:89e030dc58fc760e4010148e6ff164d2f44441490280ef1e97a542375e41058e", size = 42908549, upload_time = "2025-04-27T12:30:29.551Z" }, - { url = "https://files.pythonhosted.org/packages/31/a9/dfb999c2fc6911201dcbf348247f9cc382a8990f9ab45c12eabfd7243a38/pyarrow-20.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6102b4864d77102dbbb72965618e204e550135a940c2534711d5ffa787df2a5a", size = 44557216, upload_time = "2025-04-27T12:30:36.977Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b", size = 25660496, upload_time = "2025-04-27T12:30:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload_time = "2025-04-27T12:30:48.351Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload_time = "2025-04-27T12:30:55.238Z" }, - { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload_time = "2025-04-27T12:31:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload_time = "2025-04-27T12:31:15.675Z" }, - { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload_time = "2025-04-27T12:31:24.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload_time = "2025-04-27T12:31:31.311Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload_time = "2025-04-27T12:31:39.406Z" }, - { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload_time = "2025-04-27T12:31:45.997Z" }, - { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload_time = "2025-04-27T12:31:54.11Z" }, - { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload_time = "2025-04-27T12:31:59.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload_time = "2025-04-27T12:32:05.369Z" }, - { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload_time = "2025-04-27T12:32:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload_time = "2025-04-27T12:32:20.766Z" }, - { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload_time = "2025-04-27T12:32:28.1Z" }, - { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload_time = "2025-04-27T12:32:35.792Z" }, - { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload_time = "2025-04-27T12:32:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload_time = "2025-04-27T12:32:56.503Z" }, - { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload_time = "2025-04-27T12:33:04.72Z" }, +version = "21.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305 }, + { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264 }, + { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099 }, + { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529 }, + { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883 }, + { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802 }, + { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175 }, + { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306 }, + { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622 }, + { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094 }, + { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576 }, + { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342 }, + { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218 }, + { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551 }, + { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064 }, + { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837 }, + { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158 }, + { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885 }, + { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625 }, + { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890 }, + { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006 }, ] [[package]] name = "pycparser" -version = "2.22" +version = "2.23" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload_time = "2024-03-30T13:22:22.564Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734 } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140 }, ] [[package]] name = "pydantic" -version = "2.11.7" +version = "2.11.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1974,9 +2087,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload_time = "2025-06-14T08:33:17.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload_time = "2025-06-14T08:33:14.905Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855 }, ] [[package]] @@ -1986,39 +2099,39 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, ] [[package]] @@ -2034,14 +2147,14 @@ dependencies = [ { name = "requests" }, { name = "wbgapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586, upload_time = "2025-06-03T09:38:12.25Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586 } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540, upload_time = "2025-06-03T09:38:10.858Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540 }, ] [[package]] name = "pygithub" -version = "2.7.0" +version = "2.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyjwt", extra = ["crypto"] }, @@ -2050,36 +2163,36 @@ dependencies = [ { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/a7/403e04aa96e2d94e1518d518d69718c2ba978c8d3ffa4ab3b101b94dbafa/pygithub-2.7.0.tar.gz", hash = "sha256:7cd6eafabb09b5369afba3586d86b1f1ad6f1326d2ff01bc47bb26615dce4cbb", size = 3707928, upload_time = "2025-07-31T11:52:53.714Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/74/e560bdeffea72ecb26cff27f0fad548bbff5ecc51d6a155311ea7f9e4c4c/pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9", size = 2246994 } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/76/d768dd31322173b3956692b75471ac37bf3759c7abb603152f6a9b6594a8/pygithub-2.7.0-py3-none-any.whl", hash = "sha256:40ecbfe26dc55cc34ab4b0ffa1d455e6f816ef9a2bc8d6f5ad18ce572f163700", size = 416514, upload_time = "2025-07-31T11:52:51.909Z" }, + { url = "https://files.pythonhosted.org/packages/07/ba/7049ce39f653f6140aac4beb53a5aaf08b4407b6a3019aae394c1c5244ff/pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0", size = 432709 }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] name = "pygtrie" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/13/55deec25bf09383216fa7f1dfcdbfca40a04aa00b6d15a5cbf25af8fce5f/pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2", size = 39266, upload_time = "2022-07-16T14:29:47.459Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/13/55deec25bf09383216fa7f1dfcdbfca40a04aa00b6d15a5cbf25af8fce5f/pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2", size = 39266 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/cd/bd196b2cf014afb1009de8b0f05ecd54011d881944e62763f3c1b1e8ef37/pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16", size = 25099, upload_time = "2022-09-23T20:30:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/ec/cd/bd196b2cf014afb1009de8b0f05ecd54011d881944e62763f3c1b1e8ef37/pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16", size = 25099 }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, ] [package.optional-dependencies] @@ -2089,35 +2202,52 @@ crypto = [ [[package]] name = "pymdown-extensions" -version = "10.16" +version = "10.16.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/0a/c06b542ac108bfc73200677309cd9188a3a01b127a63f20cadc18d873d88/pymdown_extensions-10.16.tar.gz", hash = "sha256:71dac4fca63fabeffd3eb9038b756161a33ec6e8d230853d3cecf562155ab3de", size = 853197, upload_time = "2025-06-21T17:56:36.974Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277 } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/d4/10bb14004d3c792811e05e21b5e5dcae805aacb739bd12a0540967b99592/pymdown_extensions-10.16-py3-none-any.whl", hash = "sha256:f5dd064a4db588cb2d95229fc4ee63a1b16cc8b4d0e6145c0899ed8723da1df2", size = 266143, upload_time = "2025-06-21T17:56:35.356Z" }, + { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178 }, ] [[package]] name = "pynacl" -version = "1.5.0" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854, upload_time = "2022-01-07T22:05:41.134Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920, upload_time = "2022-01-07T22:05:49.156Z" }, - { url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722, upload_time = "2022-01-07T22:05:50.989Z" }, - { url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087, upload_time = "2022-01-07T22:05:52.539Z" }, - { url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678, upload_time = "2022-01-07T22:05:54.251Z" }, - { url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660, upload_time = "2022-01-07T22:05:56.056Z" }, - { url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824, upload_time = "2022-01-07T22:05:57.434Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912, upload_time = "2022-01-07T22:05:58.665Z" }, - { url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624, upload_time = "2022-01-07T22:06:00.085Z" }, - { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141, upload_time = "2022-01-07T22:06:01.861Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/06/c6/a3124dee667a423f2c637cfd262a54d67d8ccf3e160f3c50f622a85b7723/pynacl-1.6.0.tar.gz", hash = "sha256:cb36deafe6e2bce3b286e5d1f3e1c246e0ccdb8808ddb4550bb2792f2df298f2", size = 3505641 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/24/1b639176401255605ba7c2b93a7b1eb1e379e0710eca62613633eb204201/pynacl-1.6.0-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:f46386c24a65383a9081d68e9c2de909b1834ec74ff3013271f1bca9c2d233eb", size = 384141 }, + { url = "https://files.pythonhosted.org/packages/5e/7b/874efdf57d6bf172db0df111b479a553c3d9e8bb4f1f69eb3ffff772d6e8/pynacl-1.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dea103a1afcbc333bc0e992e64233d360d393d1e63d0bc88554f572365664348", size = 808132 }, + { url = "https://files.pythonhosted.org/packages/f3/61/9b53f5913f3b75ac3d53170cdb897101b2b98afc76f4d9d3c8de5aa3ac05/pynacl-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:04f20784083014e265ad58c1b2dd562c3e35864b5394a14ab54f5d150ee9e53e", size = 1407253 }, + { url = "https://files.pythonhosted.org/packages/7c/0a/b138916b22bbf03a1bdbafecec37d714e7489dd7bcaf80cd17852f8b67be/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbcc4452a1eb10cd5217318c822fde4be279c9de8567f78bad24c773c21254f8", size = 843719 }, + { url = "https://files.pythonhosted.org/packages/01/3b/17c368197dfb2c817ce033f94605a47d0cc27901542109e640cef263f0af/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fed9fe1bec9e7ff9af31cd0abba179d0e984a2960c77e8e5292c7e9b7f7b5d", size = 1445441 }, + { url = "https://files.pythonhosted.org/packages/35/3c/f79b185365ab9be80cd3cd01dacf30bf5895f9b7b001e683b369e0bb6d3d/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:10d755cf2a455d8c0f8c767a43d68f24d163b8fe93ccfaabfa7bafd26be58d73", size = 825691 }, + { url = "https://files.pythonhosted.org/packages/f7/1f/8b37d25e95b8f2a434a19499a601d4d272b9839ab8c32f6b0fc1e40c383f/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:536703b8f90e911294831a7fbcd0c062b837f3ccaa923d92a6254e11178aaf42", size = 1410726 }, + { url = "https://files.pythonhosted.org/packages/bd/93/5a4a4cf9913014f83d615ad6a2df9187330f764f606246b3a744c0788c03/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6b08eab48c9669d515a344fb0ef27e2cbde847721e34bba94a343baa0f33f1f4", size = 801035 }, + { url = "https://files.pythonhosted.org/packages/bf/60/40da6b0fe6a4d5fd88f608389eb1df06492ba2edca93fca0b3bebff9b948/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5789f016e08e5606803161ba24de01b5a345d24590a80323379fc4408832d290", size = 1371854 }, + { url = "https://files.pythonhosted.org/packages/44/b2/37ac1d65008f824cba6b5bf68d18b76d97d0f62d7a032367ea69d4a187c8/pynacl-1.6.0-cp314-cp314t-win32.whl", hash = "sha256:4853c154dc16ea12f8f3ee4b7e763331876316cc3a9f06aeedf39bcdca8f9995", size = 230345 }, + { url = "https://files.pythonhosted.org/packages/f4/5a/9234b7b45af890d02ebee9aae41859b9b5f15fb4a5a56d88e3b4d1659834/pynacl-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:347dcddce0b4d83ed3f32fd00379c83c425abee5a9d2cd0a2c84871334eaff64", size = 243103 }, + { url = "https://files.pythonhosted.org/packages/c9/2c/c1a0f19d720ab0af3bc4241af2bdf4d813c3ecdcb96392b5e1ddf2d8f24f/pynacl-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2d6cd56ce4998cb66a6c112fda7b1fdce5266c9f05044fa72972613bef376d15", size = 187778 }, + { url = "https://files.pythonhosted.org/packages/63/37/87c72df19857c5b3b47ace6f211a26eb862ada495cc96daa372d96048fca/pynacl-1.6.0-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e", size = 382610 }, + { url = "https://files.pythonhosted.org/packages/0c/64/3ce958a5817fd3cc6df4ec14441c43fd9854405668d73babccf77f9597a3/pynacl-1.6.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16dd347cdc8ae0b0f6187a2608c0af1c8b7ecbbe6b4a06bff8253c192f696990", size = 798744 }, + { url = "https://files.pythonhosted.org/packages/e4/8a/3f0dd297a0a33fa3739c255feebd0206bb1df0b44c52fbe2caf8e8bc4425/pynacl-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16c60daceee88d04f8d41d0a4004a7ed8d9a5126b997efd2933e08e93a3bd850", size = 1397879 }, + { url = "https://files.pythonhosted.org/packages/41/94/028ff0434a69448f61348d50d2c147dda51aabdd4fbc93ec61343332174d/pynacl-1.6.0-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25720bad35dfac34a2bcdd61d9e08d6bfc6041bebc7751d9c9f2446cf1e77d64", size = 833907 }, + { url = "https://files.pythonhosted.org/packages/52/bc/a5cff7f8c30d5f4c26a07dfb0bcda1176ab8b2de86dda3106c00a02ad787/pynacl-1.6.0-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bfaa0a28a1ab718bad6239979a5a57a8d1506d0caf2fba17e524dbb409441cf", size = 1436649 }, + { url = "https://files.pythonhosted.org/packages/7a/20/c397be374fd5d84295046e398de4ba5f0722dc14450f65db76a43c121471/pynacl-1.6.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ef214b90556bb46a485b7da8258e59204c244b1b5b576fb71848819b468c44a7", size = 817142 }, + { url = "https://files.pythonhosted.org/packages/12/30/5efcef3406940cda75296c6d884090b8a9aad2dcc0c304daebb5ae99fb4a/pynacl-1.6.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:49c336dd80ea54780bcff6a03ee1a476be1612423010472e60af83452aa0f442", size = 1401794 }, + { url = "https://files.pythonhosted.org/packages/be/e1/a8fe1248cc17ccb03b676d80fa90763760a6d1247da434844ea388d0816c/pynacl-1.6.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f3482abf0f9815e7246d461fab597aa179b7524628a4bc36f86a7dc418d2608d", size = 772161 }, + { url = "https://files.pythonhosted.org/packages/a3/76/8a62702fb657d6d9104ce13449db221a345665d05e6a3fdefb5a7cafd2ad/pynacl-1.6.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:140373378e34a1f6977e573033d1dd1de88d2a5d90ec6958c9485b2fd9f3eb90", size = 1370720 }, + { url = "https://files.pythonhosted.org/packages/6d/38/9e9e9b777a1c4c8204053733e1a0269672c0bd40852908c9ad6b6eaba82c/pynacl-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6b393bc5e5a0eb86bb85b533deb2d2c815666665f840a09e0aa3362bb6088736", size = 791252 }, + { url = "https://files.pythonhosted.org/packages/63/ef/d972ce3d92ae05c9091363cf185e8646933f91c376e97b8be79ea6e96c22/pynacl-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a25cfede801f01e54179b8ff9514bd7b5944da560b7040939732d1804d25419", size = 1362910 }, + { url = "https://files.pythonhosted.org/packages/35/2c/ee0b373a1861f66a7ca8bdb999331525615061320dd628527a50ba8e8a60/pynacl-1.6.0-cp38-abi3-win32.whl", hash = "sha256:dcdeb41c22ff3c66eef5e63049abf7639e0db4edee57ba70531fc1b6b133185d", size = 226461 }, + { url = "https://files.pythonhosted.org/packages/75/f7/41b6c0b9dd9970173b6acc026bab7b4c187e4e5beef2756d419ad65482da/pynacl-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:cf831615cc16ba324240de79d925eacae8265b7691412ac6b24221db157f6bd1", size = 238802 }, + { url = "https://files.pythonhosted.org/packages/8e/0f/462326910c6172fa2c6ed07922b22ffc8e77432b3affffd9e18f444dbfbb/pynacl-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:84709cea8f888e618c21ed9a0efdb1a59cc63141c403db8bf56c469b71ad56f2", size = 183846 }, ] [[package]] @@ -2127,17 +2257,17 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/d4/bbb4ab79bb3015e3bdd488435ef71f7806144cc6ae4146ee6c5f64ac53f2/pyomo-6.9.4.tar.gz", hash = "sha256:34ad22cd6bf9956de9c0d3842d01c1f92dee0515b25aa3e8f113b326549b1231", size = 3033231, upload_time = "2025-08-28T02:11:24.976Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/d4/bbb4ab79bb3015e3bdd488435ef71f7806144cc6ae4146ee6c5f64ac53f2/pyomo-6.9.4.tar.gz", hash = "sha256:34ad22cd6bf9956de9c0d3842d01c1f92dee0515b25aa3e8f113b326549b1231", size = 3033231 } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/6b/80f40b4b72a3c6a207130ce431765f897c76133a15e7e38e66f9f40d36f3/pyomo-6.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc3cd52c143991071821bbb9943d2a59512481b5d15adb7add32f92def4172ce", size = 4266926, upload_time = "2025-08-28T02:09:44.833Z" }, - { url = "https://files.pythonhosted.org/packages/48/30/f7ef1be3deb445694b63800de6a36dff31670014d5aa67d42e1716c04970/pyomo-6.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a5e1dc79e1a2ec1f6247f0df59ac3572781e40218093a624f9213dd3ae6913f", size = 4255513, upload_time = "2025-08-28T02:09:49.197Z" }, - { url = "https://files.pythonhosted.org/packages/76/f4/9493daae82595d7d776ba6cd0d5d167951700670e363dec443415e753808/pyomo-6.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abea6ca55295b179c1c91184db4eece7589cfd6099869eff8e3e6aa8a06463d1", size = 4311852, upload_time = "2025-08-28T02:09:53.415Z" }, - { url = "https://files.pythonhosted.org/packages/83/d7/e39e605ab33c2729afb043bed94ce7ee382bd5b4bc708f6c90a1d2600456/pyomo-6.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddd48dec34b270ca2621863a216c4f3a6fcc409db86a7dc34c31eb788a44b8c6", size = 4343130, upload_time = "2025-08-28T02:09:57.397Z" }, - { url = "https://files.pythonhosted.org/packages/65/04/dc4d3d9369c4cb1b6e68ce18bbba066ea83284942322836e791dbf693bb2/pyomo-6.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1a768a178ae3f0391c66e2334da3d1618c9c85c9d879bc86de441efd143f491", size = 4267029, upload_time = "2025-08-28T02:10:02.066Z" }, - { url = "https://files.pythonhosted.org/packages/6b/52/824e9cea51ed0a25636b66e8c122dce5fcd22a197bf4646dd6c5f138fe36/pyomo-6.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09cde10e5fe8414f453d1ed3bccef1b42fc048fc2da0a9c936e40b2f877201bf", size = 4255606, upload_time = "2025-08-28T02:10:06.383Z" }, - { url = "https://files.pythonhosted.org/packages/a2/dc/97005d683ca57e231a8f613921adaf480d3a82f40d280c6d0185855a92c6/pyomo-6.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3e173d330666f881258deefa79f37373b941d4a5b00edc6aa5b10680720dc1", size = 4312670, upload_time = "2025-08-28T02:10:11.563Z" }, - { url = "https://files.pythonhosted.org/packages/64/73/47525078660eced084abb9a79e1e4c74098c992316c93ab6ead2dc7f8bda/pyomo-6.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a13baebcdb05deadeb0ec4b04ecedffa65f1e86179418fa67e603a4f8f1bf17", size = 4344540, upload_time = "2025-08-28T02:10:15.731Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e3/56c20c3358e58206e7270a42ff666a267a6c01492213c8c47aad8676b487/pyomo-6.9.4-py3-none-any.whl", hash = "sha256:a274d74616c0b793279931f3b2175a31f9c63213f2d7b86c14d168c6c264f782", size = 3892640, upload_time = "2025-08-28T02:11:13.845Z" }, + { url = "https://files.pythonhosted.org/packages/18/6b/80f40b4b72a3c6a207130ce431765f897c76133a15e7e38e66f9f40d36f3/pyomo-6.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc3cd52c143991071821bbb9943d2a59512481b5d15adb7add32f92def4172ce", size = 4266926 }, + { url = "https://files.pythonhosted.org/packages/48/30/f7ef1be3deb445694b63800de6a36dff31670014d5aa67d42e1716c04970/pyomo-6.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a5e1dc79e1a2ec1f6247f0df59ac3572781e40218093a624f9213dd3ae6913f", size = 4255513 }, + { url = "https://files.pythonhosted.org/packages/76/f4/9493daae82595d7d776ba6cd0d5d167951700670e363dec443415e753808/pyomo-6.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abea6ca55295b179c1c91184db4eece7589cfd6099869eff8e3e6aa8a06463d1", size = 4311852 }, + { url = "https://files.pythonhosted.org/packages/83/d7/e39e605ab33c2729afb043bed94ce7ee382bd5b4bc708f6c90a1d2600456/pyomo-6.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddd48dec34b270ca2621863a216c4f3a6fcc409db86a7dc34c31eb788a44b8c6", size = 4343130 }, + { url = "https://files.pythonhosted.org/packages/65/04/dc4d3d9369c4cb1b6e68ce18bbba066ea83284942322836e791dbf693bb2/pyomo-6.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1a768a178ae3f0391c66e2334da3d1618c9c85c9d879bc86de441efd143f491", size = 4267029 }, + { url = "https://files.pythonhosted.org/packages/6b/52/824e9cea51ed0a25636b66e8c122dce5fcd22a197bf4646dd6c5f138fe36/pyomo-6.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09cde10e5fe8414f453d1ed3bccef1b42fc048fc2da0a9c936e40b2f877201bf", size = 4255606 }, + { url = "https://files.pythonhosted.org/packages/a2/dc/97005d683ca57e231a8f613921adaf480d3a82f40d280c6d0185855a92c6/pyomo-6.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3e173d330666f881258deefa79f37373b941d4a5b00edc6aa5b10680720dc1", size = 4312670 }, + { url = "https://files.pythonhosted.org/packages/64/73/47525078660eced084abb9a79e1e4c74098c992316c93ab6ead2dc7f8bda/pyomo-6.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a13baebcdb05deadeb0ec4b04ecedffa65f1e86179418fa67e603a4f8f1bf17", size = 4344540 }, + { url = "https://files.pythonhosted.org/packages/d8/e3/56c20c3358e58206e7270a42ff666a267a6c01492213c8c47aad8676b487/pyomo-6.9.4-py3-none-any.whl", hash = "sha256:a274d74616c0b793279931f3b2175a31f9c63213f2d7b86c14d168c6c264f782", size = 3892640 }, ] [[package]] @@ -2147,14 +2277,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729 }, ] [[package]] name = "pytest" -version = "8.4.1" +version = "8.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -2163,23 +2293,23 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload_time = "2025-06-18T05:48:06.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618 } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload_time = "2025-06-18T05:48:03.955Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750 }, ] [[package]] name = "pytest-cov" -version = "6.2.1" +version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload_time = "2025-06-12T10:47:47.684Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload_time = "2025-06-12T10:47:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424 }, ] [[package]] @@ -2190,46 +2320,76 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload_time = "2025-07-01T13:30:59.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload_time = "2025-07-01T13:30:56.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, ] [[package]] name = "python-calamine" -version = "0.4.0" +version = "0.5.3" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/03/269f96535705b2f18c8977fa58e76763b4e4727a9b3ae277a9468c8ffe05/python_calamine-0.4.0.tar.gz", hash = "sha256:94afcbae3fec36d2d7475095a59d4dc6fae45829968c743cb799ebae269d7bbf", size = 127737, upload_time = "2025-07-04T06:05:28.626Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/60/f951513aaaa470b3a38a87d65eca45e0a02bc329b47864f5a17db563f746/python_calamine-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:74bca5d44a73acf3dcfa5370820797fcfd225c8c71abcddea987c5b4f5077e98", size = 826603, upload_time = "2025-07-04T06:03:51.245Z" }, - { url = "https://files.pythonhosted.org/packages/76/3f/789955bbc77831c639890758f945eb2b25d6358065edf00da6751226cf31/python_calamine-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf80178f5d1b0ee2ccfffb8549c50855f6249e930664adc5807f4d0d6c2b269c", size = 805826, upload_time = "2025-07-04T06:03:52.482Z" }, - { url = "https://files.pythonhosted.org/packages/00/4c/f87d17d996f647030a40bfd124fe45fe893c002bee35ae6aca9910a923ae/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfef345386ae86f7720f1be93495a40fd7e7feabb8caa1df5025d7fbc58a1f", size = 874989, upload_time = "2025-07-04T06:03:53.794Z" }, - { url = "https://files.pythonhosted.org/packages/47/d2/3269367303f6c0488cf1bfebded3f9fe968d118a988222e04c9b2636bf2e/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f23e6214dbf9b29065a5dcfd6a6c674dd0e251407298c9138611c907d53423ff", size = 877504, upload_time = "2025-07-04T06:03:55.095Z" }, - { url = "https://files.pythonhosted.org/packages/f9/6d/c7ac35f5c7125e8bd07eb36773f300fda20dd2da635eae78a8cebb0b6ab7/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d792d304ee232ab01598e1d3ab22e074a32c2511476b5fb4f16f4222d9c2a265", size = 1014171, upload_time = "2025-07-04T06:03:56.777Z" }, - { url = "https://files.pythonhosted.org/packages/f0/81/5ea8792a2e9ab5e2a05872db3a4d3ed3538ad5af1861282c789e2f13a8cf/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf813425918fd68f3e991ef7c4b5015be0a1a95fc4a8ab7e73c016ef1b881bb4", size = 926737, upload_time = "2025-07-04T06:03:58.024Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6e/989e56e6f073fc0981a74ba7a393881eb351bb143e5486aa629b5e5d6a8b/python_calamine-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbe2a0ccb4d003635888eea83a995ff56b0748c8c76fc71923544f5a4a7d4cd7", size = 887032, upload_time = "2025-07-04T06:03:59.298Z" }, - { url = "https://files.pythonhosted.org/packages/5d/92/2c9bd64277c6fe4be695d7d5a803b38d953ec8565037486be7506642c27c/python_calamine-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7b3bb5f0d910b9b03c240987560f843256626fd443279759df4e91b717826d2", size = 929700, upload_time = "2025-07-04T06:04:01.388Z" }, - { url = "https://files.pythonhosted.org/packages/64/fa/fc758ca37701d354a6bc7d63118699f1c73788a1f2e1b44d720824992764/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bd2c0fc2b5eabd08ceac8a2935bffa88dbc6116db971aa8c3f244bad3fd0f644", size = 1053971, upload_time = "2025-07-04T06:04:02.704Z" }, - { url = "https://files.pythonhosted.org/packages/65/52/40d7e08ae0ddba331cdc9f7fb3e92972f8f38d7afbd00228158ff6d1fceb/python_calamine-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:85b547cb1c5b692a0c2406678d666dbc1cec65a714046104683fe4f504a1721d", size = 1057057, upload_time = "2025-07-04T06:04:04.014Z" }, - { url = "https://files.pythonhosted.org/packages/16/de/e8a071c0adfda73285d891898a24f6e99338328c404f497ff5b0e6bc3d45/python_calamine-0.4.0-cp312-cp312-win32.whl", hash = "sha256:4c2a1e3a0db4d6de4587999a21cc35845648c84fba81c03dd6f3072c690888e4", size = 665540, upload_time = "2025-07-04T06:04:05.679Z" }, - { url = "https://files.pythonhosted.org/packages/5e/f2/7fdfada13f80db12356853cf08697ff4e38800a1809c2bdd26ee60962e7a/python_calamine-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b193c89ffcc146019475cd121c552b23348411e19c04dedf5c766a20db64399a", size = 695366, upload_time = "2025-07-04T06:04:06.977Z" }, - { url = "https://files.pythonhosted.org/packages/20/66/d37412ad854480ce32f50d9f74f2a2f88b1b8a6fbc32f70aabf3211ae89e/python_calamine-0.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:43a0f15e0b60c75a71b21a012b911d5d6f5fa052afad2a8edbc728af43af0fcf", size = 670740, upload_time = "2025-07-04T06:04:08.656Z" }, - { url = "https://files.pythonhosted.org/packages/5a/10/f78218ccdc5bb5591a37d582c7e8723121d0fbe8196c5a4089110ec02f22/python_calamine-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f8d6b2d2ae73acf91343f02756bdcb2fa6117db4eaf5cfab75ce50dfb54525ee", size = 826339, upload_time = "2025-07-04T06:04:10.254Z" }, - { url = "https://files.pythonhosted.org/packages/15/b1/d7d0dbbd0469db0fc628b1b9ee3a8f3b698391279f0d7aea96e2018a3863/python_calamine-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aca7e019f42ca16806fef53e3028fa158005c0e68eabda577c3f3c2bea9735fd", size = 805473, upload_time = "2025-07-04T06:04:11.557Z" }, - { url = "https://files.pythonhosted.org/packages/46/52/033b902fb11f9b4bb59fa18621acbf5eaf4ecb0bce878d34fcb0020229df/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aca67cb447ba8dcefa4d5a1131d1cfdd1e0d0a0f0c6470655ce9ad37b7cfa228", size = 874275, upload_time = "2025-07-04T06:04:13.318Z" }, - { url = "https://files.pythonhosted.org/packages/56/12/e6b589293314a5d10b2c309411542424ebefb77430cc715d7601d80349ae/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e127d3b78d511d4f6fbdfed02fe666d83a722d73e27dd64d1718be9efafbabfe", size = 877061, upload_time = "2025-07-04T06:04:15.013Z" }, - { url = "https://files.pythonhosted.org/packages/64/24/0eeb583eb5d44f674ca9f7a846c665e33190431386d7c9f6d08ec9f09d3c/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e47891d9d62e3015448749ddb2ba60ab583a651d0fca9a3a1794936942ad7d5d", size = 1013946, upload_time = "2025-07-04T06:04:16.647Z" }, - { url = "https://files.pythonhosted.org/packages/c4/93/360cf58b8e24f760a3d4643423389dbc37bdca8b6fdda75ffc664ce622b5/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4072bf9dcb8ec49f5b92688bd960b5d0e03e4826d227bbd66478a6f6b0aea06", size = 926462, upload_time = "2025-07-04T06:04:17.936Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5d/3b8c46ccc62d020858bc52f2d792208910eb68682c6ebf8d6706593d7a88/python_calamine-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabc9dc770f753c4227aacedd8390056937e67af0bf65d6696c584d3054f1287", size = 886319, upload_time = "2025-07-04T06:04:19.33Z" }, - { url = "https://files.pythonhosted.org/packages/66/cf/73241714800bddb277f827c4683f579b81915406bf7dc643dc185cef7eb2/python_calamine-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4bcf36dc77674892616b66cffba432f5fd62df3e0adb0487ec245036b50041", size = 929044, upload_time = "2025-07-04T06:04:20.689Z" }, - { url = "https://files.pythonhosted.org/packages/7c/6b/71e30ee568ce1ea6676be66f1a42c6397946859effc471cc102922fb4792/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f81518d4b49c47054cb1861badf5bcef44b0a49959968fb2e9c9cb89645c76af", size = 1053084, upload_time = "2025-07-04T06:04:22.414Z" }, - { url = "https://files.pythonhosted.org/packages/75/19/87b42fe975f8952754562785a545f6d2eec17c353befdf33a8e16c046ce0/python_calamine-0.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:18375eb3ac1362fcbf3a9fcad0672d8dc054001247bc52f063e0054a3e01a8d1", size = 1056735, upload_time = "2025-07-04T06:04:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/04/db/ecee6e5d6ed4f3725312580a83c4cb1758c9060aa08bf2d8512d3396cea1/python_calamine-0.4.0-cp313-cp313-win32.whl", hash = "sha256:c7e98c7e531bafdf719414d0c428f25f933a82640fb92e6e84864a85e758aecc", size = 665282, upload_time = "2025-07-04T06:04:25.274Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0b/26337e0a0e2b335c1d6225bda8de259a21fea129a06009c1471deda28e1f/python_calamine-0.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:6ec081b874e78f4dbcbe70804644281366814289956755575a5871f725592d4e", size = 694982, upload_time = "2025-07-04T06:04:26.573Z" }, - { url = "https://files.pythonhosted.org/packages/90/26/f72c2b2fe70f2901abb41fcdf8249181133ddd72b9392cfb63d030393b3e/python_calamine-0.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f9bdf570023138ee4090a51b1e34786978d6e649852ccc3b83ac9729f125ca2", size = 670283, upload_time = "2025-07-04T06:04:28.434Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/ca/295b37a97275d53f072c7307c9d0c4bfec565d3d74157e7fe336ea18de0a/python_calamine-0.5.3.tar.gz", hash = "sha256:b4529c955fa64444184630d5bc8c82c472d1cf6bfe631f0a7bfc5e4802d4e996", size = 130874 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/24/f6e3369be221baa6a50476b8a02f5100980ae487a630d80d4983b4c73879/python_calamine-0.5.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9a78e471bc02d3f76c294bf996562a9d0fbf2ad0a49d628330ba247865190f1", size = 844280 }, + { url = "https://files.pythonhosted.org/packages/e7/32/f9b689fe40616376457d1a6fd5ab84834066db31fa5ffd10a5b02f996a44/python_calamine-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcbd277a4d0a0108aa2f5126a89ca3f2bb18d0bec7ba7d614da02a4556d18ef2", size = 814054 }, + { url = "https://files.pythonhosted.org/packages/f7/26/a07bb6993ae0a524251060397edc710af413dbb175d56f1e1bbc7a2c39c9/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e6b68b26346f559a086bb84c960d4e9ddc79be8c3499752c1ba96051fea98f", size = 889447 }, + { url = "https://files.pythonhosted.org/packages/d8/79/5902d00658e2dd4efe3a4062b710a7eaa6082001c199717468fbcd8cef69/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e60ebeafebf66889753bfad0055edaa38068663961bb9a18e9f89aef2c9cec50", size = 883540 }, + { url = "https://files.pythonhosted.org/packages/d0/85/6299c909fcbba0663b527b82c87d204372e6f469b4ed5602f7bc1f7f1103/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d9da11edb40e9d2fb214fcf575be8004b44b1b407930eceb2458f1a84be634f", size = 1034891 }, + { url = "https://files.pythonhosted.org/packages/65/2c/d0cfd9161b3404528bfba9fe000093be19f2c83ede42c255da4ebfd4da17/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44d22bc52fe26b72a6dc07ab8a167d5d97aeb28282957f52b930e92106a35e3c", size = 935055 }, + { url = "https://files.pythonhosted.org/packages/b8/69/420c382535d1aca9af6bc929c78ad6b9f8416312aa4955b7977f5f864082/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b9ace667e04ea6631a0ada0e43dbc796c56e0d021f04bd64cdacb44de4504da", size = 904143 }, + { url = "https://files.pythonhosted.org/packages/d8/2b/19cc87654f9c85fbb6265a7ebe92cf0f649c308f0cf8f262b5c3de754d19/python_calamine-0.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ec0da29de7366258de2eb765a90b9e9fbe9f9865772f3609dacff302b894393", size = 948890 }, + { url = "https://files.pythonhosted.org/packages/18/e8/3547cb72d3a0f67c173ca07d9137046f2a6c87fdc31316b10e2d7d851f2a/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bba5adf123200503e6c07c667a8ce82c3b62ba02f9b3e99205be24fc73abc49", size = 1067802 }, + { url = "https://files.pythonhosted.org/packages/cb/69/31ab3e8010cbed814b5fcdb2ace43e5b76d6464f8abb1dfab9191416ca3d/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4c49bc58f3cfd1e9595a05cab7e71aa94f6cff5bf3916de2b87cdaa9b4ce9a3", size = 1074607 }, + { url = "https://files.pythonhosted.org/packages/c4/40/112d113d974bee5fff564e355b01df5bd524dbd5820c913c9dae574fe80a/python_calamine-0.5.3-cp312-cp312-win32.whl", hash = "sha256:42315463e139f5e44f4dedb9444fa0971c51e82573e872428050914f0dec4194", size = 669578 }, + { url = "https://files.pythonhosted.org/packages/3e/87/0af1cf4ad01a2df273cfd3abb7efaba4fba50395b98f5e871cee016d4f09/python_calamine-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8a24bd4c72bd984311f5ebf2e17a8aa3ce4e5ae87eda517c61c3507db8c045de", size = 713021 }, + { url = "https://files.pythonhosted.org/packages/5d/4e/6ed2ed3bb4c4c479e85d3444742f101f7b3099db1819e422bf861cf9923b/python_calamine-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:e4a713e56d3cca752d1a7d6a00dca81b224e2e1a0567d370bc0db537e042d6b0", size = 679615 }, + { url = "https://files.pythonhosted.org/packages/33/e7/14f2bec7b4bead0e71e78fa2549e22192c498a3204d931bd0e6522ec955d/python_calamine-0.5.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:90389cc459500644bbc1a1170b5e50a95160f34cedc8de7fe9a4bd1c08764039", size = 843906 }, + { url = "https://files.pythonhosted.org/packages/c2/6c/8c6e7a8c9b421e99ad1a637c3b96d94fef25abad6bf790a7ce35bfc5a48d/python_calamine-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:221b64c0e126a1263a14d575c61a60177cad852829dca61dfb4f5a8fb9603251", size = 813859 }, + { url = "https://files.pythonhosted.org/packages/c4/ee/f6745016a431f10620b4e803f306d95c57e828dea064e32fb944c0260559/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49f3aa50d532c6639be851a644875d5c9cd63892cf545ee614a5c0593dc50c3b", size = 889212 }, + { url = "https://files.pythonhosted.org/packages/b9/72/8de0af1823d587b2683eb25c6feef14c7ea917cfb975d094ad09f46245d0/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d8bf3b3542c771795cfcfa8a77d1373273311735517cca599aa7f89c34f38ae", size = 883584 }, + { url = "https://files.pythonhosted.org/packages/5a/90/47b91cf573b6bd4e6dbaeef4f993caf26dc0d2b8117261bc965bd70b38ce/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8e452fc1335ab1f7738c3d4d5144f11719b9c5585f3cb5102d47293355067a", size = 1034378 }, + { url = "https://files.pythonhosted.org/packages/48/f7/c75e5f0b0918f0f60b45fad4c313d159633615aa1c96a5170e3fe940862d/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4fc75ac97be47539465191a00de305c0e150465da8632c14fc1107a0b304f97", size = 934310 }, + { url = "https://files.pythonhosted.org/packages/cd/04/8b5806bdbfabdb51fd2816deac6870d031560f0bbd90d9729ac86b903579/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1258368551e0b235d5b46c105137294cbb5ca683b2c13f5851f3ebec7f2d42b", size = 903602 }, + { url = "https://files.pythonhosted.org/packages/75/4e/ec27837d5023b8db775db7798b3340eeb6bcb7f61ad64e892d4e1b14853e/python_calamine-0.5.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a7c51270e5ea518cb02cb531d84a2eb2de68da3cf48b26adae622f031dc5284", size = 948410 }, + { url = "https://files.pythonhosted.org/packages/3d/ba/8b5193637bfa0f363284974ae998f96fa1c8561a0a4d90378b0f202ac317/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e1d0df3d69b32da05e3e7648bb5802559d44979be721983f0d669b4128f920fa", size = 1067274 }, + { url = "https://files.pythonhosted.org/packages/da/1c/506791e4c7078f2fed1ee2d69703d62c0acfd5b671db157bb755f47cff42/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6d674ae194744b6080f20a0b5a253a9976d632ee91dc00e13e539e968167cd35", size = 1073351 }, + { url = "https://files.pythonhosted.org/packages/dc/83/e30e21484b1ed55668f67a63578d8a6ba70597a4d7ee8da23d759d3e1b3f/python_calamine-0.5.3-cp313-cp313-win32.whl", hash = "sha256:7a42ff0dae44457a4a3e65ea49357ffdf92e44f8b022ef1fb32c6498097d6d57", size = 669416 }, + { url = "https://files.pythonhosted.org/packages/1d/8f/29c617e9548ed2704657ebaa7d79067cad06cbbf7dd432a6cacd4cc19d16/python_calamine-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:054aee805c2cd5ab9848c2b8459822f2581cf22af45ff60251c9f45585cc06e0", size = 712760 }, + { url = "https://files.pythonhosted.org/packages/f8/35/d8117f99037100a28d17d9fbde121511c19d54ff4e5968d6aed693caeb87/python_calamine-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0e870f57651e2f76e7c1f009492aa342a7b1819f8b1131bf501240872777f944", size = 679372 }, + { url = "https://files.pythonhosted.org/packages/d9/0a/61949009a354af9ff5dc19e6816ae68a56281c0765520c9db4ff0ed20054/python_calamine-0.5.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e98c819cd43a7f0048f6d97c9d4ec23d72889cd722de1d6b68e0de24b1f8f037", size = 843418 }, + { url = "https://files.pythonhosted.org/packages/52/7b/4cb7fa988d17c98a0be6e9f74561d8a2381f28a2b88adb89f16abe345d2f/python_calamine-0.5.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cf90ce46420545f922cde95004ea8d5efaf3864b5a380a5d1defc7abd219421a", size = 813611 }, + { url = "https://files.pythonhosted.org/packages/01/34/4c2a6827da90f366be3fb9c7788f672f5e7d60808f9dbd01da5acc6f11ca/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e89caa6a1a55215be742cd44f6d94611fb6ab222a30325e772abc40566693e5", size = 888097 }, + { url = "https://files.pythonhosted.org/packages/17/bc/ecf5f6ac95195dfd3e9d63ab8c60b78d6466009751dfb1cdacf71d5f5e19/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b13177e42dac8de57870995699b237ce5a7886d9bd7fb745a36f867e5d3d3e62", size = 880861 }, + { url = "https://files.pythonhosted.org/packages/6e/55/8b60f99221a408f08db280b553aa4321c4cd9365e5c3101638249002d5a4/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:948e28b5f3246177440c70550661e0a27b414cb15535111fca7dbac2a63721b1", size = 1033023 }, + { url = "https://files.pythonhosted.org/packages/05/c5/8c378d3c2c56d12606e20b59eee3538d3b1177fe00b103bb98ef15176610/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37fef2b67bcd66b5dfc65b0779da9522c82f1ef9f97fc6034848072ff60b3f7", size = 933097 }, + { url = "https://files.pythonhosted.org/packages/26/04/cf14e91ac5c2d6d9795e1c39f3f53e0f173fcbaed4b00198e22a58265fdd/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddcef4e0e9d0479e027c90d9e1537bcf05de9bdd137cd7dfdbfc0034b1850973", size = 901917 }, + { url = "https://files.pythonhosted.org/packages/6e/2f/5b2065b9360bda792504fe3ac1cef6d9da51ceba6230ee7634886b44cce9/python_calamine-0.5.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6732b47f923102357bde348021a2892a41c2fb173958268c0a1ff8d5abb6b7e8", size = 943328 }, + { url = "https://files.pythonhosted.org/packages/ce/5a/45e4bd8473264b918d83297d15f160471029390cd06ed0056fc57e8f29eb/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:543db1b886cf994aaf7da0752022b37c42c05acb7605b56d09047023c8387610", size = 1065993 }, + { url = "https://files.pythonhosted.org/packages/35/6b/2afd47608495f23408bdf2f1ff57a144700aed8b5bbe50285ac4864edf53/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b79135dd96129253dc0e547778c700e1e3782e7671e7047c8b106b5501e33706", size = 1071801 }, + { url = "https://files.pythonhosted.org/packages/f7/db/b06a15f25e63290c2efc5433fa8b395bfe870aacbf4ea6c930764d53eca6/python_calamine-0.5.3-cp313-cp313t-win32.whl", hash = "sha256:d84dc3b78adf038a2b452fc784523dcc90477f1631d33aabc0872812db5beb26", size = 669485 }, + { url = "https://files.pythonhosted.org/packages/2d/40/e51adf1dae2002f189c83ae527aad017372d1a1b97a22172dc2e51ce502d/python_calamine-0.5.3-cp313-cp313t-win_amd64.whl", hash = "sha256:8a3fd541576fdf2708e40064ebaaf561a0a2afcab01de91c83ec212193bede34", size = 712636 }, + { url = "https://files.pythonhosted.org/packages/56/fa/db4dc8d27a5daa14a153aebc0cb98bad6fd700befd9e67440a8017f0e108/python_calamine-0.5.3-cp313-cp313t-win_arm64.whl", hash = "sha256:b28a9c9318a5e7dabcead1803bfd48be5bf7c9f339d6e505a5989650a6102487", size = 678307 }, + { url = "https://files.pythonhosted.org/packages/ee/7f/a098680c9d6ad36fe850f2c2c28627ee3bc95aaa052f375806f69c075475/python_calamine-0.5.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b5cdcd85cc08a1805d267fc66aa100940712de6b4524951ab91ba47fa60d481f", size = 843921 }, + { url = "https://files.pythonhosted.org/packages/09/ce/3de5d714779fac6e3333e7ea98ce4eae3b2479eb8a3d2f7d9e4487e16681/python_calamine-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:828cd5d49fe9eb9c1fc9219fe484b07f2ba9a1e5e3b8475d7f1415e0fa316df8", size = 814173 }, + { url = "https://files.pythonhosted.org/packages/cb/14/ef98575838091b6b24274160d53607e78df94f0176af360bcb063512e643/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d3f4d0532ab4de422fc4b707cdbb93d57ca7ccf9be8bc4742fb9376dc68f861", size = 888958 }, + { url = "https://files.pythonhosted.org/packages/c0/b1/c999dd1f89f415ff06f88f37bce643ece3c4d51ae051e0a143ff16f44c1c/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a9ba0a16e4335b676232ddbbea0fd09bfb94757ca6e4cf90ce1348aa843f3f", size = 880988 }, + { url = "https://files.pythonhosted.org/packages/74/16/4984532280e4b2c81aa26ae57b37fc3eaeda414e46e2d9c6a9cfdb27cd56/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0928d0eb1cdea229464de280d0f7cd99314ba28cffd2c4d6c9ce6902f9d6d448", size = 1035685 }, + { url = "https://files.pythonhosted.org/packages/cd/dc/91776b34ab09f36ea41449951148bef731f9b355a2d2b25d398eec774926/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f9519dd3b8814ef6e801b9797f918fe7a59937fac4784cb280c8350fb1a2cf", size = 933865 }, + { url = "https://files.pythonhosted.org/packages/01/97/12deaff5e608207398a9f0eaa06447ed69e8c4873ee953be553f9440881a/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954cd764c6b24735c749a447523b4ccf4b9d2b7c231ddd304ed42c15afca9516", size = 902310 }, + { url = "https://files.pythonhosted.org/packages/45/da/45063eee203f6c9d9436d29dfc0f01db85c9264c86d1e438c3b452d7e97f/python_calamine-0.5.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3f0e9c59fece6bbf1a916947fba33e9b635327eb165784d05efed40027164d1", size = 948143 }, + { url = "https://files.pythonhosted.org/packages/33/07/0b661166dd58367bd5d6cc2bf8441f61004dd5ef2555ab224da97b1ac5d3/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:63bb47cc080d8eb9bc654f0961ada385b58a57d4628b0a33d1003c8f62e6ae3d", size = 1067181 }, + { url = "https://files.pythonhosted.org/packages/5d/80/58b107dc2c2e6bad581f58f54b3ccb07705094ff23734c8dd30bd8aef4e8/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:adb62aab9b9298b2fc378b2aec6dd5802f7ee199c3431abae29368ef046f8005", size = 1072683 }, + { url = "https://files.pythonhosted.org/packages/4c/b4/667e40dbe7d4f19a2e69f9cd186e069cd3af0411a177aa2a90231e3e0b06/python_calamine-0.5.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1de68d2586df7a7a05a7779031dabd4c3d95d4738314ba82e943c8d3f36b5a67", size = 843526 }, + { url = "https://files.pythonhosted.org/packages/3e/f7/fb86da5920198a616583f07d1a395cb1241eafb930d5c33f597ae6664711/python_calamine-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c70033bbd59f05491743befec5e2a90784f4c8220e7379ce03e956bd1f475be", size = 811074 }, + { url = "https://files.pythonhosted.org/packages/76/2e/5a5a618b351b75155fbb40ad88e166f17ccf202401dd4b830db05b2565a6/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f396a0e57b1a5462668fc247377714b5b4c061718c1863c00ddc64e770b0f1e", size = 887735 }, + { url = "https://files.pythonhosted.org/packages/97/cf/3cfaa550eb1c9c5501728886c5e787c3ddeb34d8bf3e7e9fcaf9fc6fbd86/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce737cb19d3077cabe0acaecd6b55d5df75021a520c20b47e0c75b65b4bfa919", size = 882356 }, + { url = "https://files.pythonhosted.org/packages/88/b8/97f56e337149d0ce53399be9bd583f735dc1ea9abb2745ac902a09e8c401/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e54b30802fe089cc0c67c67407203412ec7144e84e0960e69c529c7170c37dae", size = 1033195 }, + { url = "https://files.pythonhosted.org/packages/94/45/59a21a18c8e073d2f930a4a9c0c038207b82c5c996b67146fb76f3da2748/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5efc94c2e4119dc0da1e84d036f7e840fb0dd0850f4c10d3d166d725af0751af", size = 931846 }, + { url = "https://files.pythonhosted.org/packages/36/47/715e0c0bc37ccce035ef4be1aa8eafa1e5abb6687af725cb47d81a18def7/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e33191a01d52f66dd6b029e99b6eda0245771c4f116c87ff0d5edf922dbbca", size = 902871 }, + { url = "https://files.pythonhosted.org/packages/ca/07/ac0cf8623765106794e297235d6dde3a728f18e61a536792189fca06f2ba/python_calamine-0.5.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85ceec02cb367cf87a72ba559db3279f3b4774edba9330eb77670587d4de95f4", size = 944438 }, + { url = "https://files.pythonhosted.org/packages/88/98/c48c0b8be7fbae5f68b7c55a1ed4068d2c3dab64093e39733d43c23a7459/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:882400368f976ea489e47af04fde936b603c3efcf9ade1cd73e623c88fc4aa5c", size = 1066276 }, + { url = "https://files.pythonhosted.org/packages/73/3a/bbf99531fec43bca2ab28948ab94d851db96c0364c76139dd746cab2f4f9/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ce2fe421d5564e5341f7a06b9c52b84603b48aa670426d44fffce705609a859b", size = 1073059 }, ] [[package]] @@ -2239,9 +2399,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +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, upload_time = "2024-03-01T18:36:18.57Z" }, + { 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]] @@ -2251,16 +2411,16 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload_time = "2025-03-11T12:27:27.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, + { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453 }, ] [[package]] name = "python-io-wrapper" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271 } [[package]] name = "python-slugify" @@ -2269,57 +2429,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] [[package]] name = "pywin32" -version = "310" +version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, - { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, - { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, - { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543 }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040 }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102 }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700 }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700 }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318 }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714 }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800 }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540 }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, +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/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]] @@ -2329,46 +2492,59 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload_time = "2025-05-13T15:24:01.64Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload_time = "2025-05-13T15:23:59.629Z" }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722 }, ] [[package]] name = "pyzmq" -version = "27.0.0" +version = "27.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload_time = "2025-06-13T14:09:07.087Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload_time = "2025-06-13T14:07:31.676Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload_time = "2025-06-13T14:07:33.104Z" }, - { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload_time = "2025-06-13T14:07:34.831Z" }, - { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload_time = "2025-06-13T14:07:36.553Z" }, - { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload_time = "2025-06-13T14:07:38.21Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload_time = "2025-06-13T14:07:39.599Z" }, - { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload_time = "2025-06-13T14:07:41.027Z" }, - { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload_time = "2025-06-13T14:07:42.533Z" }, - { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload_time = "2025-06-13T14:07:43.843Z" }, - { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload_time = "2025-06-13T14:07:45.51Z" }, - { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826, upload_time = "2025-06-13T14:07:46.881Z" }, - { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283, upload_time = "2025-06-13T14:07:49.562Z" }, - { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567, upload_time = "2025-06-13T14:07:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681, upload_time = "2025-06-13T14:07:52.77Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148, upload_time = "2025-06-13T14:07:54.178Z" }, - { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768, upload_time = "2025-06-13T14:07:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199, upload_time = "2025-06-13T14:07:57.166Z" }, - { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439, upload_time = "2025-06-13T14:07:58.959Z" }, - { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload_time = "2025-06-13T14:08:00.777Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279 }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645 }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574 }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995 }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070 }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121 }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550 }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184 }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480 }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993 }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436 }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301 }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197 }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275 }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469 }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961 }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282 }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468 }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394 }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964 }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029 }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541 }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197 }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175 }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427 }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929 }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193 }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388 }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316 }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472 }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401 }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170 }, ] [[package]] name = "ratelimit" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251 } [[package]] name = "referencing" @@ -2379,14 +2555,14 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, ] [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -2394,9 +2570,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload_time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload_time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, ] [[package]] @@ -2406,14 +2582,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244 }, ] [[package]] name = "reuse" -version = "5.0.2" +version = "5.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -2425,145 +2601,150 @@ dependencies = [ { name = "python-debian" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/43/35421efe0e69823787b331362e11cc16bb697cd6f19cbed284d421615f14/reuse-5.0.2.tar.gz", hash = "sha256:878016ae5dd29c10bad4606d6676c12a268c12aa9fcfea66403598e16eed085c", size = 358798, upload_time = "2024-11-14T09:33:17.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/f7/b59fe851b856d0932aedbf311a3d719f30783e27af6d05bb76d77072ab8f/reuse-5.1.1.tar.gz", hash = "sha256:a13914ed8b66b8e5956e96c63203c63d72b55280d348849ccc0eb314c73248cb", size = 419022 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309, upload_time = "2024-11-14T09:33:15.047Z" }, + { url = "https://files.pythonhosted.org/packages/c9/95/12451ff8bc2c3e8a5755bc810a538de85444015d44353fc6f7ee8800c0bb/reuse-5.1.1-cp313-cp313-manylinux_2_41_x86_64.whl", hash = "sha256:15a68341949b7ddb3630d8d3a49d9537bbc143ee235dca77cc3f4047237c8299", size = 255386 }, ] [[package]] name = "rfc3986" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326 }, ] [[package]] name = "rich" -version = "13.9.4" +version = "14.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload_time = "2024-11-01T16:43:57.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441 } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload_time = "2024-11-01T16:43:55.817Z" }, + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368 }, ] [[package]] name = "rpds-py" -version = "0.26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload_time = "2025-07-01T15:57:13.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload_time = "2025-07-01T15:54:15.734Z" }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload_time = "2025-07-01T15:54:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload_time = "2025-07-01T15:54:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload_time = "2025-07-01T15:54:19.295Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload_time = "2025-07-01T15:54:20.858Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload_time = "2025-07-01T15:54:22.508Z" }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload_time = "2025-07-01T15:54:23.987Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload_time = "2025-07-01T15:54:25.073Z" }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload_time = "2025-07-01T15:54:26.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload_time = "2025-07-01T15:54:27.424Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload_time = "2025-07-01T15:54:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload_time = "2025-07-01T15:54:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload_time = "2025-07-01T15:54:32.195Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload_time = "2025-07-01T15:54:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload_time = "2025-07-01T15:54:34.755Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload_time = "2025-07-01T15:54:36.292Z" }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload_time = "2025-07-01T15:54:37.469Z" }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload_time = "2025-07-01T15:54:38.954Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload_time = "2025-07-01T15:54:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload_time = "2025-07-01T15:54:43.025Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload_time = "2025-07-01T15:54:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload_time = "2025-07-01T15:54:46.043Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload_time = "2025-07-01T15:54:47.64Z" }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload_time = "2025-07-01T15:54:48.9Z" }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload_time = "2025-07-01T15:54:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload_time = "2025-07-01T15:54:52.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload_time = "2025-07-01T15:54:53.692Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload_time = "2025-07-01T15:54:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload_time = "2025-07-01T15:54:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload_time = "2025-07-01T15:54:58.561Z" }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload_time = "2025-07-01T15:54:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload_time = "2025-07-01T15:55:00.898Z" }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload_time = "2025-07-01T15:55:02.201Z" }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload_time = "2025-07-01T15:55:03.698Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload_time = "2025-07-01T15:55:05.398Z" }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload_time = "2025-07-01T15:55:08.316Z" }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload_time = "2025-07-01T15:55:09.52Z" }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload_time = "2025-07-01T15:55:11.216Z" }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload_time = "2025-07-01T15:55:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload_time = "2025-07-01T15:55:14.486Z" }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload_time = "2025-07-01T15:55:15.745Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload_time = "2025-07-01T15:55:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload_time = "2025-07-01T15:55:18.922Z" }, - { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload_time = "2025-07-01T15:55:20.399Z" }, - { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload_time = "2025-07-01T15:55:21.729Z" }, - { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload_time = "2025-07-01T15:55:22.918Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload_time = "2025-07-01T15:55:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload_time = "2025-07-01T15:55:25.554Z" }, - { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload_time = "2025-07-01T15:55:27.798Z" }, - { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload_time = "2025-07-01T15:55:29.057Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload_time = "2025-07-01T15:55:30.719Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload_time = "2025-07-01T15:55:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload_time = "2025-07-01T15:55:33.312Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload_time = "2025-07-01T15:55:34.933Z" }, - { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload_time = "2025-07-01T15:55:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload_time = "2025-07-01T15:55:37.483Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload_time = "2025-07-01T15:55:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload_time = "2025-07-01T15:55:40.175Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload_time = "2025-07-01T15:55:42.015Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload_time = "2025-07-01T15:55:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload_time = "2025-07-01T15:55:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload_time = "2025-07-01T15:55:47.098Z" }, - { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload_time = "2025-07-01T15:55:48.412Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload_time = "2025-07-01T15:55:49.816Z" }, - { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload_time = "2025-07-01T15:55:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload_time = "2025-07-01T15:55:52.541Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload_time = "2025-07-01T15:55:53.874Z" }, - { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload_time = "2025-07-01T15:55:55.167Z" }, +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795 }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121 }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976 }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953 }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915 }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883 }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699 }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713 }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324 }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646 }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137 }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343 }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497 }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790 }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741 }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574 }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051 }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395 }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334 }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691 }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868 }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469 }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125 }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341 }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511 }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736 }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462 }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034 }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392 }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355 }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138 }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247 }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699 }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852 }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582 }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126 }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486 }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832 }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249 }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356 }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300 }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714 }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943 }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472 }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676 }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313 }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080 }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868 }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750 }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688 }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225 }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361 }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493 }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623 }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800 }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943 }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739 }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120 }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944 }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283 }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320 }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760 }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476 }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418 }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771 }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787 }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538 }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512 }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813 }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385 }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097 }, ] [[package]] name = "ruamel-yaml" -version = "0.18.14" +version = "0.18.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload_time = "2025-06-09T08:51:09.828Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865 } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload_time = "2025-06-09T08:51:06.348Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702 }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, ] [[package]] @@ -2574,14 +2755,14 @@ dependencies = [ { name = "click" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload_time = "2023-07-01T13:31:49.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649 }, ] [[package]] name = "scikit-learn" -version = "1.7.1" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib" }, @@ -2589,124 +2770,134 @@ dependencies = [ { name = "scipy" }, { name = "threadpoolctl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/84/5f4af978fff619706b8961accac84780a6d298d82a8873446f72edb4ead0/scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802", size = 7190445, upload_time = "2025-07-18T08:01:54.5Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/16/57f176585b35ed865f51b04117947fe20f130f78940c6477b6d66279c9c2/scikit_learn-1.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3cee419b49b5bbae8796ecd690f97aa412ef1674410c23fc3257c6b8b85b8087", size = 9260431, upload_time = "2025-07-18T08:01:22.77Z" }, - { url = "https://files.pythonhosted.org/packages/67/4e/899317092f5efcab0e9bc929e3391341cec8fb0e816c4789686770024580/scikit_learn-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2fd8b8d35817b0d9ebf0b576f7d5ffbbabdb55536b0655a8aaae629d7ffd2e1f", size = 8637191, upload_time = "2025-07-18T08:01:24.731Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1b/998312db6d361ded1dd56b457ada371a8d8d77ca2195a7d18fd8a1736f21/scikit_learn-1.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:588410fa19a96a69763202f1d6b7b91d5d7a5d73be36e189bc6396bfb355bd87", size = 9486346, upload_time = "2025-07-18T08:01:26.713Z" }, - { url = "https://files.pythonhosted.org/packages/ad/09/a2aa0b4e644e5c4ede7006748f24e72863ba2ae71897fecfd832afea01b4/scikit_learn-1.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3142f0abe1ad1d1c31a2ae987621e41f6b578144a911ff4ac94781a583adad7", size = 9290988, upload_time = "2025-07-18T08:01:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/15/fa/c61a787e35f05f17fc10523f567677ec4eeee5f95aa4798dbbbcd9625617/scikit_learn-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3ddd9092c1bd469acab337d87930067c87eac6bd544f8d5027430983f1e1ae88", size = 8735568, upload_time = "2025-07-18T08:01:30.936Z" }, - { url = "https://files.pythonhosted.org/packages/52/f8/e0533303f318a0f37b88300d21f79b6ac067188d4824f1047a37214ab718/scikit_learn-1.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae", size = 9213143, upload_time = "2025-07-18T08:01:32.942Z" }, - { url = "https://files.pythonhosted.org/packages/71/f3/f1df377d1bdfc3e3e2adc9c119c238b182293e6740df4cbeac6de2cc3e23/scikit_learn-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10", size = 8591977, upload_time = "2025-07-18T08:01:34.967Z" }, - { url = "https://files.pythonhosted.org/packages/99/72/c86a4cd867816350fe8dee13f30222340b9cd6b96173955819a5561810c5/scikit_learn-1.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309", size = 9436142, upload_time = "2025-07-18T08:01:37.397Z" }, - { url = "https://files.pythonhosted.org/packages/e8/66/277967b29bd297538dc7a6ecfb1a7dce751beabd0d7f7a2233be7a4f7832/scikit_learn-1.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43", size = 9282996, upload_time = "2025-07-18T08:01:39.721Z" }, - { url = "https://files.pythonhosted.org/packages/e2/47/9291cfa1db1dae9880420d1e07dbc7e8dd4a7cdbc42eaba22512e6bde958/scikit_learn-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11", size = 8707418, upload_time = "2025-07-18T08:01:42.124Z" }, - { url = "https://files.pythonhosted.org/packages/61/95/45726819beccdaa34d3362ea9b2ff9f2b5d3b8bf721bd632675870308ceb/scikit_learn-1.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae", size = 9561466, upload_time = "2025-07-18T08:01:44.195Z" }, - { url = "https://files.pythonhosted.org/packages/ee/1c/6f4b3344805de783d20a51eb24d4c9ad4b11a7f75c1801e6ec6d777361fd/scikit_learn-1.7.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c", size = 9040467, upload_time = "2025-07-18T08:01:46.671Z" }, - { url = "https://files.pythonhosted.org/packages/6f/80/abe18fe471af9f1d181904203d62697998b27d9b62124cd281d740ded2f9/scikit_learn-1.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e", size = 9532052, upload_time = "2025-07-18T08:01:48.676Z" }, - { url = "https://files.pythonhosted.org/packages/14/82/b21aa1e0c4cee7e74864d3a5a721ab8fcae5ca55033cb6263dca297ed35b/scikit_learn-1.7.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7", size = 9361575, upload_time = "2025-07-18T08:01:50.639Z" }, - { url = "https://files.pythonhosted.org/packages/f2/20/f4777fcd5627dc6695fa6b92179d0edb7a3ac1b91bcd9a1c7f64fa7ade23/scikit_learn-1.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5", size = 9277310, upload_time = "2025-07-18T08:01:52.547Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818 }, + { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997 }, + { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381 }, + { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296 }, + { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256 }, + { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382 }, + { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042 }, + { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180 }, + { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660 }, + { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057 }, + { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731 }, + { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852 }, + { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094 }, + { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436 }, + { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749 }, + { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906 }, + { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836 }, + { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236 }, + { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593 }, + { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007 }, ] [[package]] name = "scipy" -version = "1.16.1" +version = "1.16.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861, upload_time = "2025-07-27T16:33:30.834Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c", size = 36575194, upload_time = "2025-07-27T16:27:41.321Z" }, - { url = "https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04", size = 28594590, upload_time = "2025-07-27T16:27:49.204Z" }, - { url = "https://files.pythonhosted.org/packages/0e/37/9f65178edfcc629377ce9a64fc09baebea18c80a9e57ae09a52edf84880b/scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919", size = 20866458, upload_time = "2025-07-27T16:27:54.98Z" }, - { url = "https://files.pythonhosted.org/packages/2c/7b/749a66766871ea4cb1d1ea10f27004db63023074c22abed51f22f09770e0/scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921", size = 23539318, upload_time = "2025-07-27T16:28:01.604Z" }, - { url = "https://files.pythonhosted.org/packages/c4/db/8d4afec60eb833a666434d4541a3151eedbf2494ea6d4d468cbe877f00cd/scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725", size = 33292899, upload_time = "2025-07-27T16:28:09.147Z" }, - { url = "https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618", size = 35162637, upload_time = "2025-07-27T16:28:17.535Z" }, - { url = "https://files.pythonhosted.org/packages/b6/49/0648665f9c29fdaca4c679182eb972935b3b4f5ace41d323c32352f29816/scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d", size = 35490507, upload_time = "2025-07-27T16:28:25.705Z" }, - { url = "https://files.pythonhosted.org/packages/62/8f/66cbb9d6bbb18d8c658f774904f42a92078707a7c71e5347e8bf2f52bb89/scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119", size = 37923998, upload_time = "2025-07-27T16:28:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a", size = 38508060, upload_time = "2025-07-27T16:28:43.242Z" }, - { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717, upload_time = "2025-07-27T16:28:51.706Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009, upload_time = "2025-07-27T16:28:57.017Z" }, - { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942, upload_time = "2025-07-27T16:29:01.152Z" }, - { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507, upload_time = "2025-07-27T16:29:05.202Z" }, - { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040, upload_time = "2025-07-27T16:29:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096, upload_time = "2025-07-27T16:29:17.091Z" }, - { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328, upload_time = "2025-07-27T16:29:22.928Z" }, - { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921, upload_time = "2025-07-27T16:29:29.108Z" }, - { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462, upload_time = "2025-07-27T16:30:24.078Z" }, - { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832, upload_time = "2025-07-27T16:29:35.057Z" }, - { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084, upload_time = "2025-07-27T16:29:40.201Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098, upload_time = "2025-07-27T16:29:44.295Z" }, - { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858, upload_time = "2025-07-27T16:29:48.784Z" }, - { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311, upload_time = "2025-07-27T16:29:54.164Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542, upload_time = "2025-07-27T16:30:00.249Z" }, - { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665, upload_time = "2025-07-27T16:30:05.916Z" }, - { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210, upload_time = "2025-07-27T16:30:11.655Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661, upload_time = "2025-07-27T16:30:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/81/ea/84d481a5237ed223bd3d32d6e82d7a6a96e34756492666c260cef16011d1/scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318", size = 36525921, upload_time = "2025-07-27T16:30:30.081Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9f/d9edbdeff9f3a664807ae3aea383e10afaa247e8e6255e6d2aa4515e8863/scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc", size = 28564152, upload_time = "2025-07-27T16:30:35.336Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/8125bcb1fe04bc267d103e76516243e8d5e11229e6b306bda1024a5423d1/scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8", size = 20836028, upload_time = "2025-07-27T16:30:39.421Z" }, - { url = "https://files.pythonhosted.org/packages/77/9c/bf92e215701fc70bbcd3d14d86337cf56a9b912a804b9c776a269524a9e9/scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e", size = 23489666, upload_time = "2025-07-27T16:30:43.663Z" }, - { url = "https://files.pythonhosted.org/packages/5e/00/5e941d397d9adac41b02839011594620d54d99488d1be5be755c00cde9ee/scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0", size = 33358318, upload_time = "2025-07-27T16:30:48.982Z" }, - { url = "https://files.pythonhosted.org/packages/0e/87/8db3aa10dde6e3e8e7eb0133f24baa011377d543f5b19c71469cf2648026/scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b", size = 35185724, upload_time = "2025-07-27T16:30:54.26Z" }, - { url = "https://files.pythonhosted.org/packages/89/b4/6ab9ae443216807622bcff02690262d8184078ea467efee2f8c93288a3b1/scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731", size = 35554335, upload_time = "2025-07-27T16:30:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/9c/9a/d0e9dc03c5269a1afb60661118296a32ed5d2c24298af61b676c11e05e56/scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3", size = 37960310, upload_time = "2025-07-27T16:31:06.151Z" }, - { url = "https://files.pythonhosted.org/packages/5e/00/c8f3130a50521a7977874817ca89e0599b1b4ee8e938bad8ae798a0e1f0d/scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19", size = 39319239, upload_time = "2025-07-27T16:31:59.942Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f2/1ca3eda54c3a7e4c92f6acef7db7b3a057deb135540d23aa6343ef8ad333/scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65", size = 36939460, upload_time = "2025-07-27T16:31:11.865Z" }, - { url = "https://files.pythonhosted.org/packages/80/30/98c2840b293a132400c0940bb9e140171dcb8189588619048f42b2ce7b4f/scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2", size = 29093322, upload_time = "2025-07-27T16:31:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e6/1e6e006e850622cf2a039b62d1a6ddc4497d4851e58b68008526f04a9a00/scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d", size = 21365329, upload_time = "2025-07-27T16:31:21.188Z" }, - { url = "https://files.pythonhosted.org/packages/8e/02/72a5aa5b820589dda9a25e329ca752842bfbbaf635e36bc7065a9b42216e/scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695", size = 23897544, upload_time = "2025-07-27T16:31:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/2b/dc/7122d806a6f9eb8a33532982234bed91f90272e990f414f2830cfe656e0b/scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86", size = 33442112, upload_time = "2025-07-27T16:31:30.62Z" }, - { url = "https://files.pythonhosted.org/packages/24/39/e383af23564daa1021a5b3afbe0d8d6a68ec639b943661841f44ac92de85/scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff", size = 35286594, upload_time = "2025-07-27T16:31:36.112Z" }, - { url = "https://files.pythonhosted.org/packages/95/47/1a0b0aff40c3056d955f38b0df5d178350c3d74734ec54f9c68d23910be5/scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4", size = 35665080, upload_time = "2025-07-27T16:31:42.025Z" }, - { url = "https://files.pythonhosted.org/packages/64/df/ce88803e9ed6e27fe9b9abefa157cf2c80e4fa527cf17ee14be41f790ad4/scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3", size = 38050306, upload_time = "2025-07-27T16:31:48.109Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6c/a76329897a7cae4937d403e623aa6aaea616a0bb5b36588f0b9d1c9a3739/scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998", size = 39427705, upload_time = "2025-07-27T16:31:53.96Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259 }, + { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976 }, + { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905 }, + { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066 }, + { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407 }, + { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281 }, + { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222 }, + { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586 }, + { url = "https://files.pythonhosted.org/packages/34/95/20e02ca66fb495a95fba0642fd48e0c390d0ece9b9b14c6e931a60a12dea/scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e", size = 38550641 }, + { url = "https://files.pythonhosted.org/packages/92/ad/13646b9beb0a95528ca46d52b7babafbe115017814a611f2065ee4e61d20/scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851", size = 25456070 }, + { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856 }, + { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626 }, + { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689 }, + { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151 }, + { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824 }, + { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881 }, + { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219 }, + { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147 }, + { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766 }, + { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169 }, + { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682 }, + { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926 }, + { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152 }, + { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410 }, + { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880 }, + { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425 }, + { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622 }, + { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985 }, + { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367 }, + { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992 }, + { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109 }, + { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110 }, + { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110 }, + { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014 }, + { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155 }, + { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174 }, + { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752 }, + { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010 }, + { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061 }, + { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914 }, + { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193 }, + { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172 }, + { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326 }, + { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036 }, + { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341 }, + { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840 }, + { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716 }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088 }, + { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455 }, + { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374 }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, ] [[package]] name = "simpleeval" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762 }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +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, upload_time = "2024-12-04T17:35:26.475Z" }, + { 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 = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, ] [[package]] name = "soupsieve" -version = "2.7" +version = "2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679 }, ] [[package]] @@ -2718,18 +2909,18 @@ dependencies = [ { name = "executing" }, { name = "pure-eval" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } +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, upload_time = "2023-09-30T13:58:03.53Z" }, + { 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 = "structlog" version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720 }, ] [[package]] @@ -2741,18 +2932,18 @@ dependencies = [ { name = "pyyaml" }, { name = "xlsxwriter" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860 }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, ] [[package]] @@ -2768,6 +2959,7 @@ dependencies = [ { name = "pydeflate" }, { name = "requests" }, { name = "savepagenow" }, + { name = "scipy" }, ] [package.dev-dependencies] @@ -2814,6 +3006,7 @@ requires-dist = [ { name = "pydeflate", specifier = ">=2.1.3" }, { name = "requests", specifier = ">=2.32.3" }, { name = "savepagenow", specifier = ">=1.3.0" }, + { name = "scipy", specifier = ">=1.16.1" }, ] [package.metadata.requires-dev] @@ -2853,27 +3046,27 @@ docs = [ name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, ] [[package]] name = "threadpoolctl" version = "3.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload_time = "2025-03-13T13:49:23.031Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload_time = "2025-03-13T13:49:21.846Z" }, + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, ] [[package]] @@ -2883,37 +3076,37 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload_time = "2024-10-24T14:58:29.895Z" } +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, upload_time = "2024-10-24T14:58:28.029Z" }, + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, ] [[package]] name = "tomlkit" version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload_time = "2025-06-05T07:13:44.947Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload_time = "2025-06-05T07:13:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, ] [[package]] name = "tornado" -version = "6.5.1" +version = "6.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload_time = "2025-05-22T18:15:38.788Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload_time = "2025-05-22T18:15:20.862Z" }, - { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload_time = "2025-05-22T18:15:22.591Z" }, - { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload_time = "2025-05-22T18:15:24.027Z" }, - { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload_time = "2025-05-22T18:15:25.735Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload_time = "2025-05-22T18:15:27.499Z" }, - { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload_time = "2025-05-22T18:15:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload_time = "2025-05-22T18:15:31.038Z" }, - { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload_time = "2025-05-22T18:15:32.426Z" }, - { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload_time = "2025-05-22T18:15:34.205Z" }, - { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload_time = "2025-05-22T18:15:36.1Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload_time = "2025-05-22T18:15:37.433Z" }, + { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563 }, + { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729 }, + { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295 }, + { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644 }, + { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878 }, + { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549 }, + { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973 }, + { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954 }, + { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023 }, + { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427 }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456 }, ] [[package]] @@ -2923,18 +3116,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } +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, upload_time = "2024-04-19T11:11:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, ] [[package]] @@ -2950,14 +3143,14 @@ dependencies = [ { name = "scikit-learn" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/67/c69f8c46fd46e01480ca10280ab612253255a729a850e2d61fdf0ea08258/tsam-2.3.9.tar.gz", hash = "sha256:1f219eef05788d199af1ff61bd5a3d9217a26f9279988b1ef4b7d5af2757ed15", size = 223755, upload_time = "2025-06-16T07:30:03.015Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/67/c69f8c46fd46e01480ca10280ab612253255a729a850e2d61fdf0ea08258/tsam-2.3.9.tar.gz", hash = "sha256:1f219eef05788d199af1ff61bd5a3d9217a26f9279988b1ef4b7d5af2757ed15", size = 223755 } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/e7/5c072b990bddccc4a78a186d641e50257993c50658cddc0d4bf300acd1e1/tsam-2.3.9-py3-none-any.whl", hash = "sha256:edcc4febb9e1dacc028bc819d710974ede8f563467c3d235a250f46416f93a1b", size = 36816, upload_time = "2025-06-16T07:30:01.562Z" }, + { url = "https://files.pythonhosted.org/packages/44/e7/5c072b990bddccc4a78a186d641e50257993c50658cddc0d4bf300acd1e1/tsam-2.3.9-py3-none-any.whl", hash = "sha256:edcc4febb9e1dacc028bc819d710974ede8f563467c3d235a250f46416f93a1b", size = 36816 }, ] [[package]] name = "typer" -version = "0.16.0" +version = "0.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2965,18 +3158,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload_time = "2025-05-26T14:30:31.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/ea/9cc57c3c627fd7a6a0907ea371019fe74c3ec00e3cf209a6864140a602ad/typer-0.19.1.tar.gz", hash = "sha256:cb881433a4b15dacc875bb0583d1a61e78497806741f9aba792abcab390c03e6", size = 104802 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload_time = "2025-05-26T14:30:30.523Z" }, + { url = "https://files.pythonhosted.org/packages/1e/fa/6473c00b5eb26a2ba427813107699d3e6f4e1a4afad3f7494b17bdef3422/typer-0.19.1-py3-none-any.whl", hash = "sha256:914b2b39a1da4bafca5f30637ca26fa622a5bf9f515e5fdc772439f306d5682a", size = 46876 }, ] [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload_time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, ] [[package]] @@ -2986,83 +3179,83 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] [[package]] name = "unidecode" version = "1.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837 }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, ] [[package]] name = "validators" version = "0.35.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712 }, ] [[package]] name = "virtualenv" -version = "20.31.2" +version = "20.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316, upload_time = "2025-05-08T17:58:23.811Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982, upload_time = "2025-05-08T17:58:21.15Z" }, + { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279 }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] [[package]] @@ -3074,88 +3267,88 @@ dependencies = [ { name = "requests" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385 }, ] [[package]] name = "wcwidth" version = "0.2.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } +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, upload_time = "2024-01-06T02:10:55.763Z" }, + { 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 = "webencodings" version = "0.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload_time = "2017-04-05T20:21:34.189Z" } +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, upload_time = "2017-04-05T20:21:32.581Z" }, + { 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 = "wheel" version = "0.45.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494 }, ] [[package]] name = "win32-setctime" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, ] [[package]] name = "xlrd" version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555 }, ] [[package]] name = "xlrd3" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268 }, ] [[package]] name = "xlsx2csv" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904 }, ] [[package]] name = "xlsxwriter" -version = "3.2.5" +version = "3.2.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/47/7704bac42ac6fe1710ae099b70e6a1e68ed173ef14792b647808c357da43/xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe", size = 213306, upload_time = "2025-06-17T08:59:14.619Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/2c/c06ef49dc36e7954e55b802a8b231770d286a9758b3d936bd1e04ce5ba88/xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c", size = 215940 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/34/a22e6664211f0c8879521328000bdcae9bf6dbafa94a923e531f6d5b3f73/xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", size = 172347, upload_time = "2025-06-17T08:59:13.453Z" }, + { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315 }, ] [[package]] name = "xlwt" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929 } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981 }, ] From 7f9bdea809396df317df863278629245c18071f9 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:07:39 +0100 Subject: [PATCH 26/81] Docs readme (#75) * Add simple README * Add LICENSE for GitHub * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * doc: changes to README.md --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Fabrizio Finozzi --- LICENSE | 18 ++++++++ README.md | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d817195d --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..8e306d96 --- /dev/null +++ b/README.md @@ -0,0 +1,124 @@ +# technologydata + + + + + +A Python package to manage techno-economic assumptions for energy system models. + +## Overview + +`technologydata` is a Python package that supports the management of techno-economic assumptions for energy system models. +It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, +including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. + +In the future it will include pre-parsed data from common public data sources such NREL's ATB or DEA's Technology Catalogue. +For these datasources it will also include parsers that can be modified to extract data in a custom way. + +The goal of this package is to make energy system modelling easier and more efficient, +automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. + +## Table of Contents + +1. [Background](#background) +2. [Install](#install) +3. [Usage](#usage) +4. [Maintainers](#maintainers) +5. [Thanks](#thanks) +6. [Contributing](#contributing) +7. [License](#license) + +## Background + +> Modelling is 10% science, 10% art, and 80% finding the right data and getting it into the right format. +> β€” Every energy modeller ever + +Modelling energy systems requires a lot of data. +Techno-economic data, i.e. data about the costs for building operating technologies and their technical +characteristics, is a key input to many energy system models today. + +Techno-economic data is usually collected from a variety of scattered sources and then manually processed +into the format required by a specific model. +This is repeated for every new modelling project, leading to a lot of duplicated effort. +The manual processing also carries a high risk of errors, which can lead to misleading results. + +When projects are finished, the processed data is often discarded, leading to a loss of valuable information. +In better cases, the processed data is also published along with the model results, but usually in a +non-standardised and non-machine-readable format and without information about the data provenance and processing steps. + +It sounds abstract, but if someone used cost assumptions for the US in 2015 USD, then there are many wrong ways +and a few right ways to convert these to e.g. EUR and adjust it for inflation to 2023. + +## Install + +The package is currently under development and not yet published to `PyPI` or `conda-forge`. + +To install the package locally from GitHub, first clone the package and then use `uv` to install it in editable mode: + +```bash +git clone https://github.com/open-energy-transition/technology-data/tree/prototype-2 +cd technology-data +git checkout prototype-2 +uv sync --group dev --group docs +``` + +## Usage + +Detailed usage instructions and examples can be found in the [documentation](https://technology-data--240.org.readthedocs.build/en/240/). + +To create a `Technology` object with some parameters and then adjust for inflation and convert to a different currency, you can use the following code: + +```python +from technologydata import Technology, Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Utility-scale PV", + region="USA", + year=2020, + parameters={ + "capital_cost": Parameter(value=600, unit="USD_2020/kW"), + "efficiency": Parameter(value=15, unit="percent"), + } +) + +tech = tech.to_currency("EUR_2023") +``` + +## Maintainers + +This repository is currently maintained by [Open Energy Transition](https://openenergytransition.org/) with the maintainers and developers being: + +- [euronion](https://github.com/euronion) +- [finozzifa](https://github.com/finozzifa) + +## Thanks + +Development of this prototype package would not have been possible without the funding from [Breakthrough Energy](https://www.breakthroughenergy.org/). + +## Contributing + +For contributing instructions, guidelines and our code of conduct, please refer to the [contributing section](https://technology-data--240.org.readthedocs.build/en/240/contributing/instructions/) in the documentation. + +## License + +This project is licensed under the [MIT License](LICENSES/MIT.txt). + +Primary data included in the repository may be licensed under specific terms. +Processed data included in the project is licensed under [Creative Commons Attribution 4.0 International (CC BY 4.0)](LICENSES/CC-BY-4.0.txt). + +To make it easier to identify which data is licensed under which terms, this repository follows the [REUSE](https://reuse.software/) specification. +This means you can find the license information for each file either located in its header or in [REUSE.toml](REUSE.toml). From 06d3f5f2105b5178954f4e23a62e71f46525e64e Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:51:16 +0100 Subject: [PATCH 27/81] code: skip three more unit tests (#76) --- test/test_source.py | 1 + test/test_source_collection.py | 1 + 2 files changed, 2 insertions(+) diff --git a/test/test_source.py b/test/test_source.py index 05985510..92fa313b 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -196,6 +196,7 @@ def test_ensure_in_wayback(self, example_source: technologydata.Source) -> None: assert example_source.url_date_archive is not None assert example_source.url_archive is not None + @pytest.mark.webarchive # type: ignore @pytest.mark.parametrize( "url_archived, source_path, source_title, expected_path", [ diff --git a/test/test_source_collection.py b/test/test_source_collection.py index f8503959..75c77cfb 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -81,6 +81,7 @@ def test_example_source_collection( assert example_source_collection.sources[0].authors == "Author 1" assert example_source_collection.sources[1].authors == "Author 2" + @pytest.mark.webarchive # type: ignore @pytest.mark.parametrize( "example_source_collection", [ From 6234d83bda54220507aa1a2f7e81e7b4e3ddd3e9 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:08:35 +0100 Subject: [PATCH 28/81] Make output schema of `SourceCollection` and `TechnologyCollection` optional (#77) * code: make output schema optional * test new pydeflate version * code: re-vert back to older version of pydeflate * re-vert uvlock --- src/technologydata/source_collection.py | 23 ++++-- src/technologydata/technology_collection.py | 23 ++++-- test/test_source_collection.py | 81 +++++++++++++++------ test/test_technology_collection.py | 17 ++++- 4 files changed, 101 insertions(+), 43 deletions(-) diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index f4beb955..4e14d4f2 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -177,7 +177,10 @@ def to_csv(self, **kwargs: pathlib.Path | str | bool) -> None: output_dataframe.to_csv(**merged_kwargs) def to_json( - self, file_path: pathlib.Path, schema_path: pathlib.Path | None = None + self, + file_path: pathlib.Path, + schema_path: pathlib.Path | None = None, + output_schema: bool = False, ) -> None: """ Export the SourceCollection to a JSON file, together with a data schema. @@ -188,17 +191,21 @@ def to_json( The path to the JSON file to be created. schema_path : pathlib.Path The path to the JSON schema file to be created. By default, created with a `schema` suffix next to `file_path`. + output_schema : bool, default False + If True, generates a JSON schema file describing the data structure. + The schema will include field descriptions and type information. """ - if schema_path is None: - schema_path = file_path.with_suffix(".schema.json") + if output_schema: + if schema_path is None: + schema_path = file_path.with_suffix(".schema.json") - # Export the model's schema with descriptions to a dict - schema = self.model_json_schema() + # Export the model's schema with descriptions to a dict + schema = self.model_json_schema() - # Save the schema (which includes descriptions) to a JSON file - with open(schema_path, "w") as f: - json.dump(schema, f, indent=4) + # Save the schema (which includes descriptions) to a JSON file + with open(schema_path, "w") as f: + json.dump(schema, f, indent=4) with open(file_path, mode="w", encoding="utf-8") as jsonfile: json_data = self.model_dump_json(indent=4) # Convert to JSON string diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index 00b88005..5e7a56ab 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -178,7 +178,10 @@ def to_csv(self, **kwargs: pathlib.Path | str | bool) -> None: output_dataframe.to_csv(**merged_kwargs) def to_json( - self, file_path: pathlib.Path, schema_path: pathlib.Path | None = None + self, + file_path: pathlib.Path, + schema_path: pathlib.Path | None = None, + output_schema: bool = False, ) -> None: """ Export the TechnologyCollection to a JSON file, together with a data schema. @@ -189,17 +192,21 @@ def to_json( The path to the JSON file to be created. schema_path : pathlib.Path The path to the JSON schema file to be created. By default, created with a `schema` suffix next to `file_path`. + output_schema : bool, default False + If True, generates a JSON schema file describing the data structure. + The schema will include field descriptions and type information. """ - if schema_path is None: - schema_path = file_path.with_suffix(".schema.json") + if output_schema: + if schema_path is None: + schema_path = file_path.with_suffix(".schema.json") - # Export the model's schema with descriptions to a dict - schema = self.model_json_schema() + # Export the model's schema with descriptions to a dict + schema = self.model_json_schema() - # Save the schema (which includes descriptions) to a JSON file - with open(schema_path, "w") as f: - json.dump(schema, f, indent=4) + # Save the schema (which includes descriptions) to a JSON file + with open(schema_path, "w") as f: + json.dump(schema, f, indent=4) with open(file_path, mode="w", encoding="utf-8") as jsonfile: json_data = self.model_dump_json(indent=4) # Convert to JSON string diff --git a/test/test_source_collection.py b/test/test_source_collection.py index 75c77cfb..7ec6e7f9 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -164,39 +164,74 @@ def test_to_csv( assert output_file.is_file() output_file.unlink(missing_ok=True) + # python @pytest.mark.parametrize( - "example_source_collection", + "example_source_collection, output_schema", [ - [ - { - "source_title": "atb_nrel", - "source_authors": "NREL/ATB", - "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", - "source_url_date": "2025-05-22 15:08:02", - "source_url_date_archive": "2025-05-22 15:08:02", - }, - { - "source_title": "tech_data_generation", - "source_authors": "Danish Energy Agency", - "source_url": "https://ens.dk/media/3273/download", - "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", - "source_url_date": "2025-05-06 16:02:04", - "source_url_date_archive": "2025-05-06 16:02:04", - }, - ], + ( + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + True, + ), + ( + [ + { + "source_title": "atb_nrel", + "source_authors": "NREL/ATB", + "source_url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", + "source_url_date": "2025-05-22 15:08:02", + "source_url_date_archive": "2025-05-22 15:08:02", + }, + { + "source_title": "tech_data_generation", + "source_authors": "Danish Energy Agency", + "source_url": "https://ens.dk/media/3273/download", + "source_url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", + "source_url_date": "2025-05-06 16:02:04", + "source_url_date_archive": "2025-05-06 16:02:04", + }, + ], + False, + ), ], indirect=["example_source_collection"], ) # type: ignore def test_to_json( - self, example_source_collection: technologydata.SourceCollection + self, + example_source_collection: technologydata.SourceCollection, + output_schema: bool, ) -> None: """Check if the example source collection is exported to JSON.""" output_file = pathlib.Path(path_cwd, "sources.json") schema_file = pathlib.Path(path_cwd, "sources.schema.json") - example_source_collection.to_json(pathlib.Path(output_file)) + + example_source_collection.to_json( + pathlib.Path(output_file), output_schema=output_schema + ) + assert output_file.is_file() - assert schema_file.is_file() + if output_schema: + assert schema_file.is_file() + else: + assert not schema_file.is_file() + output_file.unlink(missing_ok=True) schema_file.unlink(missing_ok=True) @@ -258,7 +293,7 @@ def test_from_json_to_json(self) -> None: source_collection = technologydata.SourceCollection.from_json(input_file) output_file = pathlib.Path("to_json_test.json") schema_file = pathlib.Path(path_cwd, "to_json_test.schema.json") - source_collection.to_json(output_file) + source_collection.to_json(output_file, output_schema=True) # Read files and strip trailing whitespace/newlines before comparing with open(input_file) as f1, open(output_file) as f2: assert f1.read().rstrip() == f2.read().rstrip(), "Files are not identical" diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index 57b0f609..84560d50 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -48,7 +48,11 @@ def test_to_dataframe(self) -> None: ) assert isinstance(technology_collection.to_dataframe(), pandas.DataFrame) - def test_to_json(self) -> None: + @pytest.mark.parametrize( + "output_schema", + [True, False], + ) # type: ignore + def test_to_json(self, output_schema: bool) -> None: """Check if to_json works as expected.""" input_file = pathlib.Path( path_cwd, @@ -62,9 +66,14 @@ def test_to_json(self) -> None: ) output_file = pathlib.Path(path_cwd, "technologies.json") schema_file = pathlib.Path(path_cwd, "technologies.schema.json") - technology_collection.to_json(pathlib.Path(output_file)) + technology_collection.to_json( + pathlib.Path(output_file), output_schema=output_schema + ) assert output_file.is_file() - assert schema_file.is_file() + if output_schema: + assert schema_file.is_file() + else: + assert not schema_file.is_file() output_file.unlink(missing_ok=True) schema_file.unlink(missing_ok=True) @@ -97,7 +106,7 @@ def test_from_json_to_json(self) -> None: ) output_file = pathlib.Path("to_json_test.json") schema_file = pathlib.Path(path_cwd, "to_json_test.schema.json") - technology_collection.to_json(output_file) + technology_collection.to_json(output_file, output_schema=True) # Read files and strip trailing whitespace/newlines before comparing with open(input_file) as f1, open(output_file) as f2: From 471b617c87aa2c53b72b19333d929f8ed4f7cd20 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:25:36 +0100 Subject: [PATCH 29/81] Prototest DEA (#57) * code: add dea energy storage parser * code: add clean_parameter_string * add pre-commit checks * code: proceeding with the code * code: new stage of parser * add format_val_number * pre-commit update * code: update unit tests * code: correct small typo * code: update filtering * code: remove unnecessary print statements * code: add calamine * code: remove inplace * code: add explaination on column name - attributes * code: update ws column * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: update unit-par * code: update dea_energy_storage * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * pre-commit * code: correct units * code: re-order code * code: update parser * code: update the storage * code: update notes and code * code: express output_path * code: add argparse to dea_energy_storage.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * pre-commit check * code: added logger.info * code: update pct unit * code: add pydantic validator and filter on parameters * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: update code * code: ruff changes * code: update code with parameters re-set * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * json file: pre-commit * Update REUSE.toml Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/package_data/dea_energy_storage/sources.json Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/package_data/dea_energy_storage/sources.json Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: update tests * code: update * doc: modify license owner for raw data * code: move method to commons * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: updates * code: entered capacity parameter * code: update unit test * code: remove unit test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: re-add unit test and re-flag it as webarchive * remove unnecesary files * code: update test_dea_energy_storage --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- REUSE.toml | 14 + .../dea_energy_storage/dea_energy_storage.py | 691 + .../dea_energy_storage/sources.json | 12 + .../dea_energy_storage/technologies.json | 17508 ++++++++++++++++ ...chnology_datasheet_for_energy_storage.xlsx | Bin 0 -> 329612 bytes src/technologydata/technology.py | 3 - src/technologydata/utils/commons.py | 41 + test/test_commons.py | 17 + test/test_dea_energy_storage.py | 230 + 9 files changed, 18513 insertions(+), 3 deletions(-) create mode 100644 src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py create mode 100644 src/technologydata/package_data/dea_energy_storage/sources.json create mode 100644 src/technologydata/package_data/dea_energy_storage/technologies.json create mode 100644 src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx create mode 100644 test/test_dea_energy_storage.py diff --git a/REUSE.toml b/REUSE.toml index 4633211e..7fb6048e 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -13,3 +13,17 @@ SPDX-License-Identifier = "MIT" path = ["test/test_data/**",] SPDX-FileCopyrightText = "The technology-data authors" SPDX-License-Identifier = "CC-BY-4.0" + +[[annotations]] +path = [ + "src/technologydata/package_data/dea_energy_storage/*.json", "src/technologydata/package_data/schemas/*.json" +] +SPDX-FileCopyrightText = "The technology-data authors" +SPDX-License-Identifier = "CC-BY-4.0" + +[[annotations]] +path = [ + "src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx" +] +SPDX-FileCopyrightText = "The Danish Energy Agency" +SPDX-License-Identifier = "CC-BY-4.0" diff --git a/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py b/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py new file mode 100644 index 00000000..da178dc8 --- /dev/null +++ b/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py @@ -0,0 +1,691 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +""" +Data parser for the DEA energy storage data set. + +How to run: + From the repository root, execute: + python src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py + +Configuration options (command-line arguments): + --num_digits Number of significant digits to round the values. Default: 4 + --store_source Store the source object on the Wayback Machine. Default: False + --filter_params Filter the parameters stored to technologies.json. Default: False + +Example: + python src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py --num_digits 3 --store_source --filter_params + +""" + +import argparse +import logging +import pathlib +import re +import typing + +import pandas as pd +import pydantic + +from technologydata import ( + Commons, + Parameter, + Source, + SourceCollection, + Technology, + TechnologyCollection, +) + +path_cwd = pathlib.Path.cwd() + +logger = logging.getLogger(__name__) + + +def drop_invalid_rows(dataframe: pd.DataFrame) -> pd.DataFrame: + """ + Clean and filter a DataFrame by removing rows with invalid or incomplete data. + + This function performs multiple validation checks to ensure data quality: + - Removes rows with None or NaN values in critical columns + - Removes rows with empty or whitespace-only strings + - Filters rows based on specific data integrity criteria + - Discards rows where 'val' column contains comparator symbols or non-numeric values + + Parameters + ---------- + dataframe : pd.DataFrame + The input DataFrame to be cleaned and validated. + + Returns + ------- + pd.DataFrame + A new DataFrame with invalid rows removed, maintaining data integrity. + + Notes + ----- + Validation criteria include: + - Non-empty 'Technology', 'par', and 'val' columns + - 'year' column containing a valid 4-digit year + - 'val' column containing only numeric values (no comparator symbols) + + """ + # Create a copy to avoid modifying the original DataFrame + df_cleaned = dataframe.copy() + + # Validate column existence + required_columns = ["Technology", "par", "val", "year"] + missing_columns = [col for col in required_columns if col not in df_cleaned.columns] + if missing_columns: + raise ValueError(f"Missing required columns: {missing_columns}") + + # Remove rows with None or NaN values in critical columns + df_cleaned = df_cleaned.dropna(subset=required_columns) + + # Remove rows with empty or whitespace-only strings + for column in required_columns: + df_cleaned = df_cleaned[df_cleaned[column].astype(str).str.strip() != ""] + + # Filter rows with valid year (4 consecutive digits) + df_cleaned = df_cleaned[ + df_cleaned["year"].astype(str).str.contains(r"\d{4}", regex=True) + ] + + # Remove rows with comparator symbols or without digits in 'val' column + df_cleaned = df_cleaned[ + (~df_cleaned["val"].astype(str).str.contains(r"[<>≀β‰₯]", regex=True)) + & (df_cleaned["val"].astype(str).str.contains(r"\d", regex=True)) + ] + + return df_cleaned + + +@pydantic.validate_call +def clean_parameter_string(text_string: str) -> str: + """ + Remove any string between [] or [), any leading hyphen or double quotes from the input string. Lower-case all. + + Parameters + ---------- + text_string : str + input string to be cleaned. + + Returns + ------- + str + cleaned string with [] and [) and leading hyphen or double quotes removed. + + Examples + -------- + >>> clean_parameter_string("- Charge efficiency [%]") + charge efficiency + >>> clean_parameter_string("Energy storage capacity for one unit [MWh)") + energy storage capacity for one unit + + """ + # Remove leading hyphen + text_string = text_string.lstrip("-") + + # Remove content inside square brackets including the brackets themselves + result = re.sub(r"\[.*?\]", "", text_string) + + # Remove content inside square bracket and parenthesis including the brackets/parenthesis themselves + result = re.sub(r"\[.*?\)", "", result) + + # Remove extra spaces resulting from the removal and set all to lower case + result = re.sub(r"\s+", " ", result).strip().casefold() + + return result + + +@pydantic.validate_call +def clean_technology_string(tech_str: str) -> str: + """ + Clean a technology string by removing numeric patterns and standardizing case. + + This function pre-processes technology-related strings by: + - Removing three-digit numeric patterns (with optional letter) + - Stripping leading and trailing whitespace + - Converting to lowercase for case-insensitive comparison + + Parameters + ---------- + tech_str : str + Input technology string to be cleaned. + + Returns + ------- + str + Cleaned technology string with: + - Numeric patterns (like '123' or '456a') removed + - Whitespace stripped + - Converted to lowercase + + Raises + ------ + Exception + If string conversion or processing fails, logs the error and returns the original input. + + Examples + -------- + >>> clean_technology_string("143a Rock-based Carnot battery") + rock-based carnot battery + >>> clean_technology_string("Pit Thermal Energy Storage [PTES]") + pit thermal energy storage [ptes] + + """ + try: + # Remove three-digit patterns or three digits followed by a letter + return re.sub(r"^(\d{3}[a-zA-Z]?)", "", tech_str.strip()).strip().casefold() + except Exception as e: + logger.error(f"Error cleaning technology '{tech_str}': {e}") + return tech_str + + +@pydantic.validate_call +def format_val_number(input_value: str, num_decimals: int) -> float | None | typing.Any: + """ + Parse various number formats into a float value. + + Parameters + ---------- + input_value : str + The input number in different formats, such as: + - Scientific notation with "x10^": e.g., "2.84x10^23" + - Numbers with commas as decimal separators: e.g., "1,1" + num_decimals : int + Number of decimals + + Returns + ------- + float + The parsed numerical value as a float. + + Raises + ------ + ValueError + If the input cannot be parsed into a float. + + Examples + -------- + >>> format_val_number("1,1") + 1.1 + >>> format_val_numer("2.84Γ—10-27") + 2.84e-27 + + """ + s = str(input_value).strip() + + # Handle scientific notation like "2.84x10^23" + match = re.match(r"([+-]?\d*\.?\d+)Γ—10([+-]?\d+)", s) + if match: + base, exponent = match.groups() + return round(float(base), num_decimals) * (10 ** int(exponent)) + + # Replace comma with dot for decimal numbers + s = s.replace(",", ".") + try: + return round(float(s), num_decimals) + except ValueError: + raise ValueError(f"Cannot parse number from input: {input_value}") + + +@pydantic.validate_call +def extract_year(year_str: str) -> int | None: + """ + Extract the first year (integer) from a given input. + + Parameters + ---------- + year_str : str + Input value containing a potential year. + + Returns + ------- + int, None + Extracted first year. + + Examples + -------- + >>> extract_year('uncertainty (2050)') + 2050 + + """ + # Extract digits + digits = re.findall(r"\d+", year_str) + + # Convert to integer + return int(digits[0]) if digits else None + + +@pydantic.validate_call +def clean_est_string(est_str: str) -> str: + """ + Casefold the 'est' string, trim whitespace and replace `ctrl` with `control`. + + Parameters + ---------- + est_str : str + The input 'est' string to be cleaned. + + Returns + ------- + str + The cleaned 'est' string. + + Examples + -------- + >>> clean_est_string("Lower") + lower + >>> clean_est_string("ctrl") + control + + """ + if est_str == "ctrl": + cleaned_str = "control" + else: + cleaned_str = est_str.casefold().strip() + return cleaned_str + + +def standardize_units(series: pd.Series) -> pd.Series: + """ + Complete missing units based on parameter names and replace incorrect units. + + Parameters + ---------- + series : pandas.Series + A series containing two elements: [par, unit] + + Returns + ------- + pandas.Series + Updated series with completed and corrected unit. + + Notes + ----- + The following substitutions are driven by the `pint` documentation available + at https://github.com/hgrecco/pint/blob/master/pint/default_en.txt: + - "pct.": "percent", + - "m2": "meter**2", + - "m3": "meter**3", + + """ + par, unit = series + + # Mapping of parameters to their default units + param_unit_map = { + "energy storage capacity for one unit": "MWh", + "typical temperature difference in storage": "K", + "fixed o&m": "pct./year", + "lifetime in total number of cycles": "cycles", + "cycle life": "cycles", + } + + # Mapping of incorrect units to correct units + unit_corrections = { + "pct./period": "percent", + "⁰C": "C", + "Β°C": "C", + "pct./30sec": "pct.", + "m2": "meter**2", + "m3": "meter**3", + "MWhoutput": "MWh", + "hot/cold,K": "K", + "pct.investement": "percent", + "pct.investment": "percent", + "tank/": "", + "pct.": "percent", + } + + # Complete missing or empty units + if (not isinstance(unit, str)) or (unit.strip() == ""): + unit = param_unit_map.get(par, unit) + + # Replace wrong units + for incorrect, correct in unit_corrections.items(): + if incorrect == unit or incorrect in unit: + unit = unit.replace(incorrect, correct) + + return pd.Series([par, unit]) + + +def filter_parameters(dataframe: pd.DataFrame, filter_flag: bool) -> pd.DataFrame: + """ + Filter rows of a DataFrame by allowed technology parameters. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing at least a "Technology" column. + filter_flag : Boolean + If true, filter parameter `par` column + + Returns + ------- + pandas.DataFrame + The filtered DataFrame. The returned + DataFrame contains only rows where the `par` column is one of: + "technical lifetime", "fixed o&m", "specific investment", or + "variable o&m". + + """ + allowed_set = { + "technical lifetime", + "fixed o&m", + "specific investment", + "variable o&m", + "charge efficiency", + "discharge efficiency", + "capacity", + } + print("filter_flag", filter_flag) + if filter_flag: + # Filter the DataFrame based on the allowed set + df_filtered = dataframe[dataframe["par"].isin(allowed_set)].reset_index( + drop=True + ) + logger.info( + f"technologies.json contains a subset of the allowed parameters: {allowed_set}." + ) + else: + # Return the original DataFrame if filter_flag is False + df_filtered = dataframe + logger.info("All parameters are outputted to technologies.json") + return df_filtered + + +def build_technology_collection( + dataframe: pd.DataFrame, + sources_path: pathlib.Path, + store_source: bool = False, + output_schema: bool = False, +) -> TechnologyCollection: + """ + Compute a collection of technologies from a grouped DataFrame. + + Processes input DataFrame by grouping technologies and extracting their parameters, + creating Technology instances for each unique group. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing technology parameters. + Expected columns include: + - 'est': Estimation or case identifier + - 'year': Year of the technology + - 'ws': Workspace or technology identifier + - 'Technology': Detailed technology name + - 'par': Parameter name + - 'val': Parameter value + - 'unit': Parameter units + sources_path: pathlib.Path + Output path for storing the SourceCollection object + store_source: Optional[bool] + Flag to decide whether to store the source object on the Wayback Machine. Default False. + output_schema : Optional[bool] + Flag to decide whether to export the source collection schema. Default False. + + Returns + ------- + TechnologyCollection + A collection of Technology instances, each representing a unique + technology group with its associated parameters. + + Notes + ----- + - The function groups the DataFrame by 'est', 'year', 'ws', and 'Technology' + - For each group, it creates a dictionary of Parameters + - Each Technology is instantiated with group-specific attributes + + """ + list_techs = [] + + if store_source: + source = Source( + title="Technology Data for Energy storage (May 2025)", + authors="Danish Energy Agency", + url="https://ens.dk/media/6589/download", + url_date="2025-10-08 09:24:00", + ) + source.ensure_in_wayback() + sources = SourceCollection(sources=[source]) + sources.to_json(sources_path, output_schema=output_schema) + else: + sources = SourceCollection.from_json(sources_path) + + for (est, year, ws, technology_name), group in dataframe.groupby( + ["est", "year", "ws", "Technology"] + ): + parameters = {} + for _, row in group.iterrows(): + parameters[row["par"]] = Parameter( + magnitude=row["val"], + units=row["unit"], + sources=sources, + provenance="Parsed from Excel file", + ) + list_techs.append( + Technology( + name=ws, + region="EU", + year=year, + parameters=parameters, + case=est, + detailed_technology=technology_name, + ) + ) + return TechnologyCollection(technologies=list_techs) + + +@pydantic.validate_call +def parse_input_arguments() -> argparse.Namespace: + """ + Parse command line arguments. + + Returns + ------- + argparse.Namespace + Parsed command line arguments containing: + - Number of significant digits + - Store source flag + + """ + # Create the parser + parser = argparse.ArgumentParser( + description="Parse the DEA technology storage dataset", + formatter_class=argparse.RawTextHelpFormatter, + ) + + # Define arguments + parser.add_argument( + "--num_digits", + type=int, + default=4, + help="Name of significant digits to round the values. ", + ) + + parser.add_argument( + "--store_source", + action="store_true", + help="store_source, store the source object on the wayback machine. Default: false", + ) + + parser.add_argument( + "--filter_params", + action="store_true", + help="filter_params. Filter the parameters stored to technologies.json. Default: false", + ) + + parser.add_argument( + "--export_schema", + action="store_true", + help="export_schema. Export the Source/TechnologyCollection schemas. Default: false", + ) + + # Parse arguments + args = parser.parse_args() + + return args + + +if __name__ == "__main__": + # Parse input arguments + input_args = parse_input_arguments() + logger.info("Command line arguments parsed.") + + # Read the raw data + dea_energy_storage_file_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "package_data", + "raw", + "Technology_datasheet_for_energy_storage.xlsx", + ) + + dea_energy_storage_df = pd.read_excel( + dea_energy_storage_file_path, + sheet_name="alldata_flat", + engine="calamine", + dtype=str, + ) + logger.info("Input file read-in.") + + # Drop unnecessary rows + cleaned_df = drop_invalid_rows(dea_energy_storage_df) + logger.info("Unnecessary rows dropped.") + + # Clean technology (Technology) column + cleaned_df["Technology"] = cleaned_df["Technology"].apply(clean_technology_string) + + # Clean ws column + cleaned_df["ws"] = cleaned_df["ws"].apply(clean_technology_string) + logger.info("`Technology` and `ws` cleaned.") + + # Clean year column + cleaned_df["year"] = cleaned_df["year"].apply(extract_year) + logger.info("`year` column cleaned.") + + # Clean parameter (par) column + cleaned_df["par"] = cleaned_df["par"].apply(clean_parameter_string) + logger.info("`par` column cleaned.") + + # Complete missing units based on parameter names and replace incorrect units. + cleaned_df[["par", "unit"]] = cleaned_df[["par", "unit"]].apply( + standardize_units, axis=1 + ) + logger.info("Missing units added and wrong units replaced.") + + # Include priceyear in unit if applicable + cleaned_df["unit"] = cleaned_df.apply( + lambda row: Commons.update_unit_with_currency_year( + row["unit"], row["priceyear"] + ), + axis=1, + ) + logger.info("`priceyear` included in `unit` column.") + + # Format value (val) column + cleaned_df["val"] = cleaned_df["val"].apply( + lambda x: format_val_number(x, input_args.num_digits) + ) + logger.info("`val` column formatted.") + + # Replace "MEUR_2020" with "EUR_2020" and multiply val by 1_000_000 + mask_meur = cleaned_df["unit"].str.contains("MEUR_2020") + cleaned_df.loc[mask_meur, "unit"] = cleaned_df.loc[mask_meur, "unit"].str.replace( + "MEUR_2020", "EUR_2020" + ) + cleaned_df.loc[mask_meur, "val"] = ( + cleaned_df.loc[mask_meur, "val"] * 1_000_000.0 + ).round(input_args.num_digits) + + # Replace "kEUR_2020" with "EUR_2020" and multiply val by 1_000 + mask_lower_keur = cleaned_df["unit"].str.contains("kEUR_2020") + cleaned_df.loc[mask_lower_keur, "unit"] = cleaned_df.loc[ + mask_lower_keur, "unit" + ].str.replace("kEUR_2020", "EUR_2020") + cleaned_df.loc[mask_lower_keur, "val"] = ( + cleaned_df.loc[mask_lower_keur, "val"] * 1_000.0 + ).round(input_args.num_digits) + + # Replace "KEUR_2020" with "EUR_2020" and multiply val by 1_000 + mask_upper_keur = cleaned_df["unit"].str.contains("KEUR_2020") + cleaned_df.loc[mask_upper_keur, "unit"] = cleaned_df.loc[ + mask_upper_keur, "unit" + ].str.replace("KEUR_2020", "EUR_2020") + cleaned_df.loc[mask_upper_keur, "val"] = ( + cleaned_df.loc[mask_upper_keur, "val"] * 1_000.0 + ).round(input_args.num_digits) + + # Replace "mol/s/m/MPa1/2" with "mol/s/m/Pa" and multiply val by 1_000_000 + mask_mols = cleaned_df["unit"].str.contains("mol/s/m/MPa1/2") + cleaned_df.loc[mask_mols, "unit"] = cleaned_df.loc[mask_mols, "unit"].str.replace( + "mol/s/m/MPa1/2", "mol/s/m/Pa" + ) + cleaned_df.loc[mask_mols, "val"] = cleaned_df.loc[mask_mols, "val"] * 1_000_000.0 + + # Replace, in column `par`, `energy storage capacity for one unit` and `tank volume of example` with `capacity` + mask_capacity = cleaned_df["par"].isin( + [ + "energy storage capacity for one unit", + "tank volume of example", + ] + ) + cleaned_df.loc[mask_capacity, "par"] = "capacity" + + # Clean est column + cleaned_df["est"] = cleaned_df["est"].apply(clean_est_string) + logger.info("`est` column cleaned.") + + # Drop unnecessary columns + columns_to_drop = ["cat", "priceyear", "ref", "note"] + cleaned_df = cleaned_df.drop(columns=columns_to_drop, errors="ignore") + logger.info("Unnecessary columns dropped.") + + filtered_df = filter_parameters(cleaned_df, input_args.filter_params) + + # Build TechnologyCollection + dea_storage_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "package_data", + "dea_energy_storage", + ) + output_technologies_path = pathlib.Path( + dea_storage_path, + "technologies.json", + ) + output_sources_path = pathlib.Path( + dea_storage_path, + "sources.json", + ) + + tech_col = build_technology_collection( + filtered_df, + output_sources_path, + store_source=input_args.store_source, + output_schema=input_args.export_schema, + ) + logger.info("TechnologyCollection object instantiated.") + tech_col.to_json(output_technologies_path, output_schema=input_args.export_schema) + logger.info("TechnologyCollection object exported to json.") + + if input_args.export_schema: + # Move schema files if they exist + schema_folder = pathlib.Path( + path_cwd, "src", "technologydata", "package_data", "schemas" + ) + sources_schema = pathlib.Path(dea_storage_path, "sources.schema.json") + technologies_schema = pathlib.Path(dea_storage_path, "technologies.schema.json") + + schema_folder.mkdir(parents=True, exist_ok=True) + + if sources_schema.exists(): + sources_schema.rename(schema_folder / "sources.schema.json") + logger.info(f"Moved {sources_schema} to {schema_folder}") + if technologies_schema.exists(): + technologies_schema.rename(schema_folder / "technologies.schema.json") + logger.info(f"Moved {technologies_schema} to {schema_folder}") diff --git a/src/technologydata/package_data/dea_energy_storage/sources.json b/src/technologydata/package_data/dea_energy_storage/sources.json new file mode 100644 index 00000000..7b84d367 --- /dev/null +++ b/src/technologydata/package_data/dea_energy_storage/sources.json @@ -0,0 +1,12 @@ +{ + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] +} diff --git a/src/technologydata/package_data/dea_energy_storage/technologies.json b/src/technologydata/package_data/dea_energy_storage/technologies.json new file mode 100644 index 00000000..7d197591 --- /dev/null +++ b/src/technologydata/package_data/dea_energy_storage/technologies.json @@ -0,0 +1,17508 @@ +{ + "technologies": [ + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "charge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 69.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2615.964, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 680.576, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.616, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "charge efficiency": { + "magnitude": 0.72, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8.807, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3036000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "capacity": { + "magnitude": 4.43, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1063000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.638, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "capacity": { + "magnitude": 250.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 489000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.914, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8507.2, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2015, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 90.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 51.203, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 419.862, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.614, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "control", + "region": "EU", + "year": 2018, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 174000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "control", + "region": "EU", + "year": 2019, + "parameters": { + "charge efficiency": { + "magnitude": 0.883, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 638.04, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 61000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2615.964, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 680.576, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.616, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 154000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.72, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.883, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 638.04, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 61000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8.807, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3036000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 4.15, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 17.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 447000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.638, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 300.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 19.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 393000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.914, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1062000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8507.2, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 90.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 51.203, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 419.862, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.717, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "underground storage of gas", + "detailed_technology": "natural gas storage underground", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 1100.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.27, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "control", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 0.5, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 6300.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 630000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "control", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8352.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 288000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 500.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 92220.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "control", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1062000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 96.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 13048.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "control", + "region": "EU", + "year": 2025, + "parameters": { + "capacity": { + "magnitude": 0.5, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 3975.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 530000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 84.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 84.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2615.964, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 680.576, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.616, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 145000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 2000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 0.74, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 0.89, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 531.7, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 48000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8.807, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3036000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3.6, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8091.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 279000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 62710.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 4.15, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 23.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 276000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.638, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 300.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 24.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 245000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.914, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1062000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8507.2, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 96.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 12396.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 90.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 51.203, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 419.862, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.024, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "underground storage of gas", + "detailed_technology": "natural gas storage underground", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 1100.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.27, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "control", + "region": "EU", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 0.6, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 4088.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 545000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "control", + "region": "EU", + "year": 2035, + "parameters": { + "charge efficiency": { + "magnitude": 98.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8139.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 281000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2035, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 55332.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "control", + "region": "EU", + "year": 2035, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1062000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2035, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 96.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 11776.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "control", + "region": "EU", + "year": 2035, + "parameters": { + "capacity": { + "magnitude": 0.63, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 3467.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 462000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 2000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 0.75, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 0.896, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 531.7, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 29000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8.807, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3036000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 98.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4.5, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8676.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 299000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 48822.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 983000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 96.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 11187.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 90.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 51.203, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 419.862, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.229, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "underground storage of gas", + "detailed_technology": "natural gas storage underground", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "capacity": { + "magnitude": 1100.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.27, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "control", + "region": "EU", + "year": 2040, + "parameters": { + "capacity": { + "magnitude": 0.65, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 35.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2927.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 390000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 85.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 85.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2615.964, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 680.576, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.616, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 139000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.75, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.902, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 425.36, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 22000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8.807, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3036000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 98.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4.8, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 9222.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 318000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 38010.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 4.15, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 23.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 245000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.638, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 300.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 24.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 213000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.914, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 903000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 8507.2, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 96.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 10068.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 90.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 51.203, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 419.862, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.229, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "underground storage of gas", + "detailed_technology": "natural gas storage underground", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 1100.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.27, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "control", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 0.75, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2388.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 318000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 69.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 35.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2126.8, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 319000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.127, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 149000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.98, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.883, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 638.04, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 61000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 1500.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 4.876, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 2211000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 3.11, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 9.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.9, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 340000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.425, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 30.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 10.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.8, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 266000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.319, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 903000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "fixed o&m": { + "magnitude": 6380.4, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "lower", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 50.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 25.601, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 522.268, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "lower", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 400.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 76125.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "lower", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 93.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 1000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 5655.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "lower", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 8.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 5365.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 185000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "lower", + "region": "EU", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 0.5, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2320.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 464000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 35.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2126.8, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 584.87, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.127, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 138000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 2000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.897, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 478.53, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 37000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 1500.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 4.876, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 2211000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4.5, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 5755.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 198000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 400.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 31377.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.05, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 3.11, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 12.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.9, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 191000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.425, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 30.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 14.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.8, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 138000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.319, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 744000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "fixed o&m": { + "magnitude": 6380.4, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 93.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 1000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 4364.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 50.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 25.601, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 522.268, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "lower", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 0.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 743.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 186000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 80.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 69.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 45.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 4253.6, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1276000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 3.19, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 99.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 160000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 3000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 0.883, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 638.04, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 61000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 5000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 34.135, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 8177000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 5.19, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 564000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.233, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 28.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 7.2, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 776000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 5.955, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1222000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "fixed o&m": { + "magnitude": 12760.8, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "upper", + "region": "EU", + "year": 2020, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 300.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 81.924, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 133.127, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.717, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "upper", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 500.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 108750.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "upper", + "region": "EU", + "year": 2025, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 5000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 18096.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "upper", + "region": "EU", + "year": 2030, + "parameters": { + "charge efficiency": { + "magnitude": 98.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4.1, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 10254.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 354000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "upper", + "region": "EU", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 0.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 35.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 6557.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 656000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "caes", + "detailed_technology": "compressed air energy storage", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 85.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 85.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 10000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 45.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 4253.6, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 680.576, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 3.19, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "flywheels", + "detailed_technology": "flywheels", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 99.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 99.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 0.15, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 797.55, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 149000.0, + "units": "EUR_2020 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - caverns", + "detailed_technology": "hydrogen storage - caverns", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.99, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 150000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 100.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - lohc", + "detailed_technology": "hydrogen storage - lohc", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 7.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "hydrogen storage - tanks", + "detailed_technology": "pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar)", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 0.902, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 16.7, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 319.02, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 22000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "large hot water tank", + "detailed_technology": "large-scale hot water tanks (steel)", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 5000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 34.135, + "units": "EUR_2020 / megawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 8177000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "lithium ion battery", + "detailed_technology": "lithium-ion battery (utility-scale)", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 5.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 11258.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 388000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "molten salt carnot battery", + "detailed_technology": "carnot battery", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 98.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 51521.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-nicl2 battery", + "detailed_technology": "na-nicl2 battery", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 5.19, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 33.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 319000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 2.233, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "na-s battery", + "detailed_technology": "nas battery", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 3000.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 36.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 7.2, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 415000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 5.955, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "ptes seasonal", + "detailed_technology": "pit thermal energy storage [ptes]", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 1.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 4500.0, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 2500000.0, + "units": "EUR_2020 / gigawatt_hour / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 1062000.0, + "units": "EUR_2020 / gigawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "pumped hydro storage", + "detailed_technology": "pumped hydro storage", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "fixed o&m": { + "magnitude": 12760.8, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "rock-based carnot battery", + "detailed_technology": "carnot battery", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 5000.0, + "units": "meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 13964.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "small scale hot water tank", + "detailed_technology": "small-scale hot water tanks (steel)", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "charge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "discharge efficiency": { + "magnitude": 100.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "capacity": { + "magnitude": 300.0, + "units": "liter", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 81.924, + "units": "EUR_2020 / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 133.127, + "units": "EUR_2020 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 1.229, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + }, + { + "name": "vanadium redox flow battery", + "detailed_technology": "vanadium redox battery (vrb)", + "case": "upper", + "region": "EU", + "year": 2050, + "parameters": { + "capacity": { + "magnitude": 0.8, + "units": "megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "technical lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "fixed o&m": { + "magnitude": 3875.0, + "units": "EUR_2020 / megawatt / year", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "specific investment": { + "magnitude": 388000.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + }, + "variable o&m": { + "magnitude": 0.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": "Parsed from Excel file", + "note": null, + "sources": { + "sources": [ + { + "title": "Technology Data for Energy storage (May 2025)", + "authors": "Danish Energy Agency", + "url": "https://ens.dk/media/6589/download", + "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", + "url_date": "2025-10-08 09:24:00", + "url_date_archive": "2025-10-08 09:24:00" + } + ] + } + } + } + } + ] +} diff --git a/src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx b/src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dcdcff61d6b887ecad9e17aa530e9fa97c068064 GIT binary patch literal 329612 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%0ASwI4?*uUsAu? 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%0Ar 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 `jJhaap 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%0Dn1zYI>@u4N<-I17D?oj<#j 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 literal 0 HcmV?d00001 diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 6f94a5cb..eafb5811 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -2,9 +2,6 @@ # # SPDX-License-Identifier: MIT - -# TODO replaceholder - """Technology class for representing a technology with parameters and transformation methods.""" from typing import Annotated, Any, Self diff --git a/src/technologydata/utils/commons.py b/src/technologydata/utils/commons.py index 9e91398f..64b829f9 100644 --- a/src/technologydata/utils/commons.py +++ b/src/technologydata/utils/commons.py @@ -10,9 +10,14 @@ from typing import Any import dateutil +import pandas as pd + +from technologydata.utils.units import CURRENCY_UNIT_PATTERN, get_iso3_to_currency_codes logger = logging.getLogger(__name__) +all_currency_codes = set(get_iso3_to_currency_codes().values()) + class DateFormatEnum(str, enum.Enum): """ @@ -267,3 +272,39 @@ def replace_special_characters(input_string: str) -> str: # Lower case the string replaced = replaced.casefold() return replaced + + @staticmethod + def update_unit_with_currency_year(unit: str, currency_year: str) -> str: + """ + Update unit string to include currency year for currency-based units. + + Parameters + ---------- + unit : str + A unit string + currency_year: str + A currency year string + + Returns + ------- + str + Updated unit + + """ + # Check if the units contain a currency-like string, defined as "{3-letter currency code}_{year as YYYY}" + matches = CURRENCY_UNIT_PATTERN.findall(unit) + + # Check if unit is a string, contains the currency, and currency_year is not null + if isinstance(unit, str) and pd.notna(currency_year): + for currency_code in all_currency_codes: + if ( + pd.notna(currency_code) + and currency_code in unit + and len(matches) == 0 + ): + # Replace currency with currency_currency_year + unit = unit.replace( + currency_code, f"{currency_code}_{currency_year}" + ) + + return unit diff --git a/test/test_commons.py b/test/test_commons.py index c242f863..1c302f56 100644 --- a/test/test_commons.py +++ b/test/test_commons.py @@ -151,3 +151,20 @@ def test_search_file_extension_in_url( technologydata.FileExtensionEnum.search_file_extension_in_url(input_string) == expected_string ) + + @pytest.mark.parametrize( + "input_unit, input_year, expected_string", + [ + ("EUR/kWh", "2020", "EUR_2020/kWh"), + ("USD/kWh", "2020", "USD_2020/kWh"), + ("USD_2023/kWh", "2020", "USD_2023/kWh"), + ], + ) # type: ignore + def test_update_unit_with_currency_year( + self, input_unit: str, input_year: str, expected_string: str + ) -> None: + """Check if update_unit_with_currency_year works as expected.""" + result = technologydata.Commons.update_unit_with_currency_year( + input_unit, input_year + ) + assert result == expected_string diff --git a/test/test_dea_energy_storage.py b/test/test_dea_energy_storage.py new file mode 100644 index 00000000..7a74e1ad --- /dev/null +++ b/test/test_dea_energy_storage.py @@ -0,0 +1,230 @@ +# SPDX-FileCopyrightText: The technology-data authors +# +# SPDX-License-Identifier: MIT + +"""Test the functions of the DEA energy storage parser.""" + +import pathlib +import typing + +import pandas +import pytest + +from technologydata.package_data.dea_energy_storage.dea_energy_storage import ( + build_technology_collection, + clean_est_string, + clean_parameter_string, + clean_technology_string, + drop_invalid_rows, + extract_year, + filter_parameters, + format_val_number, + standardize_units, +) + + +class TestDEAEnergyStorage: + """Test suite for the functions of the DEA energy storage parser.""" + + @pytest.mark.parametrize( + "input_string, expected_string", + [ + ("- Discharge efficiency [%]", "discharge efficiency"), + ("Construction time [years]", "construction time"), + ("- Another example [with brackets]", "another example"), + ("No brackets or hyphen here", "no brackets or hyphen here"), + ("- Another example [with brackets)", "another example"), + ], + ) # type: ignore + def test_clean_parameter_string( + self, input_string: str, expected_string: str + ) -> None: + """Check if the clean_parameter_string works as expected.""" + assert clean_parameter_string(input_string) == expected_string + + def test_drop_invalid_rows(self) -> None: + """Check if the drop_invalid_rows works as expected.""" + input_dataframe = pandas.DataFrame( + { + "Technology": ["AI", "", "ML", "new_tech", "Tech", "Tech_1", "Tech_2"], + "par": ["p1", "p2", "", "p4", None, "p5", "p6"], + "val": ["<1", " ", None, "abc", "456", "456,1", "1,1x10^3"], + "year": [ + "almost 2020", + "2021", + "2020", + "2022", + "", + "nearly 2020", + "2024", + ], + } + ) + expected_dataframe = pandas.DataFrame( + { + "Technology": ["Tech_1", "Tech_2"], + "par": ["p5", "p6"], + "val": ["456,1", "1,1x10^3"], + "year": ["nearly 2020", "2024"], + } + ) + output_dataframe = drop_invalid_rows(input_dataframe).reset_index(drop=True) + comparison_df = output_dataframe.compare(expected_dataframe) + assert comparison_df.empty + + @pytest.mark.parametrize( + "input_string, expected_string", + [ + ("192 string", "string"), + (" STRING 123 ", "string 123"), + (" string 123a ", "string 123a"), + (" 123b string ", "string"), + (" 123c ", ""), + ], + ) # type: ignore + def test_clean_technology_string( + self, input_string: str, expected_string: str + ) -> None: + """Check if clean_technology_string works as expected.""" + result = clean_technology_string(input_string) + assert result == expected_string + assert isinstance(result, str) + + @pytest.mark.parametrize( + "input_year, expected_year", + [ + ("some 1999", 1999), + ("maybe 1", 1), + ("1", 1), + ], + ) # type: ignore + def test_extract_year(self, input_year: str, expected_year: int) -> None: + """Check if extract_year works as expected.""" + result = extract_year(input_year) + assert result == expected_year + assert isinstance(result, int) + + @pytest.mark.parametrize( + "input_number, expected_number", + [ + ("1,1", 1.1), + ("1", 1.0), + ("1.31Γ—10-23", 1.31e-23), + ], + ) # type: ignore + def test_format_val_number( + self, input_number: str, expected_number: int | None | typing.Any + ) -> None: + """Check if format_val_number works as expected, including exception handling.""" + result = format_val_number(input_number, 2) + assert isinstance(result, float) + assert result == expected_number + + @pytest.mark.parametrize( + "input_string, expected_string", + [ + ("ctrl", "control"), + ("Upper", "upper"), + (" Yeah ", "yeah"), + ], + ) # type: ignore + def test_clean_est_string(self, input_string: str, expected_string: str) -> None: + """Check if clean_est_string works as expected.""" + result = clean_est_string(input_string) + assert isinstance(result, str) + assert result == expected_string + + def test_standardize_units(self) -> None: + """Check if standardize_units works as expected.""" + input_dataframe = pandas.DataFrame( + { + "par": [ + "energy storage capacity for one unit", + "typical temperature difference in storage", + "fixed o&m", + "lifetime in total number of cycles", + "cycle life", + "p1", + "p2", + "p3", + "p4", + "p5", + ], + "unit": [ + "", + "", + "", + None, + None, + "unit*pct./period", + "unit/⁰C", + "pct./30sec", + "m3", + "EUR_2020/tank/year", + ], + } + ) + expected_dataframe = pandas.DataFrame( + { + "par": [ + "energy storage capacity for one unit", + "typical temperature difference in storage", + "fixed o&m", + "lifetime in total number of cycles", + "cycle life", + "p1", + "p2", + "p3", + "p4", + "p5", + ], + "unit": [ + "MWh", + "K", + "percent/year", + "cycles", + "cycles", + "unit*percent", + "unit/C", + "percent", + "meter**3", + "EUR_2020/year", + ], + } + ) + input_dataframe[["par", "unit"]] = ( + input_dataframe[["par", "unit"]] + .apply(standardize_units, axis=1) + .reset_index(drop=True) + ) + comparison_df = input_dataframe.compare(expected_dataframe) + assert comparison_df.empty + + def test_filter_parameters_true_false(self) -> None: + """Check if filter_parameters works as expected.""" + dataframe = pandas.DataFrame( + {"par": ["technical lifetime", "other"], "Technology": ["A", "B"]} + ) + filtered = filter_parameters(dataframe, True) + assert all(filtered["par"] == "technical lifetime") + filtered2 = filter_parameters(dataframe, False) + assert len(filtered2) == 2 + + @pytest.mark.webarchive # type: ignore + def test_build_technology_collection(self, tmp_path: pathlib.Path) -> None: + """Check if build_technology_collection works as expected.""" + dataframe = pandas.DataFrame( + { + "est": ["base"], + "year": [2020], + "ws": ["Tech1"], + "Technology": ["Solar PV"], + "par": ["specific_investment"], + "val": [1000], + "unit": ["EUR_2020/kW"], + } + ) + sources_path = pathlib.Path(tmp_path, "sources.json") + tech_collection = build_technology_collection(dataframe, sources_path) + assert len(tech_collection.technologies) == 1 + assert "specific_investment" in tech_collection.technologies[0].parameters From 5d9c3de39d63c4a3bc3a5b314879a44e1a43f52d Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 8 Dec 2025 16:57:12 +0100 Subject: [PATCH 30/81] Update pydeflate dependency (#79) --- .gitignore | 3 + pyproject.toml | 2 +- src/technologydata/utils/units.py | 2 + uv.lock | 2749 +++++++++++++++-------------- 4 files changed, 1430 insertions(+), 1326 deletions(-) diff --git a/.gitignore b/.gitignore index 63839d78..ff3150b2 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,6 @@ coverage.xml # folder for misc developments dev/ + +# pydeflate cache +pydeflate_data/ diff --git a/pyproject.toml b/pyproject.toml index 7e168f7d..0303bd82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "pandas>=2.2.3", "pint>=0.24.4", "pydantic>=2.11.7", - "pydeflate>=2.1.3", + "pydeflate>=2.3.3", "requests>=2.32.3", "savepagenow>=1.3.0", "scipy>=1.16.1", diff --git a/src/technologydata/utils/units.py b/src/technologydata/utils/units.py index 548d1ef9..47ce8131 100644 --- a/src/technologydata/utils/units.py +++ b/src/technologydata/utils/units.py @@ -20,6 +20,8 @@ logger = logging.getLogger(__name__) +pydeflate.set_pydeflate_path("./pydeflate_data") + CURRENCY_UNIT_PATTERN = re.compile(r"\b(?P[A-Z]{3})_(?P\d{4})\b") # Set up cache directory and file for currency codes diff --git a/uv.lock b/uv.lock index 6f09e707..2a4a3923 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", @@ -11,59 +11,59 @@ resolution-markers = [ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload_time = "2024-02-06T09:43:09.663Z" }, ] [[package]] name = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload_time = "2024-11-30T04:30:10.946Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, ] [[package]] name = "backrefs" version = "5.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload_time = "2025-06-22T19:34:13.97Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267 }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072 }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947 }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843 }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762 }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265 }, + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload_time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload_time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload_time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload_time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload_time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, ] [[package]] @@ -74,9 +74,9 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954 } +sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954, upload_time = "2025-08-24T14:06:13.168Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113 }, + { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113, upload_time = "2025-08-24T14:06:14.884Z" }, ] [[package]] @@ -86,9 +86,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload_time = "2017-08-03T15:55:25.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006 }, + { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload_time = "2017-08-03T15:55:31.23Z" }, ] [[package]] @@ -98,9 +98,9 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload_time = "2024-10-29T18:30:40.477Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload_time = "2024-10-29T18:30:38.186Z" }, ] [package.optional-dependencies] @@ -112,9 +112,9 @@ css = [ name = "boolean-py" version = "5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047 } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577 }, + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, ] [[package]] @@ -124,9 +124,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096 } +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload_time = "2024-06-18T10:56:06.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611 }, + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload_time = "2024-06-18T10:55:59.489Z" }, ] [[package]] @@ -140,18 +140,31 @@ dependencies = [ { name = "pillow" }, { name = "tinycss2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload_time = "2025-05-15T06:56:32.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773 }, + { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload_time = "2025-05-15T06:56:28.552Z" }, +] + +[[package]] +name = "cattrs" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/42/988b3a667967e9d2d32346e7ed7edee540ef1cee829b53ef80aa8d4a0222/cattrs-25.2.0.tar.gz", hash = "sha256:f46c918e955db0177be6aa559068390f71988e877c603ae2e56c71827165cc06", size = 506531, upload_time = "2025-08-31T20:41:59.301Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/a5/b3771ac30b590026b9d721187110194ade05bfbea3d98b423a9cafd80959/cattrs-25.2.0-py3-none-any.whl", hash = "sha256:539d7eedee7d2f0706e4e109182ad096d608ba84633c32c75ef3458f1d11e8f1", size = 70040, upload_time = "2025-08-31T20:41:57.543Z" }, ] [[package]] name = "certifi" version = "2025.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload_time = "2025-08-03T03:07:47.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216 }, + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload_time = "2025-08-03T03:07:45.777Z" }, ] [[package]] @@ -161,114 +174,114 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271 }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048 }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529 }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097 }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983 }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519 }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572 }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963 }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361 }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932 }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557 }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762 }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230 }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043 }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446 }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101 }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948 }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422 }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499 }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928 }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302 }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909 }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402 }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780 }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320 }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487 }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049 }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793 }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300 }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244 }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828 }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926 }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328 }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650 }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687 }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773 }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013 }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593 }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354 }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480 }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584 }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443 }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437 }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487 }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726 }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195 }, +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload_time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload_time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload_time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload_time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload_time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload_time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload_time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload_time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload_time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload_time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload_time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload_time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload_time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload_time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload_time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload_time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload_time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload_time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload_time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload_time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload_time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload_time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload_time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload_time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload_time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload_time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload_time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload_time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload_time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload_time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload_time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload_time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload_time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload_time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload_time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload_time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload_time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload_time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload_time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload_time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload_time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload_time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload_time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload_time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload_time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload_time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload_time = "2025-09-08T23:23:43.004Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload_time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655 }, - { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223 }, - { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366 }, - { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104 }, - { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830 }, - { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854 }, - { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670 }, - { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501 }, - { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173 }, - { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822 }, - { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543 }, - { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326 }, - { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008 }, - { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196 }, - { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819 }, - { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350 }, - { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644 }, - { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468 }, - { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187 }, - { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699 }, - { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580 }, - { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366 }, - { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342 }, - { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995 }, - { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640 }, - { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636 }, - { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939 }, - { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580 }, - { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870 }, - { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797 }, - { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224 }, - { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086 }, - { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400 }, - { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175 }, +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload_time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload_time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload_time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload_time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload_time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload_time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload_time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload_time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload_time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload_time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload_time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload_time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload_time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload_time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload_time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload_time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload_time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload_time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload_time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload_time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload_time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload_time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload_time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload_time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload_time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload_time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload_time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload_time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload_time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload_time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload_time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload_time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload_time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload_time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload_time = "2025-08-09T07:57:26.864Z" }, ] [[package]] @@ -278,101 +291,101 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload_time = "2025-05-20T23:19:49.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload_time = "2025-05-20T23:19:47.796Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "comm" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319 } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload_time = "2025-07-25T14:02:04.452Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294 }, + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload_time = "2025-07-25T14:02:02.896Z" }, ] [[package]] name = "coverage" version = "7.10.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290 }, - { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515 }, - { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020 }, - { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769 }, - { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901 }, - { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413 }, - { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820 }, - { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941 }, - { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519 }, - { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375 }, - { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699 }, - { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512 }, - { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147 }, - { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320 }, - { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575 }, - { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568 }, - { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174 }, - { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447 }, - { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779 }, - { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604 }, - { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497 }, - { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350 }, - { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111 }, - { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746 }, - { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541 }, - { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170 }, - { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029 }, - { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259 }, - { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592 }, - { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768 }, - { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995 }, - { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546 }, - { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544 }, - { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308 }, - { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920 }, - { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434 }, - { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403 }, - { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469 }, - { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731 }, - { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302 }, - { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578 }, - { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629 }, - { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162 }, - { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517 }, - { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632 }, - { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520 }, - { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455 }, - { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287 }, - { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946 }, - { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009 }, - { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804 }, - { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384 }, - { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047 }, - { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266 }, - { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767 }, - { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931 }, - { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186 }, - { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470 }, - { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626 }, - { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386 }, - { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852 }, - { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534 }, - { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784 }, - { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905 }, - { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922 }, - { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952 }, +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload_time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload_time = "2025-09-21T20:01:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload_time = "2025-09-21T20:01:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload_time = "2025-09-21T20:01:39.617Z" }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload_time = "2025-09-21T20:01:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload_time = "2025-09-21T20:01:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload_time = "2025-09-21T20:01:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload_time = "2025-09-21T20:01:45.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload_time = "2025-09-21T20:01:47.296Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload_time = "2025-09-21T20:01:48.73Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload_time = "2025-09-21T20:01:50.529Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload_time = "2025-09-21T20:01:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload_time = "2025-09-21T20:01:53.481Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload_time = "2025-09-21T20:01:55.2Z" }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload_time = "2025-09-21T20:01:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload_time = "2025-09-21T20:01:58.203Z" }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload_time = "2025-09-21T20:01:59.748Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload_time = "2025-09-21T20:02:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload_time = "2025-09-21T20:02:02.701Z" }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload_time = "2025-09-21T20:02:04.185Z" }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload_time = "2025-09-21T20:02:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload_time = "2025-09-21T20:02:07.619Z" }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload_time = "2025-09-21T20:02:10.34Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload_time = "2025-09-21T20:02:12.122Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload_time = "2025-09-21T20:02:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload_time = "2025-09-21T20:02:15.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload_time = "2025-09-21T20:02:17.395Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload_time = "2025-09-21T20:02:18.936Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload_time = "2025-09-21T20:02:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload_time = "2025-09-21T20:02:22.313Z" }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload_time = "2025-09-21T20:02:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload_time = "2025-09-21T20:02:26.133Z" }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload_time = "2025-09-21T20:02:27.716Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload_time = "2025-09-21T20:02:29.216Z" }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload_time = "2025-09-21T20:02:31.226Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload_time = "2025-09-21T20:02:32.823Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload_time = "2025-09-21T20:02:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload_time = "2025-09-21T20:02:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload_time = "2025-09-21T20:02:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload_time = "2025-09-21T20:02:40.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload_time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload_time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload_time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload_time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload_time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload_time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload_time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload_time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload_time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload_time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload_time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload_time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload_time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload_time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload_time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload_time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload_time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload_time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload_time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload_time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload_time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload_time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload_time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload_time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload_time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload_time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload_time = "2025-09-21T20:03:53.918Z" }, ] [[package]] @@ -382,60 +395,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/62/e3664e6ffd7743e1694b244dde70b43a394f6f7fbcacf7014a8ff5197c73/cryptography-46.0.1.tar.gz", hash = "sha256:ed570874e88f213437f5cf758f9ef26cbfc3f336d889b1e592ee11283bb8d1c7", size = 749198 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/8c/44ee01267ec01e26e43ebfdae3f120ec2312aa72fa4c0507ebe41a26739f/cryptography-46.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:1cd6d50c1a8b79af1a6f703709d8973845f677c8e97b1268f5ff323d38ce8475", size = 7285044 }, - { url = "https://files.pythonhosted.org/packages/22/59/9ae689a25047e0601adfcb159ec4f83c0b4149fdb5c3030cc94cd218141d/cryptography-46.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ff483716be32690c14636e54a1f6e2e1b7bf8e22ca50b989f88fa1b2d287080", size = 4308182 }, - { url = "https://files.pythonhosted.org/packages/c4/ee/ca6cc9df7118f2fcd142c76b1da0f14340d77518c05b1ebfbbabca6b9e7d/cryptography-46.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9873bf7c1f2a6330bdfe8621e7ce64b725784f9f0c3a6a55c3047af5849f920e", size = 4572393 }, - { url = "https://files.pythonhosted.org/packages/7f/a3/0f5296f63815d8e985922b05c31f77ce44787b3127a67c0b7f70f115c45f/cryptography-46.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0dfb7c88d4462a0cfdd0d87a3c245a7bc3feb59de101f6ff88194f740f72eda6", size = 4308400 }, - { url = "https://files.pythonhosted.org/packages/5d/8c/74fcda3e4e01be1d32775d5b4dd841acaac3c1b8fa4d0774c7ac8d52463d/cryptography-46.0.1-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e22801b61613ebdebf7deb18b507919e107547a1d39a3b57f5f855032dd7cfb8", size = 4015786 }, - { url = "https://files.pythonhosted.org/packages/dc/b8/85d23287baeef273b0834481a3dd55bbed3a53587e3b8d9f0898235b8f91/cryptography-46.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:757af4f6341ce7a1e47c326ca2a81f41d236070217e5fbbad61bbfe299d55d28", size = 4982606 }, - { url = "https://files.pythonhosted.org/packages/e5/d3/de61ad5b52433b389afca0bc70f02a7a1f074651221f599ce368da0fe437/cryptography-46.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f7a24ea78de345cfa7f6a8d3bde8b242c7fac27f2bd78fa23474ca38dfaeeab9", size = 4604234 }, - { url = "https://files.pythonhosted.org/packages/dc/1f/dbd4d6570d84748439237a7478d124ee0134bf166ad129267b7ed8ea6d22/cryptography-46.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e8776dac9e660c22241b6587fae51a67b4b0147daa4d176b172c3ff768ad736", size = 4307669 }, - { url = "https://files.pythonhosted.org/packages/ec/fd/ca0a14ce7f0bfe92fa727aacaf2217eb25eb7e4ed513b14d8e03b26e63ed/cryptography-46.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9f40642a140c0c8649987027867242b801486865277cbabc8c6059ddef16dc8b", size = 4947579 }, - { url = "https://files.pythonhosted.org/packages/89/6b/09c30543bb93401f6f88fce556b3bdbb21e55ae14912c04b7bf355f5f96c/cryptography-46.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:449ef2b321bec7d97ef2c944173275ebdab78f3abdd005400cc409e27cd159ab", size = 4603669 }, - { url = "https://files.pythonhosted.org/packages/23/9a/38cb01cb09ce0adceda9fc627c9cf98eb890fc8d50cacbe79b011df20f8a/cryptography-46.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2dd339ba3345b908fa3141ddba4025568fa6fd398eabce3ef72a29ac2d73ad75", size = 4435828 }, - { url = "https://files.pythonhosted.org/packages/0f/53/435b5c36a78d06ae0bef96d666209b0ecd8f8181bfe4dda46536705df59e/cryptography-46.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7411c910fb2a412053cf33cfad0153ee20d27e256c6c3f14d7d7d1d9fec59fd5", size = 4709553 }, - { url = "https://files.pythonhosted.org/packages/f5/c4/0da6e55595d9b9cd3b6eb5dc22f3a07ded7f116a3ea72629cab595abb804/cryptography-46.0.1-cp311-abi3-win32.whl", hash = "sha256:cbb8e769d4cac884bb28e3ff620ef1001b75588a5c83c9c9f1fdc9afbe7f29b0", size = 3058327 }, - { url = "https://files.pythonhosted.org/packages/95/0f/cd29a35e0d6e78a0ee61793564c8cff0929c38391cb0de27627bdc7525aa/cryptography-46.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:92e8cfe8bd7dd86eac0a677499894862cd5cc2fd74de917daa881d00871ac8e7", size = 3523893 }, - { url = "https://files.pythonhosted.org/packages/f2/dd/eea390f3e78432bc3d2f53952375f8b37cb4d37783e626faa6a51e751719/cryptography-46.0.1-cp311-abi3-win_arm64.whl", hash = "sha256:db5597a4c7353b2e5fb05a8e6cb74b56a4658a2b7bf3cb6b1821ae7e7fd6eaa0", size = 2932145 }, - { url = "https://files.pythonhosted.org/packages/0a/fb/c73588561afcd5e24b089952bd210b14676c0c5bf1213376350ae111945c/cryptography-46.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:4c49eda9a23019e11d32a0eb51a27b3e7ddedde91e099c0ac6373e3aacc0d2ee", size = 7193928 }, - { url = "https://files.pythonhosted.org/packages/26/34/0ff0bb2d2c79f25a2a63109f3b76b9108a906dd2a2eb5c1d460b9938adbb/cryptography-46.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9babb7818fdd71394e576cf26c5452df77a355eac1a27ddfa24096665a27f8fd", size = 4293515 }, - { url = "https://files.pythonhosted.org/packages/df/b7/d4f848aee24ecd1be01db6c42c4a270069a4f02a105d9c57e143daf6cf0f/cryptography-46.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9f2c4cc63be3ef43c0221861177cee5d14b505cd4d4599a89e2cd273c4d3542a", size = 4545619 }, - { url = "https://files.pythonhosted.org/packages/44/a5/42fedefc754fd1901e2d95a69815ea4ec8a9eed31f4c4361fcab80288661/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:41c281a74df173876da1dc9a9b6953d387f06e3d3ed9284e3baae3ab3f40883a", size = 4299160 }, - { url = "https://files.pythonhosted.org/packages/86/a1/cd21174f56e769c831fbbd6399a1b7519b0ff6280acec1b826d7b072640c/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0a17377fa52563d730248ba1f68185461fff36e8bc75d8787a7dd2e20a802b7a", size = 3994491 }, - { url = "https://files.pythonhosted.org/packages/8d/2f/a8cbfa1c029987ddc746fd966711d4fa71efc891d37fbe9f030fe5ab4eec/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:0d1922d9280e08cde90b518a10cd66831f632960a8d08cb3418922d83fce6f12", size = 4960157 }, - { url = "https://files.pythonhosted.org/packages/67/ae/63a84e6789e0d5a2502edf06b552bcb0fa9ff16147265d5c44a211942abe/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:af84e8e99f1a82cea149e253014ea9dc89f75b82c87bb6c7242203186f465129", size = 4577263 }, - { url = "https://files.pythonhosted.org/packages/ef/8f/1b9fa8e92bd9cbcb3b7e1e593a5232f2c1e6f9bd72b919c1a6b37d315f92/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ef648d2c690703501714588b2ba640facd50fd16548133b11b2859e8655a69da", size = 4298703 }, - { url = "https://files.pythonhosted.org/packages/c3/af/bb95db070e73fea3fae31d8a69ac1463d89d1c084220f549b00dd01094a8/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:e94eb5fa32a8a9f9bf991f424f002913e3dd7c699ef552db9b14ba6a76a6313b", size = 4926363 }, - { url = "https://files.pythonhosted.org/packages/f5/3b/d8fb17ffeb3a83157a1cc0aa5c60691d062aceecba09c2e5e77ebfc1870c/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:534b96c0831855e29fc3b069b085fd185aa5353033631a585d5cd4dd5d40d657", size = 4576958 }, - { url = "https://files.pythonhosted.org/packages/d9/46/86bc3a05c10c8aa88c8ae7e953a8b4e407c57823ed201dbcba55c4d655f4/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9b55038b5c6c47559aa33626d8ecd092f354e23de3c6975e4bb205df128a2a0", size = 4422507 }, - { url = "https://files.pythonhosted.org/packages/a8/4e/387e5a21dfd2b4198e74968a541cfd6128f66f8ec94ed971776e15091ac3/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ec13b7105117dbc9afd023300fb9954d72ca855c274fe563e72428ece10191c0", size = 4683964 }, - { url = "https://files.pythonhosted.org/packages/25/a3/f9f5907b166adb8f26762071474b38bbfcf89858a5282f032899075a38a1/cryptography-46.0.1-cp314-cp314t-win32.whl", hash = "sha256:504e464944f2c003a0785b81668fe23c06f3b037e9cb9f68a7c672246319f277", size = 3029705 }, - { url = "https://files.pythonhosted.org/packages/12/66/4d3a4f1850db2e71c2b1628d14b70b5e4c1684a1bd462f7fffb93c041c38/cryptography-46.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c52fded6383f7e20eaf70a60aeddd796b3677c3ad2922c801be330db62778e05", size = 3502175 }, - { url = "https://files.pythonhosted.org/packages/52/c7/9f10ad91435ef7d0d99a0b93c4360bea3df18050ff5b9038c489c31ac2f5/cryptography-46.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:9495d78f52c804b5ec8878b5b8c7873aa8e63db9cd9ee387ff2db3fffe4df784", size = 2912354 }, - { url = "https://files.pythonhosted.org/packages/98/e5/fbd632385542a3311915976f88e0dfcf09e62a3fc0aff86fb6762162a24d/cryptography-46.0.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d84c40bdb8674c29fa192373498b6cb1e84f882889d21a471b45d1f868d8d44b", size = 7255677 }, - { url = "https://files.pythonhosted.org/packages/56/3e/13ce6eab9ad6eba1b15a7bd476f005a4c1b3f299f4c2f32b22408b0edccf/cryptography-46.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ed64e5083fa806709e74fc5ea067dfef9090e5b7a2320a49be3c9df3583a2d8", size = 4301110 }, - { url = "https://files.pythonhosted.org/packages/a2/67/65dc233c1ddd688073cf7b136b06ff4b84bf517ba5529607c9d79720fc67/cryptography-46.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:341fb7a26bc9d6093c1b124b9f13acc283d2d51da440b98b55ab3f79f2522ead", size = 4562369 }, - { url = "https://files.pythonhosted.org/packages/17/db/d64ae4c6f4e98c3dac5bf35dd4d103f4c7c345703e43560113e5e8e31b2b/cryptography-46.0.1-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6ef1488967e729948d424d09c94753d0167ce59afba8d0f6c07a22b629c557b2", size = 4302126 }, - { url = "https://files.pythonhosted.org/packages/3d/19/5f1eea17d4805ebdc2e685b7b02800c4f63f3dd46cfa8d4c18373fea46c8/cryptography-46.0.1-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7823bc7cdf0b747ecfb096d004cc41573c2f5c7e3a29861603a2871b43d3ef32", size = 4009431 }, - { url = "https://files.pythonhosted.org/packages/81/b5/229ba6088fe7abccbfe4c5edb96c7a5ad547fac5fdd0d40aa6ea540b2985/cryptography-46.0.1-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f736ab8036796f5a119ff8211deda416f8c15ce03776db704a7a4e17381cb2ef", size = 4980739 }, - { url = "https://files.pythonhosted.org/packages/3a/9c/50aa38907b201e74bc43c572f9603fa82b58e831bd13c245613a23cff736/cryptography-46.0.1-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e46710a240a41d594953012213ea8ca398cd2448fbc5d0f1be8160b5511104a0", size = 4592289 }, - { url = "https://files.pythonhosted.org/packages/5a/33/229858f8a5bb22f82468bb285e9f4c44a31978d5f5830bb4ea1cf8a4e454/cryptography-46.0.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:84ef1f145de5aee82ea2447224dc23f065ff4cc5791bb3b506615957a6ba8128", size = 4301815 }, - { url = "https://files.pythonhosted.org/packages/52/cb/b76b2c87fbd6ed4a231884bea3ce073406ba8e2dae9defad910d33cbf408/cryptography-46.0.1-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9394c7d5a7565ac5f7d9ba38b2617448eba384d7b107b262d63890079fad77ca", size = 4943251 }, - { url = "https://files.pythonhosted.org/packages/94/0f/f66125ecf88e4cb5b8017ff43f3a87ede2d064cb54a1c5893f9da9d65093/cryptography-46.0.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ed957044e368ed295257ae3d212b95456bd9756df490e1ac4538857f67531fcc", size = 4591247 }, - { url = "https://files.pythonhosted.org/packages/f6/22/9f3134ae436b63b463cfdf0ff506a0570da6873adb4bf8c19b8a5b4bac64/cryptography-46.0.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7de12fa0eee6234de9a9ce0ffcfa6ce97361db7a50b09b65c63ac58e5f22fc7", size = 4428534 }, - { url = "https://files.pythonhosted.org/packages/89/39/e6042bcb2638650b0005c752c38ea830cbfbcbb1830e4d64d530000aa8dc/cryptography-46.0.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7fab1187b6c6b2f11a326f33b036f7168f5b996aedd0c059f9738915e4e8f53a", size = 4699541 }, - { url = "https://files.pythonhosted.org/packages/68/46/753d457492d15458c7b5a653fc9a84a1c9c7a83af6ebdc94c3fc373ca6e8/cryptography-46.0.1-cp38-abi3-win32.whl", hash = "sha256:45f790934ac1018adeba46a0f7289b2b8fe76ba774a88c7f1922213a56c98bc1", size = 3043779 }, - { url = "https://files.pythonhosted.org/packages/2f/50/b6f3b540c2f6ee712feeb5fa780bb11fad76634e71334718568e7695cb55/cryptography-46.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:7176a5ab56fac98d706921f6416a05e5aff7df0e4b91516f450f8627cda22af3", size = 3517226 }, - { url = "https://files.pythonhosted.org/packages/ff/e8/77d17d00981cdd27cc493e81e1749a0b8bbfb843780dbd841e30d7f50743/cryptography-46.0.1-cp38-abi3-win_arm64.whl", hash = "sha256:efc9e51c3e595267ff84adf56e9b357db89ab2279d7e375ffcaf8f678606f3d9", size = 2923149 }, +sdist = { url = "https://files.pythonhosted.org/packages/a9/62/e3664e6ffd7743e1694b244dde70b43a394f6f7fbcacf7014a8ff5197c73/cryptography-46.0.1.tar.gz", hash = "sha256:ed570874e88f213437f5cf758f9ef26cbfc3f336d889b1e592ee11283bb8d1c7", size = 749198, upload_time = "2025-09-17T00:10:35.797Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/8c/44ee01267ec01e26e43ebfdae3f120ec2312aa72fa4c0507ebe41a26739f/cryptography-46.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:1cd6d50c1a8b79af1a6f703709d8973845f677c8e97b1268f5ff323d38ce8475", size = 7285044, upload_time = "2025-09-17T00:08:36.807Z" }, + { url = "https://files.pythonhosted.org/packages/22/59/9ae689a25047e0601adfcb159ec4f83c0b4149fdb5c3030cc94cd218141d/cryptography-46.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ff483716be32690c14636e54a1f6e2e1b7bf8e22ca50b989f88fa1b2d287080", size = 4308182, upload_time = "2025-09-17T00:08:39.388Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/ca6cc9df7118f2fcd142c76b1da0f14340d77518c05b1ebfbbabca6b9e7d/cryptography-46.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9873bf7c1f2a6330bdfe8621e7ce64b725784f9f0c3a6a55c3047af5849f920e", size = 4572393, upload_time = "2025-09-17T00:08:41.663Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a3/0f5296f63815d8e985922b05c31f77ce44787b3127a67c0b7f70f115c45f/cryptography-46.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0dfb7c88d4462a0cfdd0d87a3c245a7bc3feb59de101f6ff88194f740f72eda6", size = 4308400, upload_time = "2025-09-17T00:08:43.559Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8c/74fcda3e4e01be1d32775d5b4dd841acaac3c1b8fa4d0774c7ac8d52463d/cryptography-46.0.1-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e22801b61613ebdebf7deb18b507919e107547a1d39a3b57f5f855032dd7cfb8", size = 4015786, upload_time = "2025-09-17T00:08:45.758Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b8/85d23287baeef273b0834481a3dd55bbed3a53587e3b8d9f0898235b8f91/cryptography-46.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:757af4f6341ce7a1e47c326ca2a81f41d236070217e5fbbad61bbfe299d55d28", size = 4982606, upload_time = "2025-09-17T00:08:47.602Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/de61ad5b52433b389afca0bc70f02a7a1f074651221f599ce368da0fe437/cryptography-46.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f7a24ea78de345cfa7f6a8d3bde8b242c7fac27f2bd78fa23474ca38dfaeeab9", size = 4604234, upload_time = "2025-09-17T00:08:49.879Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1f/dbd4d6570d84748439237a7478d124ee0134bf166ad129267b7ed8ea6d22/cryptography-46.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e8776dac9e660c22241b6587fae51a67b4b0147daa4d176b172c3ff768ad736", size = 4307669, upload_time = "2025-09-17T00:08:52.321Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fd/ca0a14ce7f0bfe92fa727aacaf2217eb25eb7e4ed513b14d8e03b26e63ed/cryptography-46.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9f40642a140c0c8649987027867242b801486865277cbabc8c6059ddef16dc8b", size = 4947579, upload_time = "2025-09-17T00:08:54.697Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/09c30543bb93401f6f88fce556b3bdbb21e55ae14912c04b7bf355f5f96c/cryptography-46.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:449ef2b321bec7d97ef2c944173275ebdab78f3abdd005400cc409e27cd159ab", size = 4603669, upload_time = "2025-09-17T00:08:57.16Z" }, + { url = "https://files.pythonhosted.org/packages/23/9a/38cb01cb09ce0adceda9fc627c9cf98eb890fc8d50cacbe79b011df20f8a/cryptography-46.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2dd339ba3345b908fa3141ddba4025568fa6fd398eabce3ef72a29ac2d73ad75", size = 4435828, upload_time = "2025-09-17T00:08:59.606Z" }, + { url = "https://files.pythonhosted.org/packages/0f/53/435b5c36a78d06ae0bef96d666209b0ecd8f8181bfe4dda46536705df59e/cryptography-46.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7411c910fb2a412053cf33cfad0153ee20d27e256c6c3f14d7d7d1d9fec59fd5", size = 4709553, upload_time = "2025-09-17T00:09:01.832Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c4/0da6e55595d9b9cd3b6eb5dc22f3a07ded7f116a3ea72629cab595abb804/cryptography-46.0.1-cp311-abi3-win32.whl", hash = "sha256:cbb8e769d4cac884bb28e3ff620ef1001b75588a5c83c9c9f1fdc9afbe7f29b0", size = 3058327, upload_time = "2025-09-17T00:09:03.726Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/cd29a35e0d6e78a0ee61793564c8cff0929c38391cb0de27627bdc7525aa/cryptography-46.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:92e8cfe8bd7dd86eac0a677499894862cd5cc2fd74de917daa881d00871ac8e7", size = 3523893, upload_time = "2025-09-17T00:09:06.272Z" }, + { url = "https://files.pythonhosted.org/packages/f2/dd/eea390f3e78432bc3d2f53952375f8b37cb4d37783e626faa6a51e751719/cryptography-46.0.1-cp311-abi3-win_arm64.whl", hash = "sha256:db5597a4c7353b2e5fb05a8e6cb74b56a4658a2b7bf3cb6b1821ae7e7fd6eaa0", size = 2932145, upload_time = "2025-09-17T00:09:08.568Z" }, + { url = "https://files.pythonhosted.org/packages/0a/fb/c73588561afcd5e24b089952bd210b14676c0c5bf1213376350ae111945c/cryptography-46.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:4c49eda9a23019e11d32a0eb51a27b3e7ddedde91e099c0ac6373e3aacc0d2ee", size = 7193928, upload_time = "2025-09-17T00:09:10.595Z" }, + { url = "https://files.pythonhosted.org/packages/26/34/0ff0bb2d2c79f25a2a63109f3b76b9108a906dd2a2eb5c1d460b9938adbb/cryptography-46.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9babb7818fdd71394e576cf26c5452df77a355eac1a27ddfa24096665a27f8fd", size = 4293515, upload_time = "2025-09-17T00:09:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/df/b7/d4f848aee24ecd1be01db6c42c4a270069a4f02a105d9c57e143daf6cf0f/cryptography-46.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9f2c4cc63be3ef43c0221861177cee5d14b505cd4d4599a89e2cd273c4d3542a", size = 4545619, upload_time = "2025-09-17T00:09:15.397Z" }, + { url = "https://files.pythonhosted.org/packages/44/a5/42fedefc754fd1901e2d95a69815ea4ec8a9eed31f4c4361fcab80288661/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:41c281a74df173876da1dc9a9b6953d387f06e3d3ed9284e3baae3ab3f40883a", size = 4299160, upload_time = "2025-09-17T00:09:17.155Z" }, + { url = "https://files.pythonhosted.org/packages/86/a1/cd21174f56e769c831fbbd6399a1b7519b0ff6280acec1b826d7b072640c/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0a17377fa52563d730248ba1f68185461fff36e8bc75d8787a7dd2e20a802b7a", size = 3994491, upload_time = "2025-09-17T00:09:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/a8cbfa1c029987ddc746fd966711d4fa71efc891d37fbe9f030fe5ab4eec/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:0d1922d9280e08cde90b518a10cd66831f632960a8d08cb3418922d83fce6f12", size = 4960157, upload_time = "2025-09-17T00:09:20.923Z" }, + { url = "https://files.pythonhosted.org/packages/67/ae/63a84e6789e0d5a2502edf06b552bcb0fa9ff16147265d5c44a211942abe/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:af84e8e99f1a82cea149e253014ea9dc89f75b82c87bb6c7242203186f465129", size = 4577263, upload_time = "2025-09-17T00:09:23.356Z" }, + { url = "https://files.pythonhosted.org/packages/ef/8f/1b9fa8e92bd9cbcb3b7e1e593a5232f2c1e6f9bd72b919c1a6b37d315f92/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ef648d2c690703501714588b2ba640facd50fd16548133b11b2859e8655a69da", size = 4298703, upload_time = "2025-09-17T00:09:25.566Z" }, + { url = "https://files.pythonhosted.org/packages/c3/af/bb95db070e73fea3fae31d8a69ac1463d89d1c084220f549b00dd01094a8/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:e94eb5fa32a8a9f9bf991f424f002913e3dd7c699ef552db9b14ba6a76a6313b", size = 4926363, upload_time = "2025-09-17T00:09:27.451Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3b/d8fb17ffeb3a83157a1cc0aa5c60691d062aceecba09c2e5e77ebfc1870c/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:534b96c0831855e29fc3b069b085fd185aa5353033631a585d5cd4dd5d40d657", size = 4576958, upload_time = "2025-09-17T00:09:29.924Z" }, + { url = "https://files.pythonhosted.org/packages/d9/46/86bc3a05c10c8aa88c8ae7e953a8b4e407c57823ed201dbcba55c4d655f4/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9b55038b5c6c47559aa33626d8ecd092f354e23de3c6975e4bb205df128a2a0", size = 4422507, upload_time = "2025-09-17T00:09:32.222Z" }, + { url = "https://files.pythonhosted.org/packages/a8/4e/387e5a21dfd2b4198e74968a541cfd6128f66f8ec94ed971776e15091ac3/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ec13b7105117dbc9afd023300fb9954d72ca855c274fe563e72428ece10191c0", size = 4683964, upload_time = "2025-09-17T00:09:34.118Z" }, + { url = "https://files.pythonhosted.org/packages/25/a3/f9f5907b166adb8f26762071474b38bbfcf89858a5282f032899075a38a1/cryptography-46.0.1-cp314-cp314t-win32.whl", hash = "sha256:504e464944f2c003a0785b81668fe23c06f3b037e9cb9f68a7c672246319f277", size = 3029705, upload_time = "2025-09-17T00:09:36.381Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/4d3a4f1850db2e71c2b1628d14b70b5e4c1684a1bd462f7fffb93c041c38/cryptography-46.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c52fded6383f7e20eaf70a60aeddd796b3677c3ad2922c801be330db62778e05", size = 3502175, upload_time = "2025-09-17T00:09:38.261Z" }, + { url = "https://files.pythonhosted.org/packages/52/c7/9f10ad91435ef7d0d99a0b93c4360bea3df18050ff5b9038c489c31ac2f5/cryptography-46.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:9495d78f52c804b5ec8878b5b8c7873aa8e63db9cd9ee387ff2db3fffe4df784", size = 2912354, upload_time = "2025-09-17T00:09:40.078Z" }, + { url = "https://files.pythonhosted.org/packages/98/e5/fbd632385542a3311915976f88e0dfcf09e62a3fc0aff86fb6762162a24d/cryptography-46.0.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d84c40bdb8674c29fa192373498b6cb1e84f882889d21a471b45d1f868d8d44b", size = 7255677, upload_time = "2025-09-17T00:09:42.407Z" }, + { url = "https://files.pythonhosted.org/packages/56/3e/13ce6eab9ad6eba1b15a7bd476f005a4c1b3f299f4c2f32b22408b0edccf/cryptography-46.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ed64e5083fa806709e74fc5ea067dfef9090e5b7a2320a49be3c9df3583a2d8", size = 4301110, upload_time = "2025-09-17T00:09:45.614Z" }, + { url = "https://files.pythonhosted.org/packages/a2/67/65dc233c1ddd688073cf7b136b06ff4b84bf517ba5529607c9d79720fc67/cryptography-46.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:341fb7a26bc9d6093c1b124b9f13acc283d2d51da440b98b55ab3f79f2522ead", size = 4562369, upload_time = "2025-09-17T00:09:47.601Z" }, + { url = "https://files.pythonhosted.org/packages/17/db/d64ae4c6f4e98c3dac5bf35dd4d103f4c7c345703e43560113e5e8e31b2b/cryptography-46.0.1-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6ef1488967e729948d424d09c94753d0167ce59afba8d0f6c07a22b629c557b2", size = 4302126, upload_time = "2025-09-17T00:09:49.335Z" }, + { url = "https://files.pythonhosted.org/packages/3d/19/5f1eea17d4805ebdc2e685b7b02800c4f63f3dd46cfa8d4c18373fea46c8/cryptography-46.0.1-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7823bc7cdf0b747ecfb096d004cc41573c2f5c7e3a29861603a2871b43d3ef32", size = 4009431, upload_time = "2025-09-17T00:09:51.239Z" }, + { url = "https://files.pythonhosted.org/packages/81/b5/229ba6088fe7abccbfe4c5edb96c7a5ad547fac5fdd0d40aa6ea540b2985/cryptography-46.0.1-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f736ab8036796f5a119ff8211deda416f8c15ce03776db704a7a4e17381cb2ef", size = 4980739, upload_time = "2025-09-17T00:09:54.181Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9c/50aa38907b201e74bc43c572f9603fa82b58e831bd13c245613a23cff736/cryptography-46.0.1-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e46710a240a41d594953012213ea8ca398cd2448fbc5d0f1be8160b5511104a0", size = 4592289, upload_time = "2025-09-17T00:09:56.731Z" }, + { url = "https://files.pythonhosted.org/packages/5a/33/229858f8a5bb22f82468bb285e9f4c44a31978d5f5830bb4ea1cf8a4e454/cryptography-46.0.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:84ef1f145de5aee82ea2447224dc23f065ff4cc5791bb3b506615957a6ba8128", size = 4301815, upload_time = "2025-09-17T00:09:58.548Z" }, + { url = "https://files.pythonhosted.org/packages/52/cb/b76b2c87fbd6ed4a231884bea3ce073406ba8e2dae9defad910d33cbf408/cryptography-46.0.1-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9394c7d5a7565ac5f7d9ba38b2617448eba384d7b107b262d63890079fad77ca", size = 4943251, upload_time = "2025-09-17T00:10:00.475Z" }, + { url = "https://files.pythonhosted.org/packages/94/0f/f66125ecf88e4cb5b8017ff43f3a87ede2d064cb54a1c5893f9da9d65093/cryptography-46.0.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ed957044e368ed295257ae3d212b95456bd9756df490e1ac4538857f67531fcc", size = 4591247, upload_time = "2025-09-17T00:10:02.874Z" }, + { url = "https://files.pythonhosted.org/packages/f6/22/9f3134ae436b63b463cfdf0ff506a0570da6873adb4bf8c19b8a5b4bac64/cryptography-46.0.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7de12fa0eee6234de9a9ce0ffcfa6ce97361db7a50b09b65c63ac58e5f22fc7", size = 4428534, upload_time = "2025-09-17T00:10:04.994Z" }, + { url = "https://files.pythonhosted.org/packages/89/39/e6042bcb2638650b0005c752c38ea830cbfbcbb1830e4d64d530000aa8dc/cryptography-46.0.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7fab1187b6c6b2f11a326f33b036f7168f5b996aedd0c059f9738915e4e8f53a", size = 4699541, upload_time = "2025-09-17T00:10:06.925Z" }, + { url = "https://files.pythonhosted.org/packages/68/46/753d457492d15458c7b5a653fc9a84a1c9c7a83af6ebdc94c3fc373ca6e8/cryptography-46.0.1-cp38-abi3-win32.whl", hash = "sha256:45f790934ac1018adeba46a0f7289b2b8fe76ba774a88c7f1922213a56c98bc1", size = 3043779, upload_time = "2025-09-17T00:10:08.951Z" }, + { url = "https://files.pythonhosted.org/packages/2f/50/b6f3b540c2f6ee712feeb5fa780bb11fad76634e71334718568e7695cb55/cryptography-46.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:7176a5ab56fac98d706921f6416a05e5aff7df0e4b91516f450f8627cda22af3", size = 3517226, upload_time = "2025-09-17T00:10:10.769Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e8/77d17d00981cdd27cc493e81e1749a0b8bbfb843780dbd841e30d7f50743/cryptography-46.0.1-cp38-abi3-win_arm64.whl", hash = "sha256:efc9e51c3e595267ff84adf56e9b357db89ab2279d7e375ffcaf8f678606f3d9", size = 2923149, upload_time = "2025-09-17T00:10:13.236Z" }, ] [[package]] name = "csscompressor" version = "0.9.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } [[package]] name = "cssselect2" @@ -445,102 +458,111 @@ dependencies = [ { name = "tinycss2" }, { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716 } +sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload_time = "2025-03-05T14:46:07.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454 }, + { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload_time = "2025-03-05T14:46:06.463Z" }, ] [[package]] name = "debugpy" version = "1.8.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129 } +sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129, upload_time = "2025-09-17T16:33:20.633Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522 }, - { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417 }, - { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130 }, - { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053 }, - { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386 }, - { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100 }, - { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002 }, - { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047 }, - { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899 }, - { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254 }, - { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203 }, - { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493 }, - { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210 }, + { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522, upload_time = "2025-09-17T16:33:38.466Z" }, + { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417, upload_time = "2025-09-17T16:33:41.299Z" }, + { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130, upload_time = "2025-09-17T16:33:43.554Z" }, + { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053, upload_time = "2025-09-17T16:33:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386, upload_time = "2025-09-17T16:33:54.594Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100, upload_time = "2025-09-17T16:33:56.353Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002, upload_time = "2025-09-17T16:33:58.231Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047, upload_time = "2025-09-17T16:34:00.586Z" }, + { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899, upload_time = "2025-09-17T16:34:02.657Z" }, + { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254, upload_time = "2025-09-17T16:34:04.486Z" }, + { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203, upload_time = "2025-09-17T16:34:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493, upload_time = "2025-09-17T16:34:08.483Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210, upload_time = "2025-09-17T16:34:25.835Z" }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload_time = "2021-03-08T10:59:26.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload_time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "diskcache" +version = "5.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload_time = "2023-08-31T06:12:00.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload_time = "2023-08-31T06:11:58.822Z" }, ] [[package]] name = "distlib" version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605 } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload_time = "2025-07-17T16:52:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047 }, + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload_time = "2025-07-17T16:51:58.613Z" }, ] [[package]] name = "et-xmlfile" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 }, + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, ] [[package]] name = "executing" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload_time = "2025-09-01T09:48:10.866Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317 }, + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload_time = "2025-09-01T09:48:08.5Z" }, ] [[package]] name = "fastjsonschema" version = "2.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130 } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload_time = "2025-08-14T18:49:36.666Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024 }, + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload_time = "2025-08-14T18:49:34.776Z" }, ] [[package]] name = "filelock" version = "3.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687 } +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload_time = "2025-08-14T16:56:03.016Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988 }, + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload_time = "2025-08-14T16:56:01.633Z" }, ] [[package]] @@ -550,9 +572,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816 } +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263 }, + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, ] [[package]] @@ -562,9 +584,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799 } +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625 }, + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, ] [[package]] @@ -592,20 +614,20 @@ dependencies = [ { name = "typing-extensions" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478 } +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615 }, + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, ] [[package]] name = "frozendict" version = "2.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload_time = "2024-10-13T12:15:32.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148 }, - { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146 }, - { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146 }, + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload_time = "2024-10-13T12:15:26.839Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload_time = "2024-10-13T12:15:28.16Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload_time = "2024-10-13T12:15:29.495Z" }, ] [[package]] @@ -615,9 +637,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload_time = "2022-05-02T15:47:16.11Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload_time = "2022-05-02T15:47:14.552Z" }, ] [[package]] @@ -627,9 +649,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, ] [[package]] @@ -639,9 +661,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076 } +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload_time = "2025-07-24T03:45:54.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168 }, + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload_time = "2025-07-24T03:45:52.517Z" }, ] [[package]] @@ -651,9 +673,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload_time = "2025-09-05T15:02:29.167Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439 }, + { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload_time = "2025-09-05T15:02:27.511Z" }, ] [[package]] @@ -661,14 +683,14 @@ name = "gurobipy" version = "12.0.3" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/bb/b3784497115c64c2bd122cc9d411f167026d4ec42a26b1ff3c43a779275d/gurobipy-12.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:020f23277f630e079eac114385eabd1bd9fb4ac22f8796ed5ba6d915ce4f141b", size = 12222234 }, - { url = "https://files.pythonhosted.org/packages/18/ea/c065984de5287c99fd30ee8d700fd78f83692e992471f9667ab5d36612b9/gurobipy-12.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:72bbf544bc05060bb93909b79715ace4c0f416198f7622a985cabb9e8e99aa1c", size = 62583866 }, - { url = "https://files.pythonhosted.org/packages/9b/8b/2b9f26e4e19a258229b8a8ffc377ca372cc2059a22a0a7c67572efe308d8/gurobipy-12.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3f971caf270f671b6ffcf5b937b3c0430a5264b0f01529dc8681d61c221f215", size = 14268480 }, - { url = "https://files.pythonhosted.org/packages/26/0f/3544a323635f37cdfe1e011d2903b7ef94ba18e10224fa1419f64d0c1968/gurobipy-12.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:af18fd03d5dc3f6e5f590c372ad288b8430a6d88a5b5e66cfcd8432f86ee8650", size = 11121565 }, - { url = "https://files.pythonhosted.org/packages/5e/95/f0e5b5cf85298f42482cf4e53d8114c45bb962f55195d531fe4e62b5afa1/gurobipy-12.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a8552e47673cb6f1fd351edf8fcad86b02f832cbfb57d90ef21e0397e96d138e", size = 12183439 }, - { url = "https://files.pythonhosted.org/packages/61/6e/aea725b4143faa4eb6878414a91fa74e7871aba0ab9453803a9eeef781c2/gurobipy-12.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:be05c074141c8a126c8aaeccc41795ab091a666eabb39ca1ff98a74bde81e663", size = 62583451 }, - { url = "https://files.pythonhosted.org/packages/75/47/7b9c63ce2cd85d796403b91a6d211d5c8baac7b694edd94e2151f365d6a9/gurobipy-12.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:79a333766e27fef7902ceeefbcf0279a1ca393a27a72ea62f8e301b21aa17d59", size = 14271076 }, - { url = "https://files.pythonhosted.org/packages/2a/93/b10cd6112c05675fed5c817fd7933c9d4ba3a7039e42cba844a9ac09242a/gurobipy-12.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:e0f9ed55077e622021369bb9df2ca3b00c86b678792a3b1556cc59f67348fab0", size = 11111414 }, + { url = "https://files.pythonhosted.org/packages/6f/bb/b3784497115c64c2bd122cc9d411f167026d4ec42a26b1ff3c43a779275d/gurobipy-12.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:020f23277f630e079eac114385eabd1bd9fb4ac22f8796ed5ba6d915ce4f141b", size = 12222234, upload_time = "2025-07-15T07:19:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/18/ea/c065984de5287c99fd30ee8d700fd78f83692e992471f9667ab5d36612b9/gurobipy-12.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:72bbf544bc05060bb93909b79715ace4c0f416198f7622a985cabb9e8e99aa1c", size = 62583866, upload_time = "2025-07-15T07:20:17.576Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8b/2b9f26e4e19a258229b8a8ffc377ca372cc2059a22a0a7c67572efe308d8/gurobipy-12.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3f971caf270f671b6ffcf5b937b3c0430a5264b0f01529dc8681d61c221f215", size = 14268480, upload_time = "2025-07-15T07:20:26.898Z" }, + { url = "https://files.pythonhosted.org/packages/26/0f/3544a323635f37cdfe1e011d2903b7ef94ba18e10224fa1419f64d0c1968/gurobipy-12.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:af18fd03d5dc3f6e5f590c372ad288b8430a6d88a5b5e66cfcd8432f86ee8650", size = 11121565, upload_time = "2025-07-15T07:20:34.576Z" }, + { url = "https://files.pythonhosted.org/packages/5e/95/f0e5b5cf85298f42482cf4e53d8114c45bb962f55195d531fe4e62b5afa1/gurobipy-12.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a8552e47673cb6f1fd351edf8fcad86b02f832cbfb57d90ef21e0397e96d138e", size = 12183439, upload_time = "2025-07-15T07:20:44.224Z" }, + { url = "https://files.pythonhosted.org/packages/61/6e/aea725b4143faa4eb6878414a91fa74e7871aba0ab9453803a9eeef781c2/gurobipy-12.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:be05c074141c8a126c8aaeccc41795ab091a666eabb39ca1ff98a74bde81e663", size = 62583451, upload_time = "2025-07-15T07:21:38.825Z" }, + { url = "https://files.pythonhosted.org/packages/75/47/7b9c63ce2cd85d796403b91a6d211d5c8baac7b694edd94e2151f365d6a9/gurobipy-12.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:79a333766e27fef7902ceeefbcf0279a1ca393a27a72ea62f8e301b21aa17d59", size = 14271076, upload_time = "2025-07-15T07:21:55.102Z" }, + { url = "https://files.pythonhosted.org/packages/2a/93/b10cd6112c05675fed5c817fd7933c9d4ba3a7039e42cba844a9ac09242a/gurobipy-12.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:e0f9ed55077e622021369bb9df2ca3b00c86b678792a3b1556cc59f67348fab0", size = 11111414, upload_time = "2025-07-15T07:22:05.079Z" }, ] [[package]] @@ -680,9 +702,9 @@ dependencies = [ { name = "libhxl" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/5621c48b79a510a87288495f4bdde38a292f0f97dd14177e2cc77c8a79bb/hdx_python_country-3.9.8.tar.gz", hash = "sha256:de9d928e490490fe6fa2d743597464fa8bae317f808667a947e734c1ea26e4d9", size = 531031 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/5621c48b79a510a87288495f4bdde38a292f0f97dd14177e2cc77c8a79bb/hdx_python_country-3.9.8.tar.gz", hash = "sha256:de9d928e490490fe6fa2d743597464fa8bae317f808667a947e734c1ea26e4d9", size = 531031, upload_time = "2025-09-21T23:42:45.054Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/8f/7d961e17372bb9df875e988432a2abb9ca4883b4a0592dfccefa50cb697f/hdx_python_country-3.9.8-py3-none-any.whl", hash = "sha256:602e495028e474e2f93094136007b2c0e765d88af55b2cae7e0ba778e178bcaf", size = 56383 }, + { url = "https://files.pythonhosted.org/packages/ce/8f/7d961e17372bb9df875e988432a2abb9ca4883b4a0592dfccefa50cb697f/hdx_python_country-3.9.8-py3-none-any.whl", hash = "sha256:602e495028e474e2f93094136007b2c0e765d88af55b2cae7e0ba778e178bcaf", size = 56383, upload_time = "2025-09-21T23:42:43.267Z" }, ] [[package]] @@ -705,9 +727,9 @@ dependencies = [ { name = "xlsx2csv" }, { name = "xlwt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/13/f22d36f9146beaefe27b1a888acd31ddd09c1a9730ed1d42df9af33f99e2/hdx_python_utilities-3.9.2.tar.gz", hash = "sha256:de39248afdca00ab636fdfa0c3259fa80e4b95dba026170a4efc5bee14eda3f3", size = 656826 } +sdist = { url = "https://files.pythonhosted.org/packages/7e/13/f22d36f9146beaefe27b1a888acd31ddd09c1a9730ed1d42df9af33f99e2/hdx_python_utilities-3.9.2.tar.gz", hash = "sha256:de39248afdca00ab636fdfa0c3259fa80e4b95dba026170a4efc5bee14eda3f3", size = 656826, upload_time = "2025-09-21T23:14:17.457Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/6d/06994f86c2cc172b5ea127dedbb19e809205e06b1ba7532e2f0aea5631cd/hdx_python_utilities-3.9.2-py3-none-any.whl", hash = "sha256:fae3cc241420ae7ebb0a7a53cc8034c6851886396b2f0880685aba9045973111", size = 61187 }, + { url = "https://files.pythonhosted.org/packages/95/6d/06994f86c2cc172b5ea127dedbb19e809205e06b1ba7532e2f0aea5631cd/hdx_python_utilities-3.9.2-py3-none-any.whl", hash = "sha256:fae3cc241420ae7ebb0a7a53cc8034c6851886396b2f0880685aba9045973111", size = 61187, upload_time = "2025-09-21T23:14:15.588Z" }, ] [[package]] @@ -717,28 +739,28 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/aa1325331c320598ce60cc31060087681cd05123b6fb2a8a571e882b7f05/highspy-1.11.0.tar.gz", hash = "sha256:771e58c076122d207ff1b19759c21d3227f0da5b80dfd89a4145681524969cef", size = 1285415 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/ad/b54ad6740b950faab3b7f1465fbb5c740fc522928a8d9f01cac181f8f9a6/highspy-1.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28fffd3e733833a7b2569df6761088046e8aca868ab328828711dbe15b102ad4", size = 2232856 }, - { url = "https://files.pythonhosted.org/packages/a3/0c/3921a207f47d52abc81a9d00d8f4d579b05b85670e23bc7140e39268490d/highspy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20a3adf8820a5f7a9cee6fc76df625e651ecfd8b5898af2a77042e79269ce0bc", size = 1908641 }, - { url = "https://files.pythonhosted.org/packages/0a/b6/ea7ea6c4c3f781b007fe928b2aefa40c49287b4689985d04c3b20d383475/highspy-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d4bc0a84cf613bb8565f9b5f610eb0655384162f509b5d86f9c888570275fdc", size = 2119574 }, - { url = "https://files.pythonhosted.org/packages/ff/0c/94f1ccb6606e8445a7a0c68d983e47f64899582c64fcea651f488eaaaea0/highspy-1.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:543789b75c396a904cb550de34eb333f1a184e123dadc9903b5e6dbca18a007b", size = 2441487 }, - { url = "https://files.pythonhosted.org/packages/ad/aa/e7c4ac05162187c484bb121f50d8e037c13bf894ed5cf4e781e1cff68762/highspy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23949e4f44b6df0ed8c387a7c733d683a0fa66e3ff15d65719979ce2099ee99", size = 2302302 }, - { url = "https://files.pythonhosted.org/packages/04/ce/fd2473bed635eb06d116f987767d5c5fe3c62b317fb1a788c31966d7fa0a/highspy-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50dacf300ebe7c4dca92891c0bf61b694f2ca744207cf7d0d24f2a30ffb5608c", size = 3101885 }, - { url = "https://files.pythonhosted.org/packages/6e/e1/bf174389656de5d302ed53dd5cdeb5f7e9ad84156ad2fc95d5a63ba023f2/highspy-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a782c242b4b047f86110787b0dafce9d77cc10f079adab1fd51c5331e5760127", size = 3647952 }, - { url = "https://files.pythonhosted.org/packages/f3/f5/42f6f2ce99c5b9d7aa864ac3abeaf8a2b66da707821ab42b0a31ec2a0dc1/highspy-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15b804387089a389e5f01b056a4b3ad74c7d1cf00ab00a0faaf3b4a582bb664c", size = 3309616 }, - { url = "https://files.pythonhosted.org/packages/47/f5/cf13640ed65ea934b45e0c3e786497f4696f286faf45e8e62579a0f15462/highspy-1.11.0-cp312-cp312-win32.whl", hash = "sha256:8c33f68df8ab9666d379b0d64d04775c0a9db31882d4f87b3ec8cece0003b47d", size = 1710641 }, - { url = "https://files.pythonhosted.org/packages/b7/2f/7acfea5b8d32b86bdec018f858bc195236b804a22a7cd3349da711498692/highspy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0aed8c80d33e2fc2eb1def75dbd34c9fa463acb589d19a5ed5dcc0178ae7062", size = 1985767 }, - { url = "https://files.pythonhosted.org/packages/96/84/3e899c5d95dc9d5400a308e0aaf4a5143f69016a4f46dd528ff7cd65d341/highspy-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f675cda73860c7c8a22546db3c80db985720baea84866b08a971cfa03cc7a156", size = 2232867 }, - { url = "https://files.pythonhosted.org/packages/74/e2/2853095a74e9fc2c2081340647be8edba7122696534ebbaf159ceb53f9b4/highspy-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7babebfc01b7682c69c95e0520614ec9400e10cec1b84d3fb7cd48535c606244", size = 1908601 }, - { url = "https://files.pythonhosted.org/packages/e6/36/3cabdd3ae8610912962bad96f4d4d6702255d6c01d050754e4050a9eaa4a/highspy-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39fb60d84d7a58e58f923ea6f0641e6978eb9049033b84de1a2add723e01cd3f", size = 2119726 }, - { url = "https://files.pythonhosted.org/packages/a9/da/200d3f13ca9ad3f9fc11a1f3f76cc2734de42dae064510365d42caeb5ed4/highspy-1.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c2e7cf4d504287cd8910de322a726d58428af43bb985d6bae602bf84a7454b9", size = 2441449 }, - { url = "https://files.pythonhosted.org/packages/6c/58/fc3775850dc668006039637a4f23f03a9c0eb533643c9d3a7370f9d63de2/highspy-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79682aa7855d94106ccbbb750082d156dcbb57dff9d489f167320ae0ce768867", size = 2302685 }, - { url = "https://files.pythonhosted.org/packages/b5/16/e13326a9706c407d32e39ad14aa79a696c1eb49bb13d50fde5d96afb02b5/highspy-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:65232aa496fb27be56cc85b2c7c785fac866107c32ea00cc38ec474d6a9f6494", size = 3102306 }, - { url = "https://files.pythonhosted.org/packages/0e/93/468e63b16d9bf123174e7f8f7b8bd5a2f96b18d7370a2cc35e6485871749/highspy-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f78f27e18275d3c7868dcd0314ea535ed361322e7f0817363872d75a4cc15abc", size = 3648234 }, - { url = "https://files.pythonhosted.org/packages/dc/c5/37b849a69c9cbccf533a9a51e309a49e83d704f06bf45370c2e78ceb15d4/highspy-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6156a7d643268456427b6fe310626ad9ee9d908ff812cc64ee8bad7b9872ea98", size = 3309724 }, - { url = "https://files.pythonhosted.org/packages/90/0f/89c579b2f718dc419fd76067a03ecb3c96e6919b7cffee1b9f5a2dfe4f56/highspy-1.11.0-cp313-cp313-win32.whl", hash = "sha256:e61facebb0127eb3661db79a11c7665e47229ec63d2b425996d04aeede26d46b", size = 1710676 }, - { url = "https://files.pythonhosted.org/packages/20/ca/ba2af91f2418bee0d0e99df71dcd171ca863675de6a5260bbf06c120f084/highspy-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ceac08be37f75dc0af95669a0cfb073e5db5f07ead05cdcc81fd4b4394708d53", size = 1985967 }, +sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/aa1325331c320598ce60cc31060087681cd05123b6fb2a8a571e882b7f05/highspy-1.11.0.tar.gz", hash = "sha256:771e58c076122d207ff1b19759c21d3227f0da5b80dfd89a4145681524969cef", size = 1285415, upload_time = "2025-06-06T00:47:22.562Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/ad/b54ad6740b950faab3b7f1465fbb5c740fc522928a8d9f01cac181f8f9a6/highspy-1.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28fffd3e733833a7b2569df6761088046e8aca868ab328828711dbe15b102ad4", size = 2232856, upload_time = "2025-06-06T00:46:11.161Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0c/3921a207f47d52abc81a9d00d8f4d579b05b85670e23bc7140e39268490d/highspy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20a3adf8820a5f7a9cee6fc76df625e651ecfd8b5898af2a77042e79269ce0bc", size = 1908641, upload_time = "2025-06-06T00:46:12.706Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/ea7ea6c4c3f781b007fe928b2aefa40c49287b4689985d04c3b20d383475/highspy-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d4bc0a84cf613bb8565f9b5f610eb0655384162f509b5d86f9c888570275fdc", size = 2119574, upload_time = "2025-06-06T00:46:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0c/94f1ccb6606e8445a7a0c68d983e47f64899582c64fcea651f488eaaaea0/highspy-1.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:543789b75c396a904cb550de34eb333f1a184e123dadc9903b5e6dbca18a007b", size = 2441487, upload_time = "2025-06-06T00:46:16.286Z" }, + { url = "https://files.pythonhosted.org/packages/ad/aa/e7c4ac05162187c484bb121f50d8e037c13bf894ed5cf4e781e1cff68762/highspy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23949e4f44b6df0ed8c387a7c733d683a0fa66e3ff15d65719979ce2099ee99", size = 2302302, upload_time = "2025-06-06T00:46:18.819Z" }, + { url = "https://files.pythonhosted.org/packages/04/ce/fd2473bed635eb06d116f987767d5c5fe3c62b317fb1a788c31966d7fa0a/highspy-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50dacf300ebe7c4dca92891c0bf61b694f2ca744207cf7d0d24f2a30ffb5608c", size = 3101885, upload_time = "2025-06-06T00:46:20.774Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e1/bf174389656de5d302ed53dd5cdeb5f7e9ad84156ad2fc95d5a63ba023f2/highspy-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a782c242b4b047f86110787b0dafce9d77cc10f079adab1fd51c5331e5760127", size = 3647952, upload_time = "2025-06-06T00:46:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f5/42f6f2ce99c5b9d7aa864ac3abeaf8a2b66da707821ab42b0a31ec2a0dc1/highspy-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15b804387089a389e5f01b056a4b3ad74c7d1cf00ab00a0faaf3b4a582bb664c", size = 3309616, upload_time = "2025-06-06T00:46:24.888Z" }, + { url = "https://files.pythonhosted.org/packages/47/f5/cf13640ed65ea934b45e0c3e786497f4696f286faf45e8e62579a0f15462/highspy-1.11.0-cp312-cp312-win32.whl", hash = "sha256:8c33f68df8ab9666d379b0d64d04775c0a9db31882d4f87b3ec8cece0003b47d", size = 1710641, upload_time = "2025-06-06T00:46:26.462Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2f/7acfea5b8d32b86bdec018f858bc195236b804a22a7cd3349da711498692/highspy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0aed8c80d33e2fc2eb1def75dbd34c9fa463acb589d19a5ed5dcc0178ae7062", size = 1985767, upload_time = "2025-06-06T00:46:28.144Z" }, + { url = "https://files.pythonhosted.org/packages/96/84/3e899c5d95dc9d5400a308e0aaf4a5143f69016a4f46dd528ff7cd65d341/highspy-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f675cda73860c7c8a22546db3c80db985720baea84866b08a971cfa03cc7a156", size = 2232867, upload_time = "2025-06-06T00:46:29.651Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/2853095a74e9fc2c2081340647be8edba7122696534ebbaf159ceb53f9b4/highspy-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7babebfc01b7682c69c95e0520614ec9400e10cec1b84d3fb7cd48535c606244", size = 1908601, upload_time = "2025-06-06T00:46:31.232Z" }, + { url = "https://files.pythonhosted.org/packages/e6/36/3cabdd3ae8610912962bad96f4d4d6702255d6c01d050754e4050a9eaa4a/highspy-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39fb60d84d7a58e58f923ea6f0641e6978eb9049033b84de1a2add723e01cd3f", size = 2119726, upload_time = "2025-06-06T00:46:32.796Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/200d3f13ca9ad3f9fc11a1f3f76cc2734de42dae064510365d42caeb5ed4/highspy-1.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c2e7cf4d504287cd8910de322a726d58428af43bb985d6bae602bf84a7454b9", size = 2441449, upload_time = "2025-06-06T00:46:35.147Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/fc3775850dc668006039637a4f23f03a9c0eb533643c9d3a7370f9d63de2/highspy-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79682aa7855d94106ccbbb750082d156dcbb57dff9d489f167320ae0ce768867", size = 2302685, upload_time = "2025-06-06T00:46:36.791Z" }, + { url = "https://files.pythonhosted.org/packages/b5/16/e13326a9706c407d32e39ad14aa79a696c1eb49bb13d50fde5d96afb02b5/highspy-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:65232aa496fb27be56cc85b2c7c785fac866107c32ea00cc38ec474d6a9f6494", size = 3102306, upload_time = "2025-06-06T00:46:38.341Z" }, + { url = "https://files.pythonhosted.org/packages/0e/93/468e63b16d9bf123174e7f8f7b8bd5a2f96b18d7370a2cc35e6485871749/highspy-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f78f27e18275d3c7868dcd0314ea535ed361322e7f0817363872d75a4cc15abc", size = 3648234, upload_time = "2025-06-06T00:46:40.895Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c5/37b849a69c9cbccf533a9a51e309a49e83d704f06bf45370c2e78ceb15d4/highspy-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6156a7d643268456427b6fe310626ad9ee9d908ff812cc64ee8bad7b9872ea98", size = 3309724, upload_time = "2025-06-06T00:46:43.083Z" }, + { url = "https://files.pythonhosted.org/packages/90/0f/89c579b2f718dc419fd76067a03ecb3c96e6919b7cffee1b9f5a2dfe4f56/highspy-1.11.0-cp313-cp313-win32.whl", hash = "sha256:e61facebb0127eb3661db79a11c7665e47229ec63d2b425996d04aeede26d46b", size = 1710676, upload_time = "2025-06-06T00:46:45.132Z" }, + { url = "https://files.pythonhosted.org/packages/20/ca/ba2af91f2418bee0d0e99df71dcd171ca863675de6a5260bbf06c120f084/highspy-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ceac08be37f75dc0af95669a0cfb073e5db5f07ead05cdcc81fd4b4394708d53", size = 1985967, upload_time = "2025-06-06T00:46:46.767Z" }, ] [[package]] @@ -746,99 +768,100 @@ name = "htmlmin2" version = "0.1.13" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486 }, + { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, ] [[package]] name = "humanize" version = "4.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884 } +sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884, upload_time = "2025-08-25T09:39:20.04Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869, upload_time = "2025-08-25T09:39:18.54Z" }, ] [[package]] name = "identify" version = "2.6.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283 } +sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload_time = "2025-09-06T19:30:52.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172 }, + { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload_time = "2025-09-06T19:30:51.759Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "ijson" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212 }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175 }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011 }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094 }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903 }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339 }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383 }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580 }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280 }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512 }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081 }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216 }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170 }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013 }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564 }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917 }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897 }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711 }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691 }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738 }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512 }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074 }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694 }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390 }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140 }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739 }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338 }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515 }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081 }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253 }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816 }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760 }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948 }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, ] [[package]] name = "imf-reader" -version = "1.3.0" +version = "1.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, { name = "chardet" }, + { name = "diskcache" }, { name = "pandas" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/45/24521d229aec5c058d998510794567788bc7b1b764dfaa02fb8e0aeda4b7/imf_reader-1.3.0.tar.gz", hash = "sha256:3f3130dd793a112fdd5913a7c7b733847a5a07fd70dee14d57624ae4e021a141", size = 12990 } +sdist = { url = "https://files.pythonhosted.org/packages/16/5a/c8bc268ae5b6dbab4db01d92f9d34713a7c487bc85f2522173cf24bc5c74/imf_reader-1.4.1.tar.gz", hash = "sha256:2584e45485b539cd2d15bf0a785e6ac5f29775c042d9d5f83c7af5d5f0947c0b", size = 13271, upload_time = "2025-12-05T11:41:01.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/5b/3a063116950f2aa2b450120e78162bb5b87098dde3b75ae90210c6f2c099/imf_reader-1.3.0-py3-none-any.whl", hash = "sha256:3515c6644dfef44d5fda89f5bb3786b4f83da20f49184911f0df2386782106f1", size = 16520 }, + { url = "https://files.pythonhosted.org/packages/c1/79/97bd7b6c3af609b33ba2d787ea9e06ad93b1deca38388a345b6c913825ea/imf_reader-1.4.1-py3-none-any.whl", hash = "sha256:16c0dafcbe0e6630e7d3adbccb81e828b3e971b79e3969b79fbd6772151165c5", size = 19285, upload_time = "2025-12-05T11:41:00.218Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, ] [[package]] @@ -860,9 +883,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/76/11082e338e0daadc89c8ff866185de11daf67d181901038f9e139d109761/ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b", size = 166260 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/76/11082e338e0daadc89c8ff866185de11daf67d181901038f9e139d109761/ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b", size = 166260, upload_time = "2025-08-04T15:47:35.018Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/c7/b445faca8deb954fe536abebff4ece5b097b923de482b26e78448c89d1dd/ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4", size = 117484 }, + { url = "https://files.pythonhosted.org/packages/fc/c7/b445faca8deb954fe536abebff4ece5b097b923de482b26e78448c89d1dd/ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4", size = 117484, upload_time = "2025-08-04T15:47:32.622Z" }, ] [[package]] @@ -881,9 +904,9 @@ dependencies = [ { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137 } +sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137, upload_time = "2025-08-29T12:15:21.519Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2a/5628a99d04acb2d2f2e749cdf4ea571d2575e898df0528a090948018b726/ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72", size = 612426 }, + { url = "https://files.pythonhosted.org/packages/08/2a/5628a99d04acb2d2f2e749cdf4ea571d2575e898df0528a090948018b726/ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72", size = 612426, upload_time = "2025-08-29T12:15:18.866Z" }, ] [[package]] @@ -893,18 +916,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, ] [[package]] @@ -914,9 +937,9 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload_time = "2024-11-11T01:41:40.175Z" }, ] [[package]] @@ -926,25 +949,25 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "joblib" version = "1.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload_time = "2025-08-27T12:15:46.575Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396 }, + { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload_time = "2025-08-27T12:15:45.188Z" }, ] [[package]] name = "jsmin" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } [[package]] name = "jsonlines" @@ -953,9 +976,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359 } +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701 }, + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, ] [[package]] @@ -965,9 +988,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105 }, + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, ] [[package]] @@ -980,9 +1003,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342 } +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload_time = "2025-08-18T17:03:50.038Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040 }, + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload_time = "2025-08-18T17:03:48.373Z" }, ] [[package]] @@ -992,9 +1015,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855 } +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload_time = "2025-09-08T01:34:59.186Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437 }, + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload_time = "2025-09-08T01:34:57.871Z" }, ] [[package]] @@ -1008,9 +1031,9 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload_time = "2024-09-17T10:44:15.218Z" }, ] [[package]] @@ -1022,18 +1045,18 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload_time = "2025-05-27T07:38:16.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, ] [[package]] name = "jupyterlab-pygments" version = "0.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload_time = "2023-11-23T09:26:37.44Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload_time = "2023-11-23T09:26:34.325Z" }, ] [[package]] @@ -1047,9 +1070,9 @@ dependencies = [ { name = "packaging" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/14/41faf71e168fcc6c48268f0fc67ba0d6acf6ee4e2c5c785c2bccb967c29d/jupytext-1.17.3.tar.gz", hash = "sha256:8b6dae76d63c95cad47b493c38f0d9c74491fb621dcd0980abfcac4c8f168679", size = 3753151 } +sdist = { url = "https://files.pythonhosted.org/packages/15/14/41faf71e168fcc6c48268f0fc67ba0d6acf6ee4e2c5c785c2bccb967c29d/jupytext-1.17.3.tar.gz", hash = "sha256:8b6dae76d63c95cad47b493c38f0d9c74491fb621dcd0980abfcac4c8f168679", size = 3753151, upload_time = "2025-08-28T18:30:51.117Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-py3-none-any.whl", hash = "sha256:09b0a94cd904416e823a5ba9f41bd181031215b6fc682d2b5c18e68354feb17c", size = 166548 }, + { url = "https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-py3-none-any.whl", hash = "sha256:09b0a94cd904416e823a5ba9f41bd181031215b6fc682d2b5c18e68354feb17c", size = 166548, upload_time = "2025-08-28T18:30:47.733Z" }, ] [[package]] @@ -1068,7 +1091,7 @@ dependencies = [ { name = "wheel" }, { name = "xlrd3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736 } +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } [[package]] name = "license-expression" @@ -1077,9 +1100,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402 } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload_time = "2025-07-22T11:13:32.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615 }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, ] [[package]] @@ -1090,98 +1113,98 @@ dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, ] [[package]] name = "lxml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887 }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818 }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807 }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179 }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044 }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685 }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127 }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958 }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541 }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426 }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917 }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795 }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759 }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666 }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989 }, - { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456 }, - { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793 }, - { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836 }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494 }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146 }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932 }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060 }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000 }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496 }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779 }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072 }, - { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675 }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171 }, - { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175 }, - { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688 }, - { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655 }, - { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695 }, - { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841 }, - { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700 }, - { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347 }, - { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248 }, - { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801 }, - { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403 }, - { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974 }, - { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953 }, - { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054 }, - { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421 }, - { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684 }, - { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463 }, - { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437 }, - { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890 }, - { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185 }, - { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895 }, - { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246 }, - { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797 }, - { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404 }, - { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072 }, - { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617 }, - { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930 }, - { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380 }, - { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632 }, - { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171 }, - { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109 }, - { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061 }, - { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233 }, - { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739 }, - { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119 }, - { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665 }, - { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997 }, - { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957 }, - { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372 }, - { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653 }, - { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795 }, - { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023 }, - { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420 }, - { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837 }, - { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205 }, +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload_time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload_time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload_time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload_time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload_time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload_time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload_time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload_time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload_time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload_time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload_time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload_time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload_time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload_time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload_time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload_time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload_time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload_time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload_time = "2025-09-22T04:01:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload_time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload_time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload_time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload_time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload_time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload_time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload_time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload_time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload_time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload_time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload_time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload_time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload_time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload_time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload_time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload_time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload_time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload_time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload_time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload_time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload_time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload_time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload_time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload_time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload_time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload_time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload_time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload_time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload_time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload_time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload_time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload_time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload_time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload_time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload_time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload_time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload_time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload_time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload_time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload_time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload_time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload_time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload_time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload_time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload_time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload_time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload_time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload_time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload_time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload_time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload_time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload_time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload_time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload_time = "2025-09-22T04:03:36.249Z" }, ] [[package]] name = "markdown" version = "3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585 } +sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload_time = "2025-09-04T20:25:22.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441 }, + { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload_time = "2025-09-04T20:25:21.784Z" }, ] [[package]] @@ -1191,56 +1214,56 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070 } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload_time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321 }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload_time = "2025-08-11T12:57:51.923Z" }, ] [[package]] name = "marko" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/6a/32545d2379822fb9a8843f01150011402888492541977a1193fe8d695df0/marko-2.2.0.tar.gz", hash = "sha256:213c146ba197c1d6bcb06ae3658b7d87e45f6def35c09905b86aa6bb1984eba6", size = 143406 } +sdist = { url = "https://files.pythonhosted.org/packages/9c/6a/32545d2379822fb9a8843f01150011402888492541977a1193fe8d695df0/marko-2.2.0.tar.gz", hash = "sha256:213c146ba197c1d6bcb06ae3658b7d87e45f6def35c09905b86aa6bb1984eba6", size = 143406, upload_time = "2025-08-08T09:47:05.396Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/b1/87f54d8842b2aafdbb162301ac730587e04f30ad0fe9aabb12fa29f7a6f7/marko-2.2.0-py3-none-any.whl", hash = "sha256:d84f867429142627e896322c8ef167664f3a6cd6ea5a2b70c6af055998041bb7", size = 42683 }, + { url = "https://files.pythonhosted.org/packages/94/b1/87f54d8842b2aafdbb162301ac730587e04f30ad0fe9aabb12fa29f7a6f7/marko-2.2.0-py3-none-any.whl", hash = "sha256:d84f867429142627e896322c8ef167664f3a6cd6ea5a2b70c6af055998041bb7", size = 42683, upload_time = "2025-08-08T09:47:04.175Z" }, ] [[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/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 }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -1250,9 +1273,9 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, ] [[package]] @@ -1262,36 +1285,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload_time = "2025-08-11T07:25:49.083Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205 }, + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload_time = "2025-08-11T07:25:47.597Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload_time = "2021-02-05T18:55:30.623Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload_time = "2021-02-05T18:55:29.583Z" }, ] [[package]] name = "mistune" version = "3.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload_time = "2025-08-29T07:20:43.594Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481 }, + { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload_time = "2025-08-29T07:20:42.218Z" }, ] [[package]] @@ -1313,9 +1336,9 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload_time = "2024-08-30T12:24:06.899Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload_time = "2024-08-30T12:24:05.054Z" }, ] [[package]] @@ -1325,9 +1348,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012 } +sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012, upload_time = "2024-08-25T12:50:09.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790 }, + { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790, upload_time = "2024-08-25T12:50:08.151Z" }, ] [[package]] @@ -1337,9 +1360,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375 } +sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload_time = "2023-08-04T14:42:25.67Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235 }, + { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload_time = "2023-08-04T14:42:23.955Z" }, ] [[package]] @@ -1351,9 +1374,9 @@ dependencies = [ { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425 } +sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload_time = "2025-08-26T14:23:17.223Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034 }, + { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload_time = "2025-08-26T14:23:15.906Z" }, ] [[package]] @@ -1364,7 +1387,7 @@ dependencies = [ { name = "mkdocs" }, { name = "pygtrie" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/3b/490d1b51fba7da69394e5a17f2c081eb65a10fb73565dc6793d53e4e4206/mkdocs-ezlinks-plugin-0.1.14.tar.gz", hash = "sha256:3e2085c16a850e022393e80194c17612e7b55de87fb45b3ffb618b5dfdb10811", size = 13366 } +sdist = { url = "https://files.pythonhosted.org/packages/9a/3b/490d1b51fba7da69394e5a17f2c081eb65a10fb73565dc6793d53e4e4206/mkdocs-ezlinks-plugin-0.1.14.tar.gz", hash = "sha256:3e2085c16a850e022393e80194c17612e7b55de87fb45b3ffb618b5dfdb10811", size = 13366, upload_time = "2022-01-24T20:10:30.91Z" } [[package]] name = "mkdocs-get-deps" @@ -1375,9 +1398,9 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload_time = "2023-11-20T17:51:09.981Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload_time = "2023-11-20T17:51:08.587Z" }, ] [[package]] @@ -1388,9 +1411,9 @@ dependencies = [ { name = "mkdocs" }, { name = "pygithub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/88/e724563e9ff1b119869ef0704157caa8d7b9b9b4a8a8faf8120aa01620e2/mkdocs-git-committers-plugin-0.2.3.tar.gz", hash = "sha256:77188d8aacc11d5233d6949435670e3d6545ffb7a0e274d56f32ed3984353c61", size = 5379 } +sdist = { url = "https://files.pythonhosted.org/packages/c6/88/e724563e9ff1b119869ef0704157caa8d7b9b9b4a8a8faf8120aa01620e2/mkdocs-git-committers-plugin-0.2.3.tar.gz", hash = "sha256:77188d8aacc11d5233d6949435670e3d6545ffb7a0e274d56f32ed3984353c61", size = 5379, upload_time = "2023-11-06T17:13:30.207Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/56/15fdbb6afa718a6c9de626bd11672040832ba547c03daf205e295be4e0d4/mkdocs_git_committers_plugin-0.2.3-py3-none-any.whl", hash = "sha256:4ca79efb7e61a72652d3512d61af5c40a4572e36667e1a00032aad524250780d", size = 4340 }, + { url = "https://files.pythonhosted.org/packages/81/56/15fdbb6afa718a6c9de626bd11672040832ba547c03daf205e295be4e0d4/mkdocs_git_committers_plugin-0.2.3-py3-none-any.whl", hash = "sha256:4ca79efb7e61a72652d3512d61af5c40a4572e36667e1a00032aad524250780d", size = 4340, upload_time = "2023-11-06T17:13:28.979Z" }, ] [[package]] @@ -1403,9 +1426,9 @@ dependencies = [ { name = "mkdocs" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload_time = "2025-05-28T18:26:20.697Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382 }, + { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload_time = "2025-05-28T18:26:18.907Z" }, ] [[package]] @@ -1420,9 +1443,9 @@ dependencies = [ { name = "nbconvert" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747, upload_time = "2024-10-15T14:56:32.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197 }, + { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197, upload_time = "2024-10-15T14:56:29.854Z" }, ] [[package]] @@ -1443,18 +1466,18 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/ee/6ed7fc739bd7591485c8bec67d5984508d3f2733e708f32714c21593341a/mkdocs_material-9.6.20.tar.gz", hash = "sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790", size = 4037822 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/ee/6ed7fc739bd7591485c8bec67d5984508d3f2733e708f32714c21593341a/mkdocs_material-9.6.20.tar.gz", hash = "sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790", size = 4037822, upload_time = "2025-09-15T08:48:01.816Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d8/a31dd52e657bf12b20574706d07df8d767e1ab4340f9bfb9ce73950e5e59/mkdocs_material-9.6.20-py3-none-any.whl", hash = "sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82", size = 9193367 }, + { url = "https://files.pythonhosted.org/packages/67/d8/a31dd52e657bf12b20574706d07df8d767e1ab4340f9bfb9ce73950e5e59/mkdocs_material-9.6.20-py3-none-any.whl", hash = "sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82", size = 9193367, upload_time = "2025-09-15T08:47:58.722Z" }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload_time = "2023-11-22T19:09:45.208Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload_time = "2023-11-22T19:09:43.465Z" }, ] [[package]] @@ -1467,9 +1490,9 @@ dependencies = [ { name = "jsmin" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366 } +sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366, upload_time = "2024-01-29T16:11:32.982Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723 }, + { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723, upload_time = "2024-01-29T16:11:31.851Z" }, ] [[package]] @@ -1479,9 +1502,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791, upload_time = "2024-11-18T13:15:13.977Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717 }, + { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717, upload_time = "2024-11-18T13:15:12.286Z" }, ] [[package]] @@ -1491,9 +1514,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162, upload_time = "2024-11-07T14:57:21.109Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142 }, + { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142, upload_time = "2024-11-07T14:57:19.143Z" }, ] [[package]] @@ -1506,9 +1529,9 @@ dependencies = [ { name = "pyyaml" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510, upload_time = "2024-08-29T14:08:09.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564 }, + { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564, upload_time = "2024-08-29T14:08:07.367Z" }, ] [[package]] @@ -1519,9 +1542,9 @@ dependencies = [ { name = "lxml" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633 } +sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633, upload_time = "2023-03-17T17:36:43.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570 }, + { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570, upload_time = "2023-03-17T17:36:40.776Z" }, ] [[package]] @@ -1536,9 +1559,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350 } +sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350, upload_time = "2025-09-19T10:49:26.446Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704 }, + { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704, upload_time = "2025-09-19T10:49:24.805Z" }, ] [[package]] @@ -1550,9 +1573,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972 } +sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972, upload_time = "2025-08-28T16:11:19.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215 }, + { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215, upload_time = "2025-08-28T16:11:18.176Z" }, ] [[package]] @@ -1564,36 +1587,36 @@ dependencies = [ { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273 }, - { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910 }, - { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585 }, - { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562 }, - { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296 }, - { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828 }, - { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728 }, - { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758 }, - { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342 }, - { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709 }, - { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806 }, - { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262 }, - { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775 }, - { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852 }, - { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242 }, - { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683 }, - { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749 }, - { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959 }, - { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367 }, +sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload_time = "2025-09-19T00:11:10.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload_time = "2025-09-19T00:10:58.321Z" }, + { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload_time = "2025-09-19T00:10:20.043Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload_time = "2025-09-19T00:10:33.005Z" }, + { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload_time = "2025-09-19T00:10:11.51Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload_time = "2025-09-19T00:10:06.568Z" }, + { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload_time = "2025-09-19T00:10:28.203Z" }, + { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload_time = "2025-09-19T00:10:01.33Z" }, + { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload_time = "2025-09-19T00:10:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload_time = "2025-09-19T00:11:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload_time = "2025-09-19T00:11:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload_time = "2025-09-19T00:10:26.073Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload_time = "2025-09-19T00:10:40.035Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload_time = "2025-09-19T00:10:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload_time = "2025-09-19T00:10:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload_time = "2025-09-19T00:11:07.955Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload_time = "2025-09-19T00:09:55.572Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload_time = "2025-09-19T00:10:44.827Z" }, + { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload_time = "2025-09-19T00:10:37.344Z" }, + { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload_time = "2025-09-19T00:10:15.489Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, ] [[package]] @@ -1606,9 +1629,9 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload_time = "2024-12-19T10:32:27.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload_time = "2024-12-19T10:32:24.139Z" }, ] [[package]] @@ -1631,9 +1654,9 @@ dependencies = [ { name = "pygments" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715 } +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload_time = "2025-01-28T09:29:14.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525 }, + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload_time = "2025-01-28T09:29:12.551Z" }, ] [[package]] @@ -1646,115 +1669,118 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload_time = "2024-04-04T11:20:37.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload_time = "2024-04-04T11:20:34.895Z" }, ] [[package]] name = "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 } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload_time = "2024-01-21T14:25:19.227Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload_time = "2024-01-21T14:25:17.223Z" }, ] [[package]] name = "networkx" version = "3.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload_time = "2025-05-29T11:35:07.804Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406 }, + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload_time = "2025-05-29T11:35:04.961Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload_time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload_time = "2024-06-04T18:44:08.352Z" }, ] [[package]] name = "numpy" version = "2.3.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014 }, - { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220 }, - { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918 }, - { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922 }, - { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991 }, - { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643 }, - { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787 }, - { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598 }, - { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800 }, - { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615 }, - { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936 }, - { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588 }, - { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802 }, - { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537 }, - { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743 }, - { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881 }, - { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301 }, - { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645 }, - { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179 }, - { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250 }, - { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269 }, - { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314 }, - { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025 }, - { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053 }, - { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444 }, - { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039 }, - { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314 }, - { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722 }, - { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755 }, - { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560 }, - { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776 }, - { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281 }, - { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275 }, - { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527 }, - { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159 }, - { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624 }, - { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627 }, - { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926 }, - { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958 }, - { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920 }, - { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076 }, - { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952 }, - { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322 }, - { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630 }, - { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987 }, - { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076 }, - { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491 }, - { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913 }, - { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811 }, - { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689 }, - { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855 }, - { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520 }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371 }, - { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576 }, - { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953 }, +sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload_time = "2025-09-09T16:54:12.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload_time = "2025-09-09T15:56:29.966Z" }, + { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload_time = "2025-09-09T15:56:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload_time = "2025-09-09T15:56:34.175Z" }, + { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload_time = "2025-09-09T15:56:36.149Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload_time = "2025-09-09T15:56:40.548Z" }, + { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload_time = "2025-09-09T15:56:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload_time = "2025-09-09T15:56:46.141Z" }, + { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload_time = "2025-09-09T15:56:49.844Z" }, + { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800, upload_time = "2025-09-09T15:56:52.499Z" }, + { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615, upload_time = "2025-09-09T15:56:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936, upload_time = "2025-09-09T15:56:56.541Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload_time = "2025-09-09T15:56:59.087Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload_time = "2025-09-09T15:57:01.73Z" }, + { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload_time = "2025-09-09T15:57:03.765Z" }, + { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload_time = "2025-09-09T15:57:07.921Z" }, + { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload_time = "2025-09-09T15:57:11.349Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload_time = "2025-09-09T15:57:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload_time = "2025-09-09T15:57:16.534Z" }, + { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload_time = "2025-09-09T15:57:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250, upload_time = "2025-09-09T15:57:21.296Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269, upload_time = "2025-09-09T15:57:23.034Z" }, + { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314, upload_time = "2025-09-09T15:57:25.045Z" }, + { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload_time = "2025-09-09T15:57:27.257Z" }, + { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload_time = "2025-09-09T15:57:30.077Z" }, + { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload_time = "2025-09-09T15:57:32.733Z" }, + { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload_time = "2025-09-09T15:57:34.328Z" }, + { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload_time = "2025-09-09T15:57:36.255Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload_time = "2025-09-09T15:57:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload_time = "2025-09-09T15:57:41.16Z" }, + { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload_time = "2025-09-09T15:57:43.459Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776, upload_time = "2025-09-09T15:57:45.793Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281, upload_time = "2025-09-09T15:57:47.492Z" }, + { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275, upload_time = "2025-09-09T15:57:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload_time = "2025-09-09T15:57:52.006Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload_time = "2025-09-09T15:57:54.407Z" }, + { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload_time = "2025-09-09T15:57:56.5Z" }, + { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload_time = "2025-09-09T15:57:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload_time = "2025-09-09T15:58:00.035Z" }, + { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload_time = "2025-09-09T15:58:02.738Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload_time = "2025-09-09T15:58:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload_time = "2025-09-09T15:58:07.745Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload_time = "2025-09-09T15:58:10.096Z" }, + { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload_time = "2025-09-09T15:58:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload_time = "2025-09-09T15:58:14.64Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload_time = "2025-09-09T15:58:16.889Z" }, + { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload_time = "2025-09-09T15:58:20.343Z" }, + { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload_time = "2025-09-09T15:58:22.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload_time = "2025-09-09T15:58:24.569Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload_time = "2025-09-09T15:58:26.416Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload_time = "2025-09-09T15:58:28.831Z" }, + { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload_time = "2025-09-09T15:58:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload_time = "2025-09-09T15:58:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload_time = "2025-09-09T15:58:36.04Z" }, + { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload_time = "2025-09-09T15:58:37.927Z" }, + { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload_time = "2025-09-09T15:58:40.576Z" }, ] [[package]] name = "oda-reader" -version = "1.2.2" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "filelock" }, { name = "joblib" }, { name = "openpyxl" }, { name = "pandas" }, + { name = "platformdirs" }, { name = "pyarrow" }, { name = "requests" }, + { name = "requests-cache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/d1/5c0bb2a714ebea7df131b8e87010eab39d0df75878f6785f2a214ff66bb2/oda_reader-1.2.2.tar.gz", hash = "sha256:55be081e1744e75184eca3d09e794fad71958201d08b48fb497aac97a95f3685", size = 35630 } +sdist = { url = "https://files.pythonhosted.org/packages/32/b9/4ac1d7304001bf702d4835beeea0ef3a6fb60c8034ecb047c3141b2624ba/oda_reader-1.3.1.tar.gz", hash = "sha256:2201595bffbe72f7719e0f362db36a0a40968be252adefbe932f2fd284f5cf17", size = 43135, upload_time = "2025-10-27T14:10:45.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/ec/59338ec9108848dc53f50e7381b9817595bf98f414f4a732100a06828a3b/oda_reader-1.2.2-py3-none-any.whl", hash = "sha256:7f7b854ab1e9bc2cf64b6c63bd56a2ac64cb90ec054518fd01b741fd518cf007", size = 45314 }, + { url = "https://files.pythonhosted.org/packages/55/e8/abbd6b6fb8678adc0d83d0c537a55e84b1798fd3322d3e6edc9acc7a9dd8/oda_reader-1.3.1-py3-none-any.whl", hash = "sha256:57c8fbe5dda303689fb538f01fb0735e34f733547ccc24665f2632a67b93814d", size = 59216, upload_time = "2025-10-27T14:10:44.832Z" }, ] [[package]] @@ -1764,27 +1790,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "et-xmlfile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 } +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 }, + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "paginate" version = "0.5.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload_time = "2024-08-25T14:17:24.139Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload_time = "2024-08-25T14:17:22.55Z" }, ] [[package]] @@ -1797,64 +1823,80 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652 }, - { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686 }, - { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722 }, - { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803 }, - { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345 }, - { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314 }, - { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326 }, - { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061 }, - { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666 }, - { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835 }, - { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211 }, - { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277 }, - { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256 }, - { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579 }, - { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163 }, - { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860 }, - { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830 }, - { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216 }, - { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743 }, - { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141 }, +sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684, upload_time = "2025-08-21T10:28:29.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652, upload_time = "2025-08-21T10:27:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686, upload_time = "2025-08-21T10:27:18.486Z" }, + { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722, upload_time = "2025-08-21T10:27:21.149Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803, upload_time = "2025-08-21T10:27:23.767Z" }, + { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345, upload_time = "2025-08-21T10:27:26.6Z" }, + { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314, upload_time = "2025-08-21T10:27:29.213Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326, upload_time = "2025-08-21T10:27:31.901Z" }, + { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061, upload_time = "2025-08-21T10:27:34.647Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666, upload_time = "2025-08-21T10:27:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835, upload_time = "2025-08-21T10:27:40.188Z" }, + { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211, upload_time = "2025-08-21T10:27:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277, upload_time = "2025-08-21T10:27:45.474Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256, upload_time = "2025-08-21T10:27:49.885Z" }, + { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579, upload_time = "2025-08-21T10:28:08.435Z" }, + { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163, upload_time = "2025-08-21T10:27:52.232Z" }, + { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860, upload_time = "2025-08-21T10:27:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830, upload_time = "2025-08-21T10:27:56.957Z" }, + { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216, upload_time = "2025-08-21T10:27:59.302Z" }, + { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743, upload_time = "2025-08-21T10:28:02.447Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload_time = "2025-08-21T10:28:05.377Z" }, +] + +[[package]] +name = "pandera" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pydantic" }, + { name = "typeguard" }, + { name = "typing-extensions" }, + { name = "typing-inspect" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/9d/36af210c7cef275d646b8dded8cc555078a271514e34f8f8d1c056462dc3/pandera-0.27.0.tar.gz", hash = "sha256:83c66d5896b97b3a91c810621038d2495f56c83864493819e7587d2059e641ad", size = 567135, upload_time = "2025-11-25T16:20:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/26/8e4a28ffbf3406c60d58eaa7f0529fb6197f5ae49f77b173dc84c057e1a2/pandera-0.27.0-py3-none-any.whl", hash = "sha256:e43b8062dfcde984300d798686815cc93feaae09645d3cddee3ab437f2d11ed5", size = 295880, upload_time = "2025-11-25T16:20:33.635Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload_time = "2024-01-18T20:08:13.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload_time = "2024-01-18T20:08:11.28Z" }, ] [[package]] name = "parso" version = "0.8.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205 } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload_time = "2025-08-23T15:15:28.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668 }, + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload_time = "2025-08-23T15:15:25.663Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, ] [[package]] name = "petl" version = "1.7.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/07/16a40e30700f7c6975e62cba01c2f94afbb347dd8ed224a5918c686a47fe/petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b", size = 424376 } +sdist = { url = "https://files.pythonhosted.org/packages/a5/07/16a40e30700f7c6975e62cba01c2f94afbb347dd8ed224a5918c686a47fe/petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b", size = 424376, upload_time = "2025-07-10T20:47:13.523Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/5c/ea831abc18dd3268046d7d9a0119f1f8ddc69642e0a5245f839602b8114d/petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1", size = 233093 }, + { url = "https://files.pythonhosted.org/packages/9f/5c/ea831abc18dd3268046d7d9a0119f1f8ddc69642e0a5245f839602b8114d/petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1", size = 233093, upload_time = "2025-07-10T20:47:12.03Z" }, ] [[package]] @@ -1864,75 +1906,75 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, ] [[package]] name = "pillow" version = "11.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726 }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652 }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358 }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079 }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324 }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067 }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520 }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116 }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597 }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246 }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336 }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699 }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789 }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386 }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911 }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383 }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385 }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129 }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580 }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860 }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694 }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888 }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330 }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089 }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206 }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370 }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500 }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835 }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload_time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload_time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload_time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload_time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload_time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload_time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload_time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload_time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload_time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload_time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload_time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload_time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload_time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload_time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload_time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload_time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload_time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload_time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload_time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload_time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload_time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload_time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload_time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload_time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload_time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload_time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload_time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload_time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload_time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload_time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload_time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload_time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload_time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload_time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload_time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload_time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload_time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload_time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload_time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload_time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload_time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload_time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload_time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload_time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload_time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload_time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload_time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload_time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload_time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload_time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload_time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload_time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload_time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload_time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload_time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload_time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload_time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload_time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload_time = "2025-07-01T09:15:50.399Z" }, ] [[package]] @@ -1945,36 +1987,36 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/cb/e6ffaf3d019e8501b1264dac529bf829ac2f1fe1d488cfcf67f1fccadacf/pint-0.25.tar.gz", hash = "sha256:22911a30d682ee0540d656571c19a7b1806ce00b2be88a16f67218108b7b8cc2", size = 253010 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/cb/e6ffaf3d019e8501b1264dac529bf829ac2f1fe1d488cfcf67f1fccadacf/pint-0.25.tar.gz", hash = "sha256:22911a30d682ee0540d656571c19a7b1806ce00b2be88a16f67218108b7b8cc2", size = 253010, upload_time = "2025-08-15T19:49:12.72Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/cc/c528311d798e22ec884b816e8aa2989e0f1f28cdc8e5969e2be5f10bce85/pint-0.25-py3-none-any.whl", hash = "sha256:cc20ae3dff010b9bbea41fb80c2de008f683cc83512cea73633d55aead80aa1e", size = 305462 }, + { url = "https://files.pythonhosted.org/packages/76/cc/c528311d798e22ec884b816e8aa2989e0f1f28cdc8e5969e2be5f10bce85/pint-0.25-py3-none-any.whl", hash = "sha256:cc20ae3dff010b9bbea41fb80c2de008f683cc83512cea73633d55aead80aa1e", size = 305462, upload_time = "2025-08-15T19:49:11.083Z" }, ] [[package]] name = "platformdirs" -version = "4.4.0" +version = "4.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634 } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload_time = "2025-10-08T17:44:48.791Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654 }, + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload_time = "2025-10-08T17:44:47.223Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "ply" version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130 } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567 }, + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, ] [[package]] @@ -1988,9 +2030,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792 } +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload_time = "2025-08-09T18:56:14.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965 }, + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload_time = "2025-08-09T18:56:13.192Z" }, ] [[package]] @@ -2000,81 +2042,81 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload_time = "2025-08-27T15:24:02.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431 }, + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload_time = "2025-08-27T15:23:59.498Z" }, ] [[package]] name = "psutil" version = "7.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/31/4723d756b59344b643542936e37a31d1d3204bcdc42a7daa8ee9eb06fb50/psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2", size = 497660 } +sdist = { url = "https://files.pythonhosted.org/packages/b3/31/4723d756b59344b643542936e37a31d1d3204bcdc42a7daa8ee9eb06fb50/psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2", size = 497660, upload_time = "2025-09-17T20:14:52.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/62/ce4051019ee20ce0ed74432dd73a5bb087a6704284a470bb8adff69a0932/psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13", size = 245242 }, - { url = "https://files.pythonhosted.org/packages/38/61/f76959fba841bf5b61123fbf4b650886dc4094c6858008b5bf73d9057216/psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5", size = 246682 }, - { url = "https://files.pythonhosted.org/packages/88/7a/37c99d2e77ec30d63398ffa6a660450b8a62517cabe44b3e9bae97696e8d/psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3", size = 287994 }, - { url = "https://files.pythonhosted.org/packages/9d/de/04c8c61232f7244aa0a4b9a9fbd63a89d5aeaf94b2fc9d1d16e2faa5cbb0/psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3", size = 291163 }, - { url = "https://files.pythonhosted.org/packages/f4/58/c4f976234bf6d4737bc8c02a81192f045c307b72cf39c9e5c5a2d78927f6/psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d", size = 293625 }, - { url = "https://files.pythonhosted.org/packages/79/87/157c8e7959ec39ced1b11cc93c730c4fb7f9d408569a6c59dbd92ceb35db/psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca", size = 244812 }, - { url = "https://files.pythonhosted.org/packages/bf/e9/b44c4f697276a7a95b8e94d0e320a7bf7f3318521b23de69035540b39838/psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d", size = 247965 }, - { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971 }, + { url = "https://files.pythonhosted.org/packages/46/62/ce4051019ee20ce0ed74432dd73a5bb087a6704284a470bb8adff69a0932/psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13", size = 245242, upload_time = "2025-09-17T20:14:56.126Z" }, + { url = "https://files.pythonhosted.org/packages/38/61/f76959fba841bf5b61123fbf4b650886dc4094c6858008b5bf73d9057216/psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5", size = 246682, upload_time = "2025-09-17T20:14:58.25Z" }, + { url = "https://files.pythonhosted.org/packages/88/7a/37c99d2e77ec30d63398ffa6a660450b8a62517cabe44b3e9bae97696e8d/psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3", size = 287994, upload_time = "2025-09-17T20:14:59.901Z" }, + { url = "https://files.pythonhosted.org/packages/9d/de/04c8c61232f7244aa0a4b9a9fbd63a89d5aeaf94b2fc9d1d16e2faa5cbb0/psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3", size = 291163, upload_time = "2025-09-17T20:15:01.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/58/c4f976234bf6d4737bc8c02a81192f045c307b72cf39c9e5c5a2d78927f6/psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d", size = 293625, upload_time = "2025-09-17T20:15:04.492Z" }, + { url = "https://files.pythonhosted.org/packages/79/87/157c8e7959ec39ced1b11cc93c730c4fb7f9d408569a6c59dbd92ceb35db/psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca", size = 244812, upload_time = "2025-09-17T20:15:07.462Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e9/b44c4f697276a7a95b8e94d0e320a7bf7f3318521b23de69035540b39838/psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d", size = 247965, upload_time = "2025-09-17T20:15:09.673Z" }, + { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971, upload_time = "2025-09-17T20:15:12.262Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload_time = "2020-12-28T15:15:28.35Z" }, ] [[package]] name = "pure-eval" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload_time = "2024-07-21T12:58:21.801Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, ] [[package]] name = "pyarrow" version = "21.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305 }, - { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264 }, - { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099 }, - { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529 }, - { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883 }, - { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802 }, - { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175 }, - { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306 }, - { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622 }, - { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094 }, - { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576 }, - { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342 }, - { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218 }, - { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551 }, - { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064 }, - { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837 }, - { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158 }, - { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885 }, - { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625 }, - { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890 }, - { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006 }, +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload_time = "2025-07-18T00:57:31.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload_time = "2025-07-18T00:55:35.373Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload_time = "2025-07-18T00:55:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload_time = "2025-07-18T00:55:42.889Z" }, + { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload_time = "2025-07-18T00:55:47.069Z" }, + { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload_time = "2025-07-18T00:55:53.069Z" }, + { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload_time = "2025-07-18T00:55:57.714Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload_time = "2025-07-18T00:56:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload_time = "2025-07-18T00:56:04.42Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload_time = "2025-07-18T00:56:07.505Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload_time = "2025-07-18T00:56:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload_time = "2025-07-18T00:56:15.569Z" }, + { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload_time = "2025-07-18T00:56:19.531Z" }, + { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload_time = "2025-07-18T00:56:23.347Z" }, + { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload_time = "2025-07-18T00:56:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload_time = "2025-07-18T00:56:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload_time = "2025-07-18T00:56:33.935Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload_time = "2025-07-18T00:56:37.528Z" }, + { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload_time = "2025-07-18T00:56:41.483Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload_time = "2025-07-18T00:56:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload_time = "2025-07-18T00:56:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload_time = "2025-07-18T00:56:56.379Z" }, ] [[package]] name = "pycparser" version = "2.23" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload_time = "2025-09-09T13:23:47.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140 }, + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload_time = "2025-09-09T13:23:46.651Z" }, ] [[package]] @@ -2087,9 +2129,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495 } +sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload_time = "2025-09-13T11:26:39.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855 }, + { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855, upload_time = "2025-09-13T11:26:36.909Z" }, ] [[package]] @@ -2099,57 +2141,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, ] [[package]] name = "pydeflate" -version = "2.1.3" +version = "2.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "filelock" }, { name = "hdx-python-country" }, { name = "imf-reader" }, { name = "oda-reader" }, { name = "pandas" }, + { name = "pandera" }, + { name = "platformdirs" }, { name = "pyarrow" }, { name = "requests" }, { name = "wbgapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/72/3e56d8166ca4b366a4e37c85711a706bba66768f70ba690bdb279f728d8d/pydeflate-2.1.3.tar.gz", hash = "sha256:48a2b74ad900dd8c50dfb1e4cdfcea8ca11cbd2d3a713bf9208f2028fea4cf4f", size = 26586 } +sdist = { url = "https://files.pythonhosted.org/packages/09/cc/1661ca602d899247552cf851b3d48e95e152ce7ffd706f6c15afc918619c/pydeflate-2.3.3.tar.gz", hash = "sha256:298607a894cff9fb9786ba85924ff122fd72258b6802a6debf5ef66af1f33bf3", size = 39487, upload_time = "2025-12-07T09:41:36.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/31/e703ab5bc311c58e4dc00759d7a48a850877b8bbcd64c9778e2315e06bd5/pydeflate-2.1.3-py3-none-any.whl", hash = "sha256:09ebdde04eb2fea1c4b6712889cb2a9d4c2dd22ce0204aaeae64f4335667354f", size = 32540 }, + { url = "https://files.pythonhosted.org/packages/15/fc/52a47b29d97d22fec1289602fe65346dedfffbc797fe3df953f484641a31/pydeflate-2.3.3-py3-none-any.whl", hash = "sha256:a19448158bd5cc17848336391d8461f860421dbf75c984b4685e14b93e8b88f3", size = 54114, upload_time = "2025-12-07T09:41:37.803Z" }, ] [[package]] @@ -2163,36 +2208,36 @@ dependencies = [ { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/74/e560bdeffea72ecb26cff27f0fad548bbff5ecc51d6a155311ea7f9e4c4c/pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9", size = 2246994 } +sdist = { url = "https://files.pythonhosted.org/packages/c1/74/e560bdeffea72ecb26cff27f0fad548bbff5ecc51d6a155311ea7f9e4c4c/pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9", size = 2246994, upload_time = "2025-09-02T17:41:54.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/ba/7049ce39f653f6140aac4beb53a5aaf08b4407b6a3019aae394c1c5244ff/pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0", size = 432709 }, + { url = "https://files.pythonhosted.org/packages/07/ba/7049ce39f653f6140aac4beb53a5aaf08b4407b6a3019aae394c1c5244ff/pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0", size = 432709, upload_time = "2025-09-02T17:41:52.947Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, ] [[package]] name = "pygtrie" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/13/55deec25bf09383216fa7f1dfcdbfca40a04aa00b6d15a5cbf25af8fce5f/pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2", size = 39266 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/13/55deec25bf09383216fa7f1dfcdbfca40a04aa00b6d15a5cbf25af8fce5f/pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2", size = 39266, upload_time = "2022-07-16T14:29:47.459Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/cd/bd196b2cf014afb1009de8b0f05ecd54011d881944e62763f3c1b1e8ef37/pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16", size = 25099 }, + { url = "https://files.pythonhosted.org/packages/ec/cd/bd196b2cf014afb1009de8b0f05ecd54011d881944e62763f3c1b1e8ef37/pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16", size = 25099, upload_time = "2022-09-23T20:30:05.12Z" }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, ] [package.optional-dependencies] @@ -2208,9 +2253,9 @@ dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277 } +sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload_time = "2025-07-28T16:19:34.167Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178 }, + { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload_time = "2025-07-28T16:19:31.401Z" }, ] [[package]] @@ -2220,34 +2265,34 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/c6/a3124dee667a423f2c637cfd262a54d67d8ccf3e160f3c50f622a85b7723/pynacl-1.6.0.tar.gz", hash = "sha256:cb36deafe6e2bce3b286e5d1f3e1c246e0ccdb8808ddb4550bb2792f2df298f2", size = 3505641 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/24/1b639176401255605ba7c2b93a7b1eb1e379e0710eca62613633eb204201/pynacl-1.6.0-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:f46386c24a65383a9081d68e9c2de909b1834ec74ff3013271f1bca9c2d233eb", size = 384141 }, - { url = "https://files.pythonhosted.org/packages/5e/7b/874efdf57d6bf172db0df111b479a553c3d9e8bb4f1f69eb3ffff772d6e8/pynacl-1.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dea103a1afcbc333bc0e992e64233d360d393d1e63d0bc88554f572365664348", size = 808132 }, - { url = "https://files.pythonhosted.org/packages/f3/61/9b53f5913f3b75ac3d53170cdb897101b2b98afc76f4d9d3c8de5aa3ac05/pynacl-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:04f20784083014e265ad58c1b2dd562c3e35864b5394a14ab54f5d150ee9e53e", size = 1407253 }, - { url = "https://files.pythonhosted.org/packages/7c/0a/b138916b22bbf03a1bdbafecec37d714e7489dd7bcaf80cd17852f8b67be/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbcc4452a1eb10cd5217318c822fde4be279c9de8567f78bad24c773c21254f8", size = 843719 }, - { url = "https://files.pythonhosted.org/packages/01/3b/17c368197dfb2c817ce033f94605a47d0cc27901542109e640cef263f0af/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fed9fe1bec9e7ff9af31cd0abba179d0e984a2960c77e8e5292c7e9b7f7b5d", size = 1445441 }, - { url = "https://files.pythonhosted.org/packages/35/3c/f79b185365ab9be80cd3cd01dacf30bf5895f9b7b001e683b369e0bb6d3d/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:10d755cf2a455d8c0f8c767a43d68f24d163b8fe93ccfaabfa7bafd26be58d73", size = 825691 }, - { url = "https://files.pythonhosted.org/packages/f7/1f/8b37d25e95b8f2a434a19499a601d4d272b9839ab8c32f6b0fc1e40c383f/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:536703b8f90e911294831a7fbcd0c062b837f3ccaa923d92a6254e11178aaf42", size = 1410726 }, - { url = "https://files.pythonhosted.org/packages/bd/93/5a4a4cf9913014f83d615ad6a2df9187330f764f606246b3a744c0788c03/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6b08eab48c9669d515a344fb0ef27e2cbde847721e34bba94a343baa0f33f1f4", size = 801035 }, - { url = "https://files.pythonhosted.org/packages/bf/60/40da6b0fe6a4d5fd88f608389eb1df06492ba2edca93fca0b3bebff9b948/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5789f016e08e5606803161ba24de01b5a345d24590a80323379fc4408832d290", size = 1371854 }, - { url = "https://files.pythonhosted.org/packages/44/b2/37ac1d65008f824cba6b5bf68d18b76d97d0f62d7a032367ea69d4a187c8/pynacl-1.6.0-cp314-cp314t-win32.whl", hash = "sha256:4853c154dc16ea12f8f3ee4b7e763331876316cc3a9f06aeedf39bcdca8f9995", size = 230345 }, - { url = "https://files.pythonhosted.org/packages/f4/5a/9234b7b45af890d02ebee9aae41859b9b5f15fb4a5a56d88e3b4d1659834/pynacl-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:347dcddce0b4d83ed3f32fd00379c83c425abee5a9d2cd0a2c84871334eaff64", size = 243103 }, - { url = "https://files.pythonhosted.org/packages/c9/2c/c1a0f19d720ab0af3bc4241af2bdf4d813c3ecdcb96392b5e1ddf2d8f24f/pynacl-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2d6cd56ce4998cb66a6c112fda7b1fdce5266c9f05044fa72972613bef376d15", size = 187778 }, - { url = "https://files.pythonhosted.org/packages/63/37/87c72df19857c5b3b47ace6f211a26eb862ada495cc96daa372d96048fca/pynacl-1.6.0-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e", size = 382610 }, - { url = "https://files.pythonhosted.org/packages/0c/64/3ce958a5817fd3cc6df4ec14441c43fd9854405668d73babccf77f9597a3/pynacl-1.6.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16dd347cdc8ae0b0f6187a2608c0af1c8b7ecbbe6b4a06bff8253c192f696990", size = 798744 }, - { url = "https://files.pythonhosted.org/packages/e4/8a/3f0dd297a0a33fa3739c255feebd0206bb1df0b44c52fbe2caf8e8bc4425/pynacl-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16c60daceee88d04f8d41d0a4004a7ed8d9a5126b997efd2933e08e93a3bd850", size = 1397879 }, - { url = "https://files.pythonhosted.org/packages/41/94/028ff0434a69448f61348d50d2c147dda51aabdd4fbc93ec61343332174d/pynacl-1.6.0-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25720bad35dfac34a2bcdd61d9e08d6bfc6041bebc7751d9c9f2446cf1e77d64", size = 833907 }, - { url = "https://files.pythonhosted.org/packages/52/bc/a5cff7f8c30d5f4c26a07dfb0bcda1176ab8b2de86dda3106c00a02ad787/pynacl-1.6.0-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bfaa0a28a1ab718bad6239979a5a57a8d1506d0caf2fba17e524dbb409441cf", size = 1436649 }, - { url = "https://files.pythonhosted.org/packages/7a/20/c397be374fd5d84295046e398de4ba5f0722dc14450f65db76a43c121471/pynacl-1.6.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ef214b90556bb46a485b7da8258e59204c244b1b5b576fb71848819b468c44a7", size = 817142 }, - { url = "https://files.pythonhosted.org/packages/12/30/5efcef3406940cda75296c6d884090b8a9aad2dcc0c304daebb5ae99fb4a/pynacl-1.6.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:49c336dd80ea54780bcff6a03ee1a476be1612423010472e60af83452aa0f442", size = 1401794 }, - { url = "https://files.pythonhosted.org/packages/be/e1/a8fe1248cc17ccb03b676d80fa90763760a6d1247da434844ea388d0816c/pynacl-1.6.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f3482abf0f9815e7246d461fab597aa179b7524628a4bc36f86a7dc418d2608d", size = 772161 }, - { url = "https://files.pythonhosted.org/packages/a3/76/8a62702fb657d6d9104ce13449db221a345665d05e6a3fdefb5a7cafd2ad/pynacl-1.6.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:140373378e34a1f6977e573033d1dd1de88d2a5d90ec6958c9485b2fd9f3eb90", size = 1370720 }, - { url = "https://files.pythonhosted.org/packages/6d/38/9e9e9b777a1c4c8204053733e1a0269672c0bd40852908c9ad6b6eaba82c/pynacl-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6b393bc5e5a0eb86bb85b533deb2d2c815666665f840a09e0aa3362bb6088736", size = 791252 }, - { url = "https://files.pythonhosted.org/packages/63/ef/d972ce3d92ae05c9091363cf185e8646933f91c376e97b8be79ea6e96c22/pynacl-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a25cfede801f01e54179b8ff9514bd7b5944da560b7040939732d1804d25419", size = 1362910 }, - { url = "https://files.pythonhosted.org/packages/35/2c/ee0b373a1861f66a7ca8bdb999331525615061320dd628527a50ba8e8a60/pynacl-1.6.0-cp38-abi3-win32.whl", hash = "sha256:dcdeb41c22ff3c66eef5e63049abf7639e0db4edee57ba70531fc1b6b133185d", size = 226461 }, - { url = "https://files.pythonhosted.org/packages/75/f7/41b6c0b9dd9970173b6acc026bab7b4c187e4e5beef2756d419ad65482da/pynacl-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:cf831615cc16ba324240de79d925eacae8265b7691412ac6b24221db157f6bd1", size = 238802 }, - { url = "https://files.pythonhosted.org/packages/8e/0f/462326910c6172fa2c6ed07922b22ffc8e77432b3affffd9e18f444dbfbb/pynacl-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:84709cea8f888e618c21ed9a0efdb1a59cc63141c403db8bf56c469b71ad56f2", size = 183846 }, +sdist = { url = "https://files.pythonhosted.org/packages/06/c6/a3124dee667a423f2c637cfd262a54d67d8ccf3e160f3c50f622a85b7723/pynacl-1.6.0.tar.gz", hash = "sha256:cb36deafe6e2bce3b286e5d1f3e1c246e0ccdb8808ddb4550bb2792f2df298f2", size = 3505641, upload_time = "2025-09-10T23:39:22.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/24/1b639176401255605ba7c2b93a7b1eb1e379e0710eca62613633eb204201/pynacl-1.6.0-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:f46386c24a65383a9081d68e9c2de909b1834ec74ff3013271f1bca9c2d233eb", size = 384141, upload_time = "2025-09-10T23:38:28.675Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7b/874efdf57d6bf172db0df111b479a553c3d9e8bb4f1f69eb3ffff772d6e8/pynacl-1.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dea103a1afcbc333bc0e992e64233d360d393d1e63d0bc88554f572365664348", size = 808132, upload_time = "2025-09-10T23:38:38.995Z" }, + { url = "https://files.pythonhosted.org/packages/f3/61/9b53f5913f3b75ac3d53170cdb897101b2b98afc76f4d9d3c8de5aa3ac05/pynacl-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:04f20784083014e265ad58c1b2dd562c3e35864b5394a14ab54f5d150ee9e53e", size = 1407253, upload_time = "2025-09-10T23:38:40.492Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0a/b138916b22bbf03a1bdbafecec37d714e7489dd7bcaf80cd17852f8b67be/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbcc4452a1eb10cd5217318c822fde4be279c9de8567f78bad24c773c21254f8", size = 843719, upload_time = "2025-09-10T23:38:30.87Z" }, + { url = "https://files.pythonhosted.org/packages/01/3b/17c368197dfb2c817ce033f94605a47d0cc27901542109e640cef263f0af/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fed9fe1bec9e7ff9af31cd0abba179d0e984a2960c77e8e5292c7e9b7f7b5d", size = 1445441, upload_time = "2025-09-10T23:38:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/35/3c/f79b185365ab9be80cd3cd01dacf30bf5895f9b7b001e683b369e0bb6d3d/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:10d755cf2a455d8c0f8c767a43d68f24d163b8fe93ccfaabfa7bafd26be58d73", size = 825691, upload_time = "2025-09-10T23:38:34.832Z" }, + { url = "https://files.pythonhosted.org/packages/f7/1f/8b37d25e95b8f2a434a19499a601d4d272b9839ab8c32f6b0fc1e40c383f/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:536703b8f90e911294831a7fbcd0c062b837f3ccaa923d92a6254e11178aaf42", size = 1410726, upload_time = "2025-09-10T23:38:36.893Z" }, + { url = "https://files.pythonhosted.org/packages/bd/93/5a4a4cf9913014f83d615ad6a2df9187330f764f606246b3a744c0788c03/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6b08eab48c9669d515a344fb0ef27e2cbde847721e34bba94a343baa0f33f1f4", size = 801035, upload_time = "2025-09-10T23:38:42.109Z" }, + { url = "https://files.pythonhosted.org/packages/bf/60/40da6b0fe6a4d5fd88f608389eb1df06492ba2edca93fca0b3bebff9b948/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5789f016e08e5606803161ba24de01b5a345d24590a80323379fc4408832d290", size = 1371854, upload_time = "2025-09-10T23:38:44.16Z" }, + { url = "https://files.pythonhosted.org/packages/44/b2/37ac1d65008f824cba6b5bf68d18b76d97d0f62d7a032367ea69d4a187c8/pynacl-1.6.0-cp314-cp314t-win32.whl", hash = "sha256:4853c154dc16ea12f8f3ee4b7e763331876316cc3a9f06aeedf39bcdca8f9995", size = 230345, upload_time = "2025-09-10T23:38:48.276Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5a/9234b7b45af890d02ebee9aae41859b9b5f15fb4a5a56d88e3b4d1659834/pynacl-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:347dcddce0b4d83ed3f32fd00379c83c425abee5a9d2cd0a2c84871334eaff64", size = 243103, upload_time = "2025-09-10T23:38:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2c/c1a0f19d720ab0af3bc4241af2bdf4d813c3ecdcb96392b5e1ddf2d8f24f/pynacl-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2d6cd56ce4998cb66a6c112fda7b1fdce5266c9f05044fa72972613bef376d15", size = 187778, upload_time = "2025-09-10T23:38:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/63/37/87c72df19857c5b3b47ace6f211a26eb862ada495cc96daa372d96048fca/pynacl-1.6.0-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e", size = 382610, upload_time = "2025-09-10T23:38:49.459Z" }, + { url = "https://files.pythonhosted.org/packages/0c/64/3ce958a5817fd3cc6df4ec14441c43fd9854405668d73babccf77f9597a3/pynacl-1.6.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16dd347cdc8ae0b0f6187a2608c0af1c8b7ecbbe6b4a06bff8253c192f696990", size = 798744, upload_time = "2025-09-10T23:38:58.531Z" }, + { url = "https://files.pythonhosted.org/packages/e4/8a/3f0dd297a0a33fa3739c255feebd0206bb1df0b44c52fbe2caf8e8bc4425/pynacl-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16c60daceee88d04f8d41d0a4004a7ed8d9a5126b997efd2933e08e93a3bd850", size = 1397879, upload_time = "2025-09-10T23:39:00.44Z" }, + { url = "https://files.pythonhosted.org/packages/41/94/028ff0434a69448f61348d50d2c147dda51aabdd4fbc93ec61343332174d/pynacl-1.6.0-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25720bad35dfac34a2bcdd61d9e08d6bfc6041bebc7751d9c9f2446cf1e77d64", size = 833907, upload_time = "2025-09-10T23:38:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/52/bc/a5cff7f8c30d5f4c26a07dfb0bcda1176ab8b2de86dda3106c00a02ad787/pynacl-1.6.0-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bfaa0a28a1ab718bad6239979a5a57a8d1506d0caf2fba17e524dbb409441cf", size = 1436649, upload_time = "2025-09-10T23:38:52.783Z" }, + { url = "https://files.pythonhosted.org/packages/7a/20/c397be374fd5d84295046e398de4ba5f0722dc14450f65db76a43c121471/pynacl-1.6.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ef214b90556bb46a485b7da8258e59204c244b1b5b576fb71848819b468c44a7", size = 817142, upload_time = "2025-09-10T23:38:54.4Z" }, + { url = "https://files.pythonhosted.org/packages/12/30/5efcef3406940cda75296c6d884090b8a9aad2dcc0c304daebb5ae99fb4a/pynacl-1.6.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:49c336dd80ea54780bcff6a03ee1a476be1612423010472e60af83452aa0f442", size = 1401794, upload_time = "2025-09-10T23:38:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/be/e1/a8fe1248cc17ccb03b676d80fa90763760a6d1247da434844ea388d0816c/pynacl-1.6.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f3482abf0f9815e7246d461fab597aa179b7524628a4bc36f86a7dc418d2608d", size = 772161, upload_time = "2025-09-10T23:39:01.93Z" }, + { url = "https://files.pythonhosted.org/packages/a3/76/8a62702fb657d6d9104ce13449db221a345665d05e6a3fdefb5a7cafd2ad/pynacl-1.6.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:140373378e34a1f6977e573033d1dd1de88d2a5d90ec6958c9485b2fd9f3eb90", size = 1370720, upload_time = "2025-09-10T23:39:03.531Z" }, + { url = "https://files.pythonhosted.org/packages/6d/38/9e9e9b777a1c4c8204053733e1a0269672c0bd40852908c9ad6b6eaba82c/pynacl-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6b393bc5e5a0eb86bb85b533deb2d2c815666665f840a09e0aa3362bb6088736", size = 791252, upload_time = "2025-09-10T23:39:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d972ce3d92ae05c9091363cf185e8646933f91c376e97b8be79ea6e96c22/pynacl-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a25cfede801f01e54179b8ff9514bd7b5944da560b7040939732d1804d25419", size = 1362910, upload_time = "2025-09-10T23:39:06.924Z" }, + { url = "https://files.pythonhosted.org/packages/35/2c/ee0b373a1861f66a7ca8bdb999331525615061320dd628527a50ba8e8a60/pynacl-1.6.0-cp38-abi3-win32.whl", hash = "sha256:dcdeb41c22ff3c66eef5e63049abf7639e0db4edee57ba70531fc1b6b133185d", size = 226461, upload_time = "2025-09-10T23:39:11.894Z" }, + { url = "https://files.pythonhosted.org/packages/75/f7/41b6c0b9dd9970173b6acc026bab7b4c187e4e5beef2756d419ad65482da/pynacl-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:cf831615cc16ba324240de79d925eacae8265b7691412ac6b24221db157f6bd1", size = 238802, upload_time = "2025-09-10T23:39:08.966Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0f/462326910c6172fa2c6ed07922b22ffc8e77432b3affffd9e18f444dbfbb/pynacl-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:84709cea8f888e618c21ed9a0efdb1a59cc63141c403db8bf56c469b71ad56f2", size = 183846, upload_time = "2025-09-10T23:39:10.552Z" }, ] [[package]] @@ -2257,17 +2302,17 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/d4/bbb4ab79bb3015e3bdd488435ef71f7806144cc6ae4146ee6c5f64ac53f2/pyomo-6.9.4.tar.gz", hash = "sha256:34ad22cd6bf9956de9c0d3842d01c1f92dee0515b25aa3e8f113b326549b1231", size = 3033231 } +sdist = { url = "https://files.pythonhosted.org/packages/91/d4/bbb4ab79bb3015e3bdd488435ef71f7806144cc6ae4146ee6c5f64ac53f2/pyomo-6.9.4.tar.gz", hash = "sha256:34ad22cd6bf9956de9c0d3842d01c1f92dee0515b25aa3e8f113b326549b1231", size = 3033231, upload_time = "2025-08-28T02:11:24.976Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/6b/80f40b4b72a3c6a207130ce431765f897c76133a15e7e38e66f9f40d36f3/pyomo-6.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc3cd52c143991071821bbb9943d2a59512481b5d15adb7add32f92def4172ce", size = 4266926 }, - { url = "https://files.pythonhosted.org/packages/48/30/f7ef1be3deb445694b63800de6a36dff31670014d5aa67d42e1716c04970/pyomo-6.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a5e1dc79e1a2ec1f6247f0df59ac3572781e40218093a624f9213dd3ae6913f", size = 4255513 }, - { url = "https://files.pythonhosted.org/packages/76/f4/9493daae82595d7d776ba6cd0d5d167951700670e363dec443415e753808/pyomo-6.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abea6ca55295b179c1c91184db4eece7589cfd6099869eff8e3e6aa8a06463d1", size = 4311852 }, - { url = "https://files.pythonhosted.org/packages/83/d7/e39e605ab33c2729afb043bed94ce7ee382bd5b4bc708f6c90a1d2600456/pyomo-6.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddd48dec34b270ca2621863a216c4f3a6fcc409db86a7dc34c31eb788a44b8c6", size = 4343130 }, - { url = "https://files.pythonhosted.org/packages/65/04/dc4d3d9369c4cb1b6e68ce18bbba066ea83284942322836e791dbf693bb2/pyomo-6.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1a768a178ae3f0391c66e2334da3d1618c9c85c9d879bc86de441efd143f491", size = 4267029 }, - { url = "https://files.pythonhosted.org/packages/6b/52/824e9cea51ed0a25636b66e8c122dce5fcd22a197bf4646dd6c5f138fe36/pyomo-6.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09cde10e5fe8414f453d1ed3bccef1b42fc048fc2da0a9c936e40b2f877201bf", size = 4255606 }, - { url = "https://files.pythonhosted.org/packages/a2/dc/97005d683ca57e231a8f613921adaf480d3a82f40d280c6d0185855a92c6/pyomo-6.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3e173d330666f881258deefa79f37373b941d4a5b00edc6aa5b10680720dc1", size = 4312670 }, - { url = "https://files.pythonhosted.org/packages/64/73/47525078660eced084abb9a79e1e4c74098c992316c93ab6ead2dc7f8bda/pyomo-6.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a13baebcdb05deadeb0ec4b04ecedffa65f1e86179418fa67e603a4f8f1bf17", size = 4344540 }, - { url = "https://files.pythonhosted.org/packages/d8/e3/56c20c3358e58206e7270a42ff666a267a6c01492213c8c47aad8676b487/pyomo-6.9.4-py3-none-any.whl", hash = "sha256:a274d74616c0b793279931f3b2175a31f9c63213f2d7b86c14d168c6c264f782", size = 3892640 }, + { url = "https://files.pythonhosted.org/packages/18/6b/80f40b4b72a3c6a207130ce431765f897c76133a15e7e38e66f9f40d36f3/pyomo-6.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc3cd52c143991071821bbb9943d2a59512481b5d15adb7add32f92def4172ce", size = 4266926, upload_time = "2025-08-28T02:09:44.833Z" }, + { url = "https://files.pythonhosted.org/packages/48/30/f7ef1be3deb445694b63800de6a36dff31670014d5aa67d42e1716c04970/pyomo-6.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a5e1dc79e1a2ec1f6247f0df59ac3572781e40218093a624f9213dd3ae6913f", size = 4255513, upload_time = "2025-08-28T02:09:49.197Z" }, + { url = "https://files.pythonhosted.org/packages/76/f4/9493daae82595d7d776ba6cd0d5d167951700670e363dec443415e753808/pyomo-6.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abea6ca55295b179c1c91184db4eece7589cfd6099869eff8e3e6aa8a06463d1", size = 4311852, upload_time = "2025-08-28T02:09:53.415Z" }, + { url = "https://files.pythonhosted.org/packages/83/d7/e39e605ab33c2729afb043bed94ce7ee382bd5b4bc708f6c90a1d2600456/pyomo-6.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddd48dec34b270ca2621863a216c4f3a6fcc409db86a7dc34c31eb788a44b8c6", size = 4343130, upload_time = "2025-08-28T02:09:57.397Z" }, + { url = "https://files.pythonhosted.org/packages/65/04/dc4d3d9369c4cb1b6e68ce18bbba066ea83284942322836e791dbf693bb2/pyomo-6.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1a768a178ae3f0391c66e2334da3d1618c9c85c9d879bc86de441efd143f491", size = 4267029, upload_time = "2025-08-28T02:10:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/6b/52/824e9cea51ed0a25636b66e8c122dce5fcd22a197bf4646dd6c5f138fe36/pyomo-6.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09cde10e5fe8414f453d1ed3bccef1b42fc048fc2da0a9c936e40b2f877201bf", size = 4255606, upload_time = "2025-08-28T02:10:06.383Z" }, + { url = "https://files.pythonhosted.org/packages/a2/dc/97005d683ca57e231a8f613921adaf480d3a82f40d280c6d0185855a92c6/pyomo-6.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3e173d330666f881258deefa79f37373b941d4a5b00edc6aa5b10680720dc1", size = 4312670, upload_time = "2025-08-28T02:10:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/64/73/47525078660eced084abb9a79e1e4c74098c992316c93ab6ead2dc7f8bda/pyomo-6.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a13baebcdb05deadeb0ec4b04ecedffa65f1e86179418fa67e603a4f8f1bf17", size = 4344540, upload_time = "2025-08-28T02:10:15.731Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e3/56c20c3358e58206e7270a42ff666a267a6c01492213c8c47aad8676b487/pyomo-6.9.4-py3-none-any.whl", hash = "sha256:a274d74616c0b793279931f3b2175a31f9c63213f2d7b86c14d168c6c264f782", size = 3892640, upload_time = "2025-08-28T02:11:13.845Z" }, ] [[package]] @@ -2277,9 +2322,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729 }, + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, ] [[package]] @@ -2293,9 +2338,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618 } +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload_time = "2025-09-04T14:34:22.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750 }, + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload_time = "2025-09-04T14:34:20.226Z" }, ] [[package]] @@ -2307,9 +2352,9 @@ dependencies = [ { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload_time = "2025-09-09T10:57:02.113Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424 }, + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload_time = "2025-09-09T10:57:00.695Z" }, ] [[package]] @@ -2320,76 +2365,76 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload_time = "2025-07-01T13:30:59.346Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload_time = "2025-07-01T13:30:56.632Z" }, ] [[package]] name = "python-calamine" version = "0.5.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ca/295b37a97275d53f072c7307c9d0c4bfec565d3d74157e7fe336ea18de0a/python_calamine-0.5.3.tar.gz", hash = "sha256:b4529c955fa64444184630d5bc8c82c472d1cf6bfe631f0a7bfc5e4802d4e996", size = 130874 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/24/f6e3369be221baa6a50476b8a02f5100980ae487a630d80d4983b4c73879/python_calamine-0.5.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9a78e471bc02d3f76c294bf996562a9d0fbf2ad0a49d628330ba247865190f1", size = 844280 }, - { url = "https://files.pythonhosted.org/packages/e7/32/f9b689fe40616376457d1a6fd5ab84834066db31fa5ffd10a5b02f996a44/python_calamine-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcbd277a4d0a0108aa2f5126a89ca3f2bb18d0bec7ba7d614da02a4556d18ef2", size = 814054 }, - { url = "https://files.pythonhosted.org/packages/f7/26/a07bb6993ae0a524251060397edc710af413dbb175d56f1e1bbc7a2c39c9/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e6b68b26346f559a086bb84c960d4e9ddc79be8c3499752c1ba96051fea98f", size = 889447 }, - { url = "https://files.pythonhosted.org/packages/d8/79/5902d00658e2dd4efe3a4062b710a7eaa6082001c199717468fbcd8cef69/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e60ebeafebf66889753bfad0055edaa38068663961bb9a18e9f89aef2c9cec50", size = 883540 }, - { url = "https://files.pythonhosted.org/packages/d0/85/6299c909fcbba0663b527b82c87d204372e6f469b4ed5602f7bc1f7f1103/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d9da11edb40e9d2fb214fcf575be8004b44b1b407930eceb2458f1a84be634f", size = 1034891 }, - { url = "https://files.pythonhosted.org/packages/65/2c/d0cfd9161b3404528bfba9fe000093be19f2c83ede42c255da4ebfd4da17/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44d22bc52fe26b72a6dc07ab8a167d5d97aeb28282957f52b930e92106a35e3c", size = 935055 }, - { url = "https://files.pythonhosted.org/packages/b8/69/420c382535d1aca9af6bc929c78ad6b9f8416312aa4955b7977f5f864082/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b9ace667e04ea6631a0ada0e43dbc796c56e0d021f04bd64cdacb44de4504da", size = 904143 }, - { url = "https://files.pythonhosted.org/packages/d8/2b/19cc87654f9c85fbb6265a7ebe92cf0f649c308f0cf8f262b5c3de754d19/python_calamine-0.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ec0da29de7366258de2eb765a90b9e9fbe9f9865772f3609dacff302b894393", size = 948890 }, - { url = "https://files.pythonhosted.org/packages/18/e8/3547cb72d3a0f67c173ca07d9137046f2a6c87fdc31316b10e2d7d851f2a/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bba5adf123200503e6c07c667a8ce82c3b62ba02f9b3e99205be24fc73abc49", size = 1067802 }, - { url = "https://files.pythonhosted.org/packages/cb/69/31ab3e8010cbed814b5fcdb2ace43e5b76d6464f8abb1dfab9191416ca3d/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4c49bc58f3cfd1e9595a05cab7e71aa94f6cff5bf3916de2b87cdaa9b4ce9a3", size = 1074607 }, - { url = "https://files.pythonhosted.org/packages/c4/40/112d113d974bee5fff564e355b01df5bd524dbd5820c913c9dae574fe80a/python_calamine-0.5.3-cp312-cp312-win32.whl", hash = "sha256:42315463e139f5e44f4dedb9444fa0971c51e82573e872428050914f0dec4194", size = 669578 }, - { url = "https://files.pythonhosted.org/packages/3e/87/0af1cf4ad01a2df273cfd3abb7efaba4fba50395b98f5e871cee016d4f09/python_calamine-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8a24bd4c72bd984311f5ebf2e17a8aa3ce4e5ae87eda517c61c3507db8c045de", size = 713021 }, - { url = "https://files.pythonhosted.org/packages/5d/4e/6ed2ed3bb4c4c479e85d3444742f101f7b3099db1819e422bf861cf9923b/python_calamine-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:e4a713e56d3cca752d1a7d6a00dca81b224e2e1a0567d370bc0db537e042d6b0", size = 679615 }, - { url = "https://files.pythonhosted.org/packages/33/e7/14f2bec7b4bead0e71e78fa2549e22192c498a3204d931bd0e6522ec955d/python_calamine-0.5.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:90389cc459500644bbc1a1170b5e50a95160f34cedc8de7fe9a4bd1c08764039", size = 843906 }, - { url = "https://files.pythonhosted.org/packages/c2/6c/8c6e7a8c9b421e99ad1a637c3b96d94fef25abad6bf790a7ce35bfc5a48d/python_calamine-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:221b64c0e126a1263a14d575c61a60177cad852829dca61dfb4f5a8fb9603251", size = 813859 }, - { url = "https://files.pythonhosted.org/packages/c4/ee/f6745016a431f10620b4e803f306d95c57e828dea064e32fb944c0260559/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49f3aa50d532c6639be851a644875d5c9cd63892cf545ee614a5c0593dc50c3b", size = 889212 }, - { url = "https://files.pythonhosted.org/packages/b9/72/8de0af1823d587b2683eb25c6feef14c7ea917cfb975d094ad09f46245d0/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d8bf3b3542c771795cfcfa8a77d1373273311735517cca599aa7f89c34f38ae", size = 883584 }, - { url = "https://files.pythonhosted.org/packages/5a/90/47b91cf573b6bd4e6dbaeef4f993caf26dc0d2b8117261bc965bd70b38ce/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8e452fc1335ab1f7738c3d4d5144f11719b9c5585f3cb5102d47293355067a", size = 1034378 }, - { url = "https://files.pythonhosted.org/packages/48/f7/c75e5f0b0918f0f60b45fad4c313d159633615aa1c96a5170e3fe940862d/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4fc75ac97be47539465191a00de305c0e150465da8632c14fc1107a0b304f97", size = 934310 }, - { url = "https://files.pythonhosted.org/packages/cd/04/8b5806bdbfabdb51fd2816deac6870d031560f0bbd90d9729ac86b903579/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1258368551e0b235d5b46c105137294cbb5ca683b2c13f5851f3ebec7f2d42b", size = 903602 }, - { url = "https://files.pythonhosted.org/packages/75/4e/ec27837d5023b8db775db7798b3340eeb6bcb7f61ad64e892d4e1b14853e/python_calamine-0.5.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a7c51270e5ea518cb02cb531d84a2eb2de68da3cf48b26adae622f031dc5284", size = 948410 }, - { url = "https://files.pythonhosted.org/packages/3d/ba/8b5193637bfa0f363284974ae998f96fa1c8561a0a4d90378b0f202ac317/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e1d0df3d69b32da05e3e7648bb5802559d44979be721983f0d669b4128f920fa", size = 1067274 }, - { url = "https://files.pythonhosted.org/packages/da/1c/506791e4c7078f2fed1ee2d69703d62c0acfd5b671db157bb755f47cff42/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6d674ae194744b6080f20a0b5a253a9976d632ee91dc00e13e539e968167cd35", size = 1073351 }, - { url = "https://files.pythonhosted.org/packages/dc/83/e30e21484b1ed55668f67a63578d8a6ba70597a4d7ee8da23d759d3e1b3f/python_calamine-0.5.3-cp313-cp313-win32.whl", hash = "sha256:7a42ff0dae44457a4a3e65ea49357ffdf92e44f8b022ef1fb32c6498097d6d57", size = 669416 }, - { url = "https://files.pythonhosted.org/packages/1d/8f/29c617e9548ed2704657ebaa7d79067cad06cbbf7dd432a6cacd4cc19d16/python_calamine-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:054aee805c2cd5ab9848c2b8459822f2581cf22af45ff60251c9f45585cc06e0", size = 712760 }, - { url = "https://files.pythonhosted.org/packages/f8/35/d8117f99037100a28d17d9fbde121511c19d54ff4e5968d6aed693caeb87/python_calamine-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0e870f57651e2f76e7c1f009492aa342a7b1819f8b1131bf501240872777f944", size = 679372 }, - { url = "https://files.pythonhosted.org/packages/d9/0a/61949009a354af9ff5dc19e6816ae68a56281c0765520c9db4ff0ed20054/python_calamine-0.5.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e98c819cd43a7f0048f6d97c9d4ec23d72889cd722de1d6b68e0de24b1f8f037", size = 843418 }, - { url = "https://files.pythonhosted.org/packages/52/7b/4cb7fa988d17c98a0be6e9f74561d8a2381f28a2b88adb89f16abe345d2f/python_calamine-0.5.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cf90ce46420545f922cde95004ea8d5efaf3864b5a380a5d1defc7abd219421a", size = 813611 }, - { url = "https://files.pythonhosted.org/packages/01/34/4c2a6827da90f366be3fb9c7788f672f5e7d60808f9dbd01da5acc6f11ca/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e89caa6a1a55215be742cd44f6d94611fb6ab222a30325e772abc40566693e5", size = 888097 }, - { url = "https://files.pythonhosted.org/packages/17/bc/ecf5f6ac95195dfd3e9d63ab8c60b78d6466009751dfb1cdacf71d5f5e19/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b13177e42dac8de57870995699b237ce5a7886d9bd7fb745a36f867e5d3d3e62", size = 880861 }, - { url = "https://files.pythonhosted.org/packages/6e/55/8b60f99221a408f08db280b553aa4321c4cd9365e5c3101638249002d5a4/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:948e28b5f3246177440c70550661e0a27b414cb15535111fca7dbac2a63721b1", size = 1033023 }, - { url = "https://files.pythonhosted.org/packages/05/c5/8c378d3c2c56d12606e20b59eee3538d3b1177fe00b103bb98ef15176610/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37fef2b67bcd66b5dfc65b0779da9522c82f1ef9f97fc6034848072ff60b3f7", size = 933097 }, - { url = "https://files.pythonhosted.org/packages/26/04/cf14e91ac5c2d6d9795e1c39f3f53e0f173fcbaed4b00198e22a58265fdd/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddcef4e0e9d0479e027c90d9e1537bcf05de9bdd137cd7dfdbfc0034b1850973", size = 901917 }, - { url = "https://files.pythonhosted.org/packages/6e/2f/5b2065b9360bda792504fe3ac1cef6d9da51ceba6230ee7634886b44cce9/python_calamine-0.5.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6732b47f923102357bde348021a2892a41c2fb173958268c0a1ff8d5abb6b7e8", size = 943328 }, - { url = "https://files.pythonhosted.org/packages/ce/5a/45e4bd8473264b918d83297d15f160471029390cd06ed0056fc57e8f29eb/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:543db1b886cf994aaf7da0752022b37c42c05acb7605b56d09047023c8387610", size = 1065993 }, - { url = "https://files.pythonhosted.org/packages/35/6b/2afd47608495f23408bdf2f1ff57a144700aed8b5bbe50285ac4864edf53/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b79135dd96129253dc0e547778c700e1e3782e7671e7047c8b106b5501e33706", size = 1071801 }, - { url = "https://files.pythonhosted.org/packages/f7/db/b06a15f25e63290c2efc5433fa8b395bfe870aacbf4ea6c930764d53eca6/python_calamine-0.5.3-cp313-cp313t-win32.whl", hash = "sha256:d84dc3b78adf038a2b452fc784523dcc90477f1631d33aabc0872812db5beb26", size = 669485 }, - { url = "https://files.pythonhosted.org/packages/2d/40/e51adf1dae2002f189c83ae527aad017372d1a1b97a22172dc2e51ce502d/python_calamine-0.5.3-cp313-cp313t-win_amd64.whl", hash = "sha256:8a3fd541576fdf2708e40064ebaaf561a0a2afcab01de91c83ec212193bede34", size = 712636 }, - { url = "https://files.pythonhosted.org/packages/56/fa/db4dc8d27a5daa14a153aebc0cb98bad6fd700befd9e67440a8017f0e108/python_calamine-0.5.3-cp313-cp313t-win_arm64.whl", hash = "sha256:b28a9c9318a5e7dabcead1803bfd48be5bf7c9f339d6e505a5989650a6102487", size = 678307 }, - { url = "https://files.pythonhosted.org/packages/ee/7f/a098680c9d6ad36fe850f2c2c28627ee3bc95aaa052f375806f69c075475/python_calamine-0.5.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b5cdcd85cc08a1805d267fc66aa100940712de6b4524951ab91ba47fa60d481f", size = 843921 }, - { url = "https://files.pythonhosted.org/packages/09/ce/3de5d714779fac6e3333e7ea98ce4eae3b2479eb8a3d2f7d9e4487e16681/python_calamine-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:828cd5d49fe9eb9c1fc9219fe484b07f2ba9a1e5e3b8475d7f1415e0fa316df8", size = 814173 }, - { url = "https://files.pythonhosted.org/packages/cb/14/ef98575838091b6b24274160d53607e78df94f0176af360bcb063512e643/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d3f4d0532ab4de422fc4b707cdbb93d57ca7ccf9be8bc4742fb9376dc68f861", size = 888958 }, - { url = "https://files.pythonhosted.org/packages/c0/b1/c999dd1f89f415ff06f88f37bce643ece3c4d51ae051e0a143ff16f44c1c/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a9ba0a16e4335b676232ddbbea0fd09bfb94757ca6e4cf90ce1348aa843f3f", size = 880988 }, - { url = "https://files.pythonhosted.org/packages/74/16/4984532280e4b2c81aa26ae57b37fc3eaeda414e46e2d9c6a9cfdb27cd56/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0928d0eb1cdea229464de280d0f7cd99314ba28cffd2c4d6c9ce6902f9d6d448", size = 1035685 }, - { url = "https://files.pythonhosted.org/packages/cd/dc/91776b34ab09f36ea41449951148bef731f9b355a2d2b25d398eec774926/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f9519dd3b8814ef6e801b9797f918fe7a59937fac4784cb280c8350fb1a2cf", size = 933865 }, - { url = "https://files.pythonhosted.org/packages/01/97/12deaff5e608207398a9f0eaa06447ed69e8c4873ee953be553f9440881a/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954cd764c6b24735c749a447523b4ccf4b9d2b7c231ddd304ed42c15afca9516", size = 902310 }, - { url = "https://files.pythonhosted.org/packages/45/da/45063eee203f6c9d9436d29dfc0f01db85c9264c86d1e438c3b452d7e97f/python_calamine-0.5.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3f0e9c59fece6bbf1a916947fba33e9b635327eb165784d05efed40027164d1", size = 948143 }, - { url = "https://files.pythonhosted.org/packages/33/07/0b661166dd58367bd5d6cc2bf8441f61004dd5ef2555ab224da97b1ac5d3/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:63bb47cc080d8eb9bc654f0961ada385b58a57d4628b0a33d1003c8f62e6ae3d", size = 1067181 }, - { url = "https://files.pythonhosted.org/packages/5d/80/58b107dc2c2e6bad581f58f54b3ccb07705094ff23734c8dd30bd8aef4e8/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:adb62aab9b9298b2fc378b2aec6dd5802f7ee199c3431abae29368ef046f8005", size = 1072683 }, - { url = "https://files.pythonhosted.org/packages/4c/b4/667e40dbe7d4f19a2e69f9cd186e069cd3af0411a177aa2a90231e3e0b06/python_calamine-0.5.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1de68d2586df7a7a05a7779031dabd4c3d95d4738314ba82e943c8d3f36b5a67", size = 843526 }, - { url = "https://files.pythonhosted.org/packages/3e/f7/fb86da5920198a616583f07d1a395cb1241eafb930d5c33f597ae6664711/python_calamine-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c70033bbd59f05491743befec5e2a90784f4c8220e7379ce03e956bd1f475be", size = 811074 }, - { url = "https://files.pythonhosted.org/packages/76/2e/5a5a618b351b75155fbb40ad88e166f17ccf202401dd4b830db05b2565a6/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f396a0e57b1a5462668fc247377714b5b4c061718c1863c00ddc64e770b0f1e", size = 887735 }, - { url = "https://files.pythonhosted.org/packages/97/cf/3cfaa550eb1c9c5501728886c5e787c3ddeb34d8bf3e7e9fcaf9fc6fbd86/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce737cb19d3077cabe0acaecd6b55d5df75021a520c20b47e0c75b65b4bfa919", size = 882356 }, - { url = "https://files.pythonhosted.org/packages/88/b8/97f56e337149d0ce53399be9bd583f735dc1ea9abb2745ac902a09e8c401/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e54b30802fe089cc0c67c67407203412ec7144e84e0960e69c529c7170c37dae", size = 1033195 }, - { url = "https://files.pythonhosted.org/packages/94/45/59a21a18c8e073d2f930a4a9c0c038207b82c5c996b67146fb76f3da2748/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5efc94c2e4119dc0da1e84d036f7e840fb0dd0850f4c10d3d166d725af0751af", size = 931846 }, - { url = "https://files.pythonhosted.org/packages/36/47/715e0c0bc37ccce035ef4be1aa8eafa1e5abb6687af725cb47d81a18def7/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e33191a01d52f66dd6b029e99b6eda0245771c4f116c87ff0d5edf922dbbca", size = 902871 }, - { url = "https://files.pythonhosted.org/packages/ca/07/ac0cf8623765106794e297235d6dde3a728f18e61a536792189fca06f2ba/python_calamine-0.5.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85ceec02cb367cf87a72ba559db3279f3b4774edba9330eb77670587d4de95f4", size = 944438 }, - { url = "https://files.pythonhosted.org/packages/88/98/c48c0b8be7fbae5f68b7c55a1ed4068d2c3dab64093e39733d43c23a7459/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:882400368f976ea489e47af04fde936b603c3efcf9ade1cd73e623c88fc4aa5c", size = 1066276 }, - { url = "https://files.pythonhosted.org/packages/73/3a/bbf99531fec43bca2ab28948ab94d851db96c0364c76139dd746cab2f4f9/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ce2fe421d5564e5341f7a06b9c52b84603b48aa670426d44fffce705609a859b", size = 1073059 }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/ca/295b37a97275d53f072c7307c9d0c4bfec565d3d74157e7fe336ea18de0a/python_calamine-0.5.3.tar.gz", hash = "sha256:b4529c955fa64444184630d5bc8c82c472d1cf6bfe631f0a7bfc5e4802d4e996", size = 130874, upload_time = "2025-09-08T05:41:27.18Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/24/f6e3369be221baa6a50476b8a02f5100980ae487a630d80d4983b4c73879/python_calamine-0.5.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9a78e471bc02d3f76c294bf996562a9d0fbf2ad0a49d628330ba247865190f1", size = 844280, upload_time = "2025-09-08T05:39:19.991Z" }, + { url = "https://files.pythonhosted.org/packages/e7/32/f9b689fe40616376457d1a6fd5ab84834066db31fa5ffd10a5b02f996a44/python_calamine-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcbd277a4d0a0108aa2f5126a89ca3f2bb18d0bec7ba7d614da02a4556d18ef2", size = 814054, upload_time = "2025-09-08T05:39:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/f7/26/a07bb6993ae0a524251060397edc710af413dbb175d56f1e1bbc7a2c39c9/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e6b68b26346f559a086bb84c960d4e9ddc79be8c3499752c1ba96051fea98f", size = 889447, upload_time = "2025-09-08T05:39:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/d8/79/5902d00658e2dd4efe3a4062b710a7eaa6082001c199717468fbcd8cef69/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e60ebeafebf66889753bfad0055edaa38068663961bb9a18e9f89aef2c9cec50", size = 883540, upload_time = "2025-09-08T05:39:25.15Z" }, + { url = "https://files.pythonhosted.org/packages/d0/85/6299c909fcbba0663b527b82c87d204372e6f469b4ed5602f7bc1f7f1103/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d9da11edb40e9d2fb214fcf575be8004b44b1b407930eceb2458f1a84be634f", size = 1034891, upload_time = "2025-09-08T05:39:26.666Z" }, + { url = "https://files.pythonhosted.org/packages/65/2c/d0cfd9161b3404528bfba9fe000093be19f2c83ede42c255da4ebfd4da17/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44d22bc52fe26b72a6dc07ab8a167d5d97aeb28282957f52b930e92106a35e3c", size = 935055, upload_time = "2025-09-08T05:39:28.727Z" }, + { url = "https://files.pythonhosted.org/packages/b8/69/420c382535d1aca9af6bc929c78ad6b9f8416312aa4955b7977f5f864082/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b9ace667e04ea6631a0ada0e43dbc796c56e0d021f04bd64cdacb44de4504da", size = 904143, upload_time = "2025-09-08T05:39:30.23Z" }, + { url = "https://files.pythonhosted.org/packages/d8/2b/19cc87654f9c85fbb6265a7ebe92cf0f649c308f0cf8f262b5c3de754d19/python_calamine-0.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ec0da29de7366258de2eb765a90b9e9fbe9f9865772f3609dacff302b894393", size = 948890, upload_time = "2025-09-08T05:39:31.779Z" }, + { url = "https://files.pythonhosted.org/packages/18/e8/3547cb72d3a0f67c173ca07d9137046f2a6c87fdc31316b10e2d7d851f2a/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bba5adf123200503e6c07c667a8ce82c3b62ba02f9b3e99205be24fc73abc49", size = 1067802, upload_time = "2025-09-08T05:39:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/cb/69/31ab3e8010cbed814b5fcdb2ace43e5b76d6464f8abb1dfab9191416ca3d/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4c49bc58f3cfd1e9595a05cab7e71aa94f6cff5bf3916de2b87cdaa9b4ce9a3", size = 1074607, upload_time = "2025-09-08T05:39:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/c4/40/112d113d974bee5fff564e355b01df5bd524dbd5820c913c9dae574fe80a/python_calamine-0.5.3-cp312-cp312-win32.whl", hash = "sha256:42315463e139f5e44f4dedb9444fa0971c51e82573e872428050914f0dec4194", size = 669578, upload_time = "2025-09-08T05:39:36.305Z" }, + { url = "https://files.pythonhosted.org/packages/3e/87/0af1cf4ad01a2df273cfd3abb7efaba4fba50395b98f5e871cee016d4f09/python_calamine-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8a24bd4c72bd984311f5ebf2e17a8aa3ce4e5ae87eda517c61c3507db8c045de", size = 713021, upload_time = "2025-09-08T05:39:37.942Z" }, + { url = "https://files.pythonhosted.org/packages/5d/4e/6ed2ed3bb4c4c479e85d3444742f101f7b3099db1819e422bf861cf9923b/python_calamine-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:e4a713e56d3cca752d1a7d6a00dca81b224e2e1a0567d370bc0db537e042d6b0", size = 679615, upload_time = "2025-09-08T05:39:39.487Z" }, + { url = "https://files.pythonhosted.org/packages/33/e7/14f2bec7b4bead0e71e78fa2549e22192c498a3204d931bd0e6522ec955d/python_calamine-0.5.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:90389cc459500644bbc1a1170b5e50a95160f34cedc8de7fe9a4bd1c08764039", size = 843906, upload_time = "2025-09-08T05:39:40.972Z" }, + { url = "https://files.pythonhosted.org/packages/c2/6c/8c6e7a8c9b421e99ad1a637c3b96d94fef25abad6bf790a7ce35bfc5a48d/python_calamine-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:221b64c0e126a1263a14d575c61a60177cad852829dca61dfb4f5a8fb9603251", size = 813859, upload_time = "2025-09-08T05:39:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/f6745016a431f10620b4e803f306d95c57e828dea064e32fb944c0260559/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49f3aa50d532c6639be851a644875d5c9cd63892cf545ee614a5c0593dc50c3b", size = 889212, upload_time = "2025-09-08T05:39:44.356Z" }, + { url = "https://files.pythonhosted.org/packages/b9/72/8de0af1823d587b2683eb25c6feef14c7ea917cfb975d094ad09f46245d0/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d8bf3b3542c771795cfcfa8a77d1373273311735517cca599aa7f89c34f38ae", size = 883584, upload_time = "2025-09-08T05:39:45.97Z" }, + { url = "https://files.pythonhosted.org/packages/5a/90/47b91cf573b6bd4e6dbaeef4f993caf26dc0d2b8117261bc965bd70b38ce/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8e452fc1335ab1f7738c3d4d5144f11719b9c5585f3cb5102d47293355067a", size = 1034378, upload_time = "2025-09-08T05:39:47.57Z" }, + { url = "https://files.pythonhosted.org/packages/48/f7/c75e5f0b0918f0f60b45fad4c313d159633615aa1c96a5170e3fe940862d/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4fc75ac97be47539465191a00de305c0e150465da8632c14fc1107a0b304f97", size = 934310, upload_time = "2025-09-08T05:39:49.059Z" }, + { url = "https://files.pythonhosted.org/packages/cd/04/8b5806bdbfabdb51fd2816deac6870d031560f0bbd90d9729ac86b903579/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1258368551e0b235d5b46c105137294cbb5ca683b2c13f5851f3ebec7f2d42b", size = 903602, upload_time = "2025-09-08T05:39:50.91Z" }, + { url = "https://files.pythonhosted.org/packages/75/4e/ec27837d5023b8db775db7798b3340eeb6bcb7f61ad64e892d4e1b14853e/python_calamine-0.5.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a7c51270e5ea518cb02cb531d84a2eb2de68da3cf48b26adae622f031dc5284", size = 948410, upload_time = "2025-09-08T05:39:53.286Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ba/8b5193637bfa0f363284974ae998f96fa1c8561a0a4d90378b0f202ac317/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e1d0df3d69b32da05e3e7648bb5802559d44979be721983f0d669b4128f920fa", size = 1067274, upload_time = "2025-09-08T05:39:55.469Z" }, + { url = "https://files.pythonhosted.org/packages/da/1c/506791e4c7078f2fed1ee2d69703d62c0acfd5b671db157bb755f47cff42/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6d674ae194744b6080f20a0b5a253a9976d632ee91dc00e13e539e968167cd35", size = 1073351, upload_time = "2025-09-08T05:39:57.685Z" }, + { url = "https://files.pythonhosted.org/packages/dc/83/e30e21484b1ed55668f67a63578d8a6ba70597a4d7ee8da23d759d3e1b3f/python_calamine-0.5.3-cp313-cp313-win32.whl", hash = "sha256:7a42ff0dae44457a4a3e65ea49357ffdf92e44f8b022ef1fb32c6498097d6d57", size = 669416, upload_time = "2025-09-08T05:39:59.901Z" }, + { url = "https://files.pythonhosted.org/packages/1d/8f/29c617e9548ed2704657ebaa7d79067cad06cbbf7dd432a6cacd4cc19d16/python_calamine-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:054aee805c2cd5ab9848c2b8459822f2581cf22af45ff60251c9f45585cc06e0", size = 712760, upload_time = "2025-09-08T05:40:01.799Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/d8117f99037100a28d17d9fbde121511c19d54ff4e5968d6aed693caeb87/python_calamine-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0e870f57651e2f76e7c1f009492aa342a7b1819f8b1131bf501240872777f944", size = 679372, upload_time = "2025-09-08T05:40:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/d9/0a/61949009a354af9ff5dc19e6816ae68a56281c0765520c9db4ff0ed20054/python_calamine-0.5.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e98c819cd43a7f0048f6d97c9d4ec23d72889cd722de1d6b68e0de24b1f8f037", size = 843418, upload_time = "2025-09-08T05:40:05.601Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/4cb7fa988d17c98a0be6e9f74561d8a2381f28a2b88adb89f16abe345d2f/python_calamine-0.5.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cf90ce46420545f922cde95004ea8d5efaf3864b5a380a5d1defc7abd219421a", size = 813611, upload_time = "2025-09-08T05:40:07.47Z" }, + { url = "https://files.pythonhosted.org/packages/01/34/4c2a6827da90f366be3fb9c7788f672f5e7d60808f9dbd01da5acc6f11ca/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e89caa6a1a55215be742cd44f6d94611fb6ab222a30325e772abc40566693e5", size = 888097, upload_time = "2025-09-08T05:40:09.256Z" }, + { url = "https://files.pythonhosted.org/packages/17/bc/ecf5f6ac95195dfd3e9d63ab8c60b78d6466009751dfb1cdacf71d5f5e19/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b13177e42dac8de57870995699b237ce5a7886d9bd7fb745a36f867e5d3d3e62", size = 880861, upload_time = "2025-09-08T05:40:11.637Z" }, + { url = "https://files.pythonhosted.org/packages/6e/55/8b60f99221a408f08db280b553aa4321c4cd9365e5c3101638249002d5a4/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:948e28b5f3246177440c70550661e0a27b414cb15535111fca7dbac2a63721b1", size = 1033023, upload_time = "2025-09-08T05:40:13.864Z" }, + { url = "https://files.pythonhosted.org/packages/05/c5/8c378d3c2c56d12606e20b59eee3538d3b1177fe00b103bb98ef15176610/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37fef2b67bcd66b5dfc65b0779da9522c82f1ef9f97fc6034848072ff60b3f7", size = 933097, upload_time = "2025-09-08T05:40:16.372Z" }, + { url = "https://files.pythonhosted.org/packages/26/04/cf14e91ac5c2d6d9795e1c39f3f53e0f173fcbaed4b00198e22a58265fdd/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddcef4e0e9d0479e027c90d9e1537bcf05de9bdd137cd7dfdbfc0034b1850973", size = 901917, upload_time = "2025-09-08T05:40:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2f/5b2065b9360bda792504fe3ac1cef6d9da51ceba6230ee7634886b44cce9/python_calamine-0.5.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6732b47f923102357bde348021a2892a41c2fb173958268c0a1ff8d5abb6b7e8", size = 943328, upload_time = "2025-09-08T05:40:20.302Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5a/45e4bd8473264b918d83297d15f160471029390cd06ed0056fc57e8f29eb/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:543db1b886cf994aaf7da0752022b37c42c05acb7605b56d09047023c8387610", size = 1065993, upload_time = "2025-09-08T05:40:22.528Z" }, + { url = "https://files.pythonhosted.org/packages/35/6b/2afd47608495f23408bdf2f1ff57a144700aed8b5bbe50285ac4864edf53/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b79135dd96129253dc0e547778c700e1e3782e7671e7047c8b106b5501e33706", size = 1071801, upload_time = "2025-09-08T05:40:24.481Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/b06a15f25e63290c2efc5433fa8b395bfe870aacbf4ea6c930764d53eca6/python_calamine-0.5.3-cp313-cp313t-win32.whl", hash = "sha256:d84dc3b78adf038a2b452fc784523dcc90477f1631d33aabc0872812db5beb26", size = 669485, upload_time = "2025-09-08T05:40:26.818Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/e51adf1dae2002f189c83ae527aad017372d1a1b97a22172dc2e51ce502d/python_calamine-0.5.3-cp313-cp313t-win_amd64.whl", hash = "sha256:8a3fd541576fdf2708e40064ebaaf561a0a2afcab01de91c83ec212193bede34", size = 712636, upload_time = "2025-09-08T05:40:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/56/fa/db4dc8d27a5daa14a153aebc0cb98bad6fd700befd9e67440a8017f0e108/python_calamine-0.5.3-cp313-cp313t-win_arm64.whl", hash = "sha256:b28a9c9318a5e7dabcead1803bfd48be5bf7c9f339d6e505a5989650a6102487", size = 678307, upload_time = "2025-09-08T05:40:30.797Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7f/a098680c9d6ad36fe850f2c2c28627ee3bc95aaa052f375806f69c075475/python_calamine-0.5.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b5cdcd85cc08a1805d267fc66aa100940712de6b4524951ab91ba47fa60d481f", size = 843921, upload_time = "2025-09-08T05:40:32.418Z" }, + { url = "https://files.pythonhosted.org/packages/09/ce/3de5d714779fac6e3333e7ea98ce4eae3b2479eb8a3d2f7d9e4487e16681/python_calamine-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:828cd5d49fe9eb9c1fc9219fe484b07f2ba9a1e5e3b8475d7f1415e0fa316df8", size = 814173, upload_time = "2025-09-08T05:40:33.982Z" }, + { url = "https://files.pythonhosted.org/packages/cb/14/ef98575838091b6b24274160d53607e78df94f0176af360bcb063512e643/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d3f4d0532ab4de422fc4b707cdbb93d57ca7ccf9be8bc4742fb9376dc68f861", size = 888958, upload_time = "2025-09-08T05:40:35.576Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b1/c999dd1f89f415ff06f88f37bce643ece3c4d51ae051e0a143ff16f44c1c/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a9ba0a16e4335b676232ddbbea0fd09bfb94757ca6e4cf90ce1348aa843f3f", size = 880988, upload_time = "2025-09-08T05:40:37.264Z" }, + { url = "https://files.pythonhosted.org/packages/74/16/4984532280e4b2c81aa26ae57b37fc3eaeda414e46e2d9c6a9cfdb27cd56/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0928d0eb1cdea229464de280d0f7cd99314ba28cffd2c4d6c9ce6902f9d6d448", size = 1035685, upload_time = "2025-09-08T05:40:38.992Z" }, + { url = "https://files.pythonhosted.org/packages/cd/dc/91776b34ab09f36ea41449951148bef731f9b355a2d2b25d398eec774926/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f9519dd3b8814ef6e801b9797f918fe7a59937fac4784cb280c8350fb1a2cf", size = 933865, upload_time = "2025-09-08T05:40:41.089Z" }, + { url = "https://files.pythonhosted.org/packages/01/97/12deaff5e608207398a9f0eaa06447ed69e8c4873ee953be553f9440881a/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954cd764c6b24735c749a447523b4ccf4b9d2b7c231ddd304ed42c15afca9516", size = 902310, upload_time = "2025-09-08T05:40:43.222Z" }, + { url = "https://files.pythonhosted.org/packages/45/da/45063eee203f6c9d9436d29dfc0f01db85c9264c86d1e438c3b452d7e97f/python_calamine-0.5.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3f0e9c59fece6bbf1a916947fba33e9b635327eb165784d05efed40027164d1", size = 948143, upload_time = "2025-09-08T05:40:44.874Z" }, + { url = "https://files.pythonhosted.org/packages/33/07/0b661166dd58367bd5d6cc2bf8441f61004dd5ef2555ab224da97b1ac5d3/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:63bb47cc080d8eb9bc654f0961ada385b58a57d4628b0a33d1003c8f62e6ae3d", size = 1067181, upload_time = "2025-09-08T05:40:46.598Z" }, + { url = "https://files.pythonhosted.org/packages/5d/80/58b107dc2c2e6bad581f58f54b3ccb07705094ff23734c8dd30bd8aef4e8/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:adb62aab9b9298b2fc378b2aec6dd5802f7ee199c3431abae29368ef046f8005", size = 1072683, upload_time = "2025-09-08T05:40:48.629Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b4/667e40dbe7d4f19a2e69f9cd186e069cd3af0411a177aa2a90231e3e0b06/python_calamine-0.5.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1de68d2586df7a7a05a7779031dabd4c3d95d4738314ba82e943c8d3f36b5a67", size = 843526, upload_time = "2025-09-08T05:40:50.334Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f7/fb86da5920198a616583f07d1a395cb1241eafb930d5c33f597ae6664711/python_calamine-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c70033bbd59f05491743befec5e2a90784f4c8220e7379ce03e956bd1f475be", size = 811074, upload_time = "2025-09-08T05:40:52.168Z" }, + { url = "https://files.pythonhosted.org/packages/76/2e/5a5a618b351b75155fbb40ad88e166f17ccf202401dd4b830db05b2565a6/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f396a0e57b1a5462668fc247377714b5b4c061718c1863c00ddc64e770b0f1e", size = 887735, upload_time = "2025-09-08T05:40:53.86Z" }, + { url = "https://files.pythonhosted.org/packages/97/cf/3cfaa550eb1c9c5501728886c5e787c3ddeb34d8bf3e7e9fcaf9fc6fbd86/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce737cb19d3077cabe0acaecd6b55d5df75021a520c20b47e0c75b65b4bfa919", size = 882356, upload_time = "2025-09-08T05:40:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/88/b8/97f56e337149d0ce53399be9bd583f735dc1ea9abb2745ac902a09e8c401/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e54b30802fe089cc0c67c67407203412ec7144e84e0960e69c529c7170c37dae", size = 1033195, upload_time = "2025-09-08T05:40:57.819Z" }, + { url = "https://files.pythonhosted.org/packages/94/45/59a21a18c8e073d2f930a4a9c0c038207b82c5c996b67146fb76f3da2748/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5efc94c2e4119dc0da1e84d036f7e840fb0dd0850f4c10d3d166d725af0751af", size = 931846, upload_time = "2025-09-08T05:40:59.93Z" }, + { url = "https://files.pythonhosted.org/packages/36/47/715e0c0bc37ccce035ef4be1aa8eafa1e5abb6687af725cb47d81a18def7/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e33191a01d52f66dd6b029e99b6eda0245771c4f116c87ff0d5edf922dbbca", size = 902871, upload_time = "2025-09-08T05:41:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/ca/07/ac0cf8623765106794e297235d6dde3a728f18e61a536792189fca06f2ba/python_calamine-0.5.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85ceec02cb367cf87a72ba559db3279f3b4774edba9330eb77670587d4de95f4", size = 944438, upload_time = "2025-09-08T05:41:03.748Z" }, + { url = "https://files.pythonhosted.org/packages/88/98/c48c0b8be7fbae5f68b7c55a1ed4068d2c3dab64093e39733d43c23a7459/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:882400368f976ea489e47af04fde936b603c3efcf9ade1cd73e623c88fc4aa5c", size = 1066276, upload_time = "2025-09-08T05:41:05.408Z" }, + { url = "https://files.pythonhosted.org/packages/73/3a/bbf99531fec43bca2ab28948ab94d851db96c0364c76139dd746cab2f4f9/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ce2fe421d5564e5341f7a06b9c52b84603b48aa670426d44fffce705609a859b", size = 1073059, upload_time = "2025-09-08T05:41:07.75Z" }, ] [[package]] @@ -2399,9 +2444,9 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, ] [[package]] @@ -2411,16 +2456,16 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload_time = "2025-03-11T12:27:27.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453 }, + { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, ] [[package]] name = "python-io-wrapper" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } [[package]] name = "python-slugify" @@ -2429,18 +2474,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -2448,41 +2493,41 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543 }, - { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040 }, - { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102 }, - { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700 }, - { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700 }, - { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318 }, - { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714 }, - { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800 }, - { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540 }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload_time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload_time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload_time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload_time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload_time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload_time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload_time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload_time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload_time = "2025-07-14T20:13:36.379Z" }, ] [[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/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 }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -2492,9 +2537,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload_time = "2025-05-13T15:24:01.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722 }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload_time = "2025-05-13T15:23:59.629Z" }, ] [[package]] @@ -2504,47 +2549,47 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279 }, - { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645 }, - { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574 }, - { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995 }, - { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070 }, - { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121 }, - { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550 }, - { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184 }, - { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480 }, - { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993 }, - { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436 }, - { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301 }, - { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197 }, - { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275 }, - { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469 }, - { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961 }, - { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282 }, - { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468 }, - { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394 }, - { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964 }, - { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029 }, - { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541 }, - { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197 }, - { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175 }, - { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427 }, - { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929 }, - { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193 }, - { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388 }, - { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316 }, - { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472 }, - { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401 }, - { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170 }, +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload_time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload_time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload_time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload_time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload_time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload_time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload_time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload_time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload_time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload_time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload_time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload_time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload_time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload_time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload_time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload_time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload_time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload_time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload_time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload_time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload_time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload_time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload_time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload_time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload_time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload_time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload_time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload_time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload_time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload_time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload_time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload_time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload_time = "2025-09-08T23:09:01.418Z" }, ] [[package]] name = "ratelimit" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } [[package]] name = "referencing" @@ -2555,9 +2600,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -2570,9 +2615,26 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload_time = "2025-08-18T20:46:02.573Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload_time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-cache" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cattrs" }, + { name = "platformdirs" }, + { name = "requests" }, + { name = "url-normalize" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1", size = 3018209, upload_time = "2024-06-18T17:18:03.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603", size = 61425, upload_time = "2024-06-18T17:17:45Z" }, ] [[package]] @@ -2582,9 +2644,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891 } +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244 }, + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, ] [[package]] @@ -2601,18 +2663,18 @@ dependencies = [ { name = "python-debian" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/f7/b59fe851b856d0932aedbf311a3d719f30783e27af6d05bb76d77072ab8f/reuse-5.1.1.tar.gz", hash = "sha256:a13914ed8b66b8e5956e96c63203c63d72b55280d348849ccc0eb314c73248cb", size = 419022 } +sdist = { url = "https://files.pythonhosted.org/packages/4b/f7/b59fe851b856d0932aedbf311a3d719f30783e27af6d05bb76d77072ab8f/reuse-5.1.1.tar.gz", hash = "sha256:a13914ed8b66b8e5956e96c63203c63d72b55280d348849ccc0eb314c73248cb", size = 419022, upload_time = "2025-09-05T14:50:01.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/95/12451ff8bc2c3e8a5755bc810a538de85444015d44353fc6f7ee8800c0bb/reuse-5.1.1-cp313-cp313-manylinux_2_41_x86_64.whl", hash = "sha256:15a68341949b7ddb3630d8d3a49d9537bbc143ee235dca77cc3f4047237c8299", size = 255386 }, + { url = "https://files.pythonhosted.org/packages/c9/95/12451ff8bc2c3e8a5755bc810a538de85444015d44353fc6f7ee8800c0bb/reuse-5.1.1-cp313-cp313-manylinux_2_41_x86_64.whl", hash = "sha256:15a68341949b7ddb3630d8d3a49d9537bbc143ee235dca77cc3f4047237c8299", size = 255386, upload_time = "2025-09-05T14:49:58.576Z" }, ] [[package]] name = "rfc3986" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026 } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326 }, + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, ] [[package]] @@ -2623,90 +2685,90 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload_time = "2025-07-25T07:32:58.125Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368 }, + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload_time = "2025-07-25T07:32:56.73Z" }, ] [[package]] name = "rpds-py" version = "0.27.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795 }, - { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121 }, - { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976 }, - { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953 }, - { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915 }, - { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883 }, - { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699 }, - { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713 }, - { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324 }, - { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646 }, - { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137 }, - { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343 }, - { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497 }, - { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790 }, - { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741 }, - { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574 }, - { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051 }, - { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395 }, - { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334 }, - { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691 }, - { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868 }, - { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469 }, - { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125 }, - { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341 }, - { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511 }, - { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736 }, - { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462 }, - { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034 }, - { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392 }, - { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355 }, - { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138 }, - { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247 }, - { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699 }, - { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852 }, - { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582 }, - { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126 }, - { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486 }, - { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832 }, - { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249 }, - { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356 }, - { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300 }, - { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714 }, - { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943 }, - { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472 }, - { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676 }, - { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313 }, - { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080 }, - { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868 }, - { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750 }, - { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688 }, - { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225 }, - { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361 }, - { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493 }, - { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623 }, - { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800 }, - { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943 }, - { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739 }, - { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120 }, - { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944 }, - { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283 }, - { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320 }, - { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760 }, - { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476 }, - { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418 }, - { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771 }, - { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022 }, - { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787 }, - { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538 }, - { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512 }, - { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813 }, - { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385 }, - { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097 }, +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload_time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload_time = "2025-08-27T12:13:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload_time = "2025-08-27T12:13:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload_time = "2025-08-27T12:13:13.008Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload_time = "2025-08-27T12:13:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload_time = "2025-08-27T12:13:15.774Z" }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload_time = "2025-08-27T12:13:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload_time = "2025-08-27T12:13:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload_time = "2025-08-27T12:13:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload_time = "2025-08-27T12:13:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload_time = "2025-08-27T12:13:22.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload_time = "2025-08-27T12:13:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload_time = "2025-08-27T12:13:25.557Z" }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload_time = "2025-08-27T12:13:26.967Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload_time = "2025-08-27T12:13:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload_time = "2025-08-27T12:13:29.71Z" }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload_time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload_time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload_time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload_time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload_time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload_time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload_time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload_time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload_time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload_time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload_time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload_time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload_time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload_time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload_time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload_time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload_time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload_time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload_time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload_time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload_time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload_time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload_time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload_time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload_time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload_time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload_time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload_time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload_time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload_time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload_time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload_time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload_time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload_time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload_time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload_time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload_time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload_time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload_time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload_time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload_time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload_time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload_time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload_time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload_time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload_time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload_time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload_time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload_time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload_time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload_time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload_time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload_time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload_time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload_time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload_time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload_time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload_time = "2025-08-27T12:15:03.961Z" }, ] [[package]] @@ -2716,35 +2778,35 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865 } +sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload_time = "2025-08-19T11:15:10.694Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702 }, + { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload_time = "2025-08-19T11:15:07.696Z" }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, ] [[package]] @@ -2755,9 +2817,9 @@ dependencies = [ { name = "click" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927 } +sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload_time = "2023-07-01T13:31:49.607Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649 }, + { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, ] [[package]] @@ -2770,28 +2832,28 @@ dependencies = [ { name = "scipy" }, { name = "threadpoolctl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818 }, - { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997 }, - { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381 }, - { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296 }, - { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256 }, - { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382 }, - { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042 }, - { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180 }, - { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660 }, - { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057 }, - { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731 }, - { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852 }, - { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094 }, - { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436 }, - { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749 }, - { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906 }, - { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836 }, - { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236 }, - { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593 }, - { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007 }, +sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload_time = "2025-09-09T08:21:29.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload_time = "2025-09-09T08:20:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload_time = "2025-09-09T08:20:45.468Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload_time = "2025-09-09T08:20:47.982Z" }, + { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload_time = "2025-09-09T08:20:50.366Z" }, + { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload_time = "2025-09-09T08:20:52.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload_time = "2025-09-09T08:20:54.731Z" }, + { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload_time = "2025-09-09T08:20:57.313Z" }, + { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload_time = "2025-09-09T08:20:59.671Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload_time = "2025-09-09T08:21:01.71Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload_time = "2025-09-09T08:21:04.234Z" }, + { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload_time = "2025-09-09T08:21:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload_time = "2025-09-09T08:21:08.628Z" }, + { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload_time = "2025-09-09T08:21:11.486Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload_time = "2025-09-09T08:21:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload_time = "2025-09-09T08:21:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload_time = "2025-09-09T08:21:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload_time = "2025-09-09T08:21:20.695Z" }, + { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload_time = "2025-09-09T08:21:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload_time = "2025-09-09T08:21:24.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload_time = "2025-09-09T08:21:26.713Z" }, ] [[package]] @@ -2801,103 +2863,103 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259 }, - { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976 }, - { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905 }, - { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066 }, - { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407 }, - { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281 }, - { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222 }, - { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586 }, - { url = "https://files.pythonhosted.org/packages/34/95/20e02ca66fb495a95fba0642fd48e0c390d0ece9b9b14c6e931a60a12dea/scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e", size = 38550641 }, - { url = "https://files.pythonhosted.org/packages/92/ad/13646b9beb0a95528ca46d52b7babafbe115017814a611f2065ee4e61d20/scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851", size = 25456070 }, - { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856 }, - { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626 }, - { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689 }, - { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151 }, - { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824 }, - { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881 }, - { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219 }, - { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147 }, - { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766 }, - { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169 }, - { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682 }, - { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926 }, - { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152 }, - { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410 }, - { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880 }, - { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425 }, - { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622 }, - { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985 }, - { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367 }, - { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992 }, - { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109 }, - { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110 }, - { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110 }, - { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014 }, - { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155 }, - { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174 }, - { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752 }, - { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010 }, - { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061 }, - { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914 }, - { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193 }, - { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172 }, - { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326 }, - { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036 }, - { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341 }, - { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840 }, - { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716 }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088 }, - { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455 }, - { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374 }, +sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599, upload_time = "2025-09-11T17:48:08.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259, upload_time = "2025-09-11T17:40:39.329Z" }, + { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976, upload_time = "2025-09-11T17:40:46.82Z" }, + { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905, upload_time = "2025-09-11T17:40:52.545Z" }, + { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066, upload_time = "2025-09-11T17:40:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407, upload_time = "2025-09-11T17:41:06.796Z" }, + { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281, upload_time = "2025-09-11T17:41:15.055Z" }, + { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222, upload_time = "2025-09-11T17:41:23.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586, upload_time = "2025-09-11T17:41:31.021Z" }, + { url = "https://files.pythonhosted.org/packages/34/95/20e02ca66fb495a95fba0642fd48e0c390d0ece9b9b14c6e931a60a12dea/scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e", size = 38550641, upload_time = "2025-09-11T17:41:36.61Z" }, + { url = "https://files.pythonhosted.org/packages/92/ad/13646b9beb0a95528ca46d52b7babafbe115017814a611f2065ee4e61d20/scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851", size = 25456070, upload_time = "2025-09-11T17:41:41.3Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856, upload_time = "2025-09-11T17:41:47.695Z" }, + { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626, upload_time = "2025-09-11T17:41:52.642Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689, upload_time = "2025-09-11T17:41:57.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151, upload_time = "2025-09-11T17:42:02.303Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824, upload_time = "2025-09-11T17:42:07.549Z" }, + { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881, upload_time = "2025-09-11T17:42:13.255Z" }, + { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219, upload_time = "2025-09-11T17:42:18.765Z" }, + { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147, upload_time = "2025-09-11T17:42:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766, upload_time = "2025-09-11T17:43:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169, upload_time = "2025-09-11T17:43:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682, upload_time = "2025-09-11T17:42:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926, upload_time = "2025-09-11T17:42:35.845Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152, upload_time = "2025-09-11T17:42:40.07Z" }, + { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410, upload_time = "2025-09-11T17:42:44.313Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880, upload_time = "2025-09-11T17:42:49.325Z" }, + { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425, upload_time = "2025-09-11T17:42:54.711Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622, upload_time = "2025-09-11T17:43:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985, upload_time = "2025-09-11T17:43:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367, upload_time = "2025-09-11T17:43:14.44Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992, upload_time = "2025-09-11T17:43:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109, upload_time = "2025-09-11T17:43:35.713Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110, upload_time = "2025-09-11T17:43:40.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110, upload_time = "2025-09-11T17:43:44.981Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014, upload_time = "2025-09-11T17:43:49.074Z" }, + { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155, upload_time = "2025-09-11T17:43:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174, upload_time = "2025-09-11T17:44:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752, upload_time = "2025-09-11T17:44:05.619Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010, upload_time = "2025-09-11T17:44:11.322Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061, upload_time = "2025-09-11T17:45:09.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914, upload_time = "2025-09-11T17:45:14.73Z" }, + { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193, upload_time = "2025-09-11T17:44:16.757Z" }, + { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172, upload_time = "2025-09-11T17:44:21.783Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326, upload_time = "2025-09-11T17:44:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036, upload_time = "2025-09-11T17:44:30.527Z" }, + { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341, upload_time = "2025-09-11T17:44:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840, upload_time = "2025-09-11T17:44:41.76Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716, upload_time = "2025-09-11T17:44:47.316Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088, upload_time = "2025-09-11T17:44:53.011Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455, upload_time = "2025-09-11T17:44:58.899Z" }, + { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374, upload_time = "2025-09-11T17:45:03.45Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "simpleeval" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358 } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762 }, + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "soupsieve" version = "2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload_time = "2025-08-27T15:39:51.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679 }, + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload_time = "2025-08-27T15:39:50.179Z" }, ] [[package]] @@ -2909,18 +2971,18 @@ dependencies = [ { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, ] [[package]] name = "structlog" version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138 } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720 }, + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, ] [[package]] @@ -2932,18 +2994,18 @@ dependencies = [ { name = "pyyaml" }, { name = "xlsxwriter" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564 } +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860 }, + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, ] [[package]] @@ -3003,7 +3065,7 @@ requires-dist = [ { name = "pandas", specifier = ">=2.2.3" }, { name = "pint", specifier = ">=0.24.4" }, { name = "pydantic", specifier = ">=2.11.7" }, - { name = "pydeflate", specifier = ">=2.1.3" }, + { name = "pydeflate", specifier = ">=2.3.3" }, { name = "requests", specifier = ">=2.32.3" }, { name = "savepagenow", specifier = ">=1.3.0" }, { name = "scipy", specifier = ">=1.16.1" }, @@ -3046,27 +3108,27 @@ docs = [ name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, ] [[package]] name = "threadpoolctl" version = "3.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload_time = "2025-03-13T13:49:23.031Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload_time = "2025-03-13T13:49:21.846Z" }, ] [[package]] @@ -3076,37 +3138,37 @@ 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 } +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload_time = "2024-10-24T14:58:29.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload_time = "2024-10-24T14:58:28.029Z" }, ] [[package]] name = "tomlkit" version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload_time = "2025-06-05T07:13:44.947Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload_time = "2025-06-05T07:13:43.546Z" }, ] [[package]] name = "tornado" version = "6.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821 } +sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821, upload_time = "2025-08-08T18:27:00.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563 }, - { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729 }, - { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295 }, - { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644 }, - { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878 }, - { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549 }, - { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973 }, - { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954 }, - { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023 }, - { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427 }, - { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456 }, + { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563, upload_time = "2025-08-08T18:26:42.945Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729, upload_time = "2025-08-08T18:26:44.473Z" }, + { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295, upload_time = "2025-08-08T18:26:46.021Z" }, + { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644, upload_time = "2025-08-08T18:26:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878, upload_time = "2025-08-08T18:26:50.599Z" }, + { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549, upload_time = "2025-08-08T18:26:51.864Z" }, + { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973, upload_time = "2025-08-08T18:26:53.625Z" }, + { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954, upload_time = "2025-08-08T18:26:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023, upload_time = "2025-08-08T18:26:56.677Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427, upload_time = "2025-08-08T18:26:57.91Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456, upload_time = "2025-08-08T18:26:59.207Z" }, ] [[package]] @@ -3116,18 +3178,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, ] [[package]] @@ -3143,9 +3205,21 @@ dependencies = [ { name = "scikit-learn" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/67/c69f8c46fd46e01480ca10280ab612253255a729a850e2d61fdf0ea08258/tsam-2.3.9.tar.gz", hash = "sha256:1f219eef05788d199af1ff61bd5a3d9217a26f9279988b1ef4b7d5af2757ed15", size = 223755 } +sdist = { url = "https://files.pythonhosted.org/packages/e7/67/c69f8c46fd46e01480ca10280ab612253255a729a850e2d61fdf0ea08258/tsam-2.3.9.tar.gz", hash = "sha256:1f219eef05788d199af1ff61bd5a3d9217a26f9279988b1ef4b7d5af2757ed15", size = 223755, upload_time = "2025-06-16T07:30:03.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/e7/5c072b990bddccc4a78a186d641e50257993c50658cddc0d4bf300acd1e1/tsam-2.3.9-py3-none-any.whl", hash = "sha256:edcc4febb9e1dacc028bc819d710974ede8f563467c3d235a250f46416f93a1b", size = 36816, upload_time = "2025-06-16T07:30:01.562Z" }, +] + +[[package]] +name = "typeguard" +version = "4.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload_time = "2025-06-18T09:56:07.624Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/e7/5c072b990bddccc4a78a186d641e50257993c50658cddc0d4bf300acd1e1/tsam-2.3.9-py3-none-any.whl", hash = "sha256:edcc4febb9e1dacc028bc819d710974ede8f563467c3d235a250f46416f93a1b", size = 36816 }, + { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload_time = "2025-06-18T09:56:05.999Z" }, ] [[package]] @@ -3158,18 +3232,31 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/ea/9cc57c3c627fd7a6a0907ea371019fe74c3ec00e3cf209a6864140a602ad/typer-0.19.1.tar.gz", hash = "sha256:cb881433a4b15dacc875bb0583d1a61e78497806741f9aba792abcab390c03e6", size = 104802 } +sdist = { url = "https://files.pythonhosted.org/packages/03/ea/9cc57c3c627fd7a6a0907ea371019fe74c3ec00e3cf209a6864140a602ad/typer-0.19.1.tar.gz", hash = "sha256:cb881433a4b15dacc875bb0583d1a61e78497806741f9aba792abcab390c03e6", size = 104802, upload_time = "2025-09-20T08:59:22.692Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/fa/6473c00b5eb26a2ba427813107699d3e6f4e1a4afad3f7494b17bdef3422/typer-0.19.1-py3-none-any.whl", hash = "sha256:914b2b39a1da4bafca5f30637ca26fa622a5bf9f515e5fdc772439f306d5682a", size = 46876 }, + { url = "https://files.pythonhosted.org/packages/1e/fa/6473c00b5eb26a2ba427813107699d3e6f4e1a4afad3f7494b17bdef3422/typer-0.19.1-py3-none-any.whl", hash = "sha256:914b2b39a1da4bafca5f30637ca26fa622a5bf9f515e5fdc772439f306d5682a", size = 46876, upload_time = "2025-09-20T08:59:21.153Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload_time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload_time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload_time = "2023-05-24T20:25:47.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload_time = "2023-05-24T20:25:45.287Z" }, ] [[package]] @@ -3179,45 +3266,57 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, ] [[package]] name = "unidecode" version = "1.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149 } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, +] + +[[package]] +name = "url-normalize" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/31/febb777441e5fcdaacb4522316bf2a527c44551430a4873b052d545e3279/url_normalize-2.2.1.tar.gz", hash = "sha256:74a540a3b6eba1d95bdc610c24f2c0141639f3ba903501e61a52a8730247ff37", size = 18846, upload_time = "2025-04-26T20:37:58.553Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837 }, + { url = "https://files.pythonhosted.org/packages/bc/d9/5ec15501b675f7bc07c5d16aa70d8d778b12375686b6efd47656efdc67cd/url_normalize-2.2.1-py3-none-any.whl", hash = "sha256:3deb687587dc91f7b25c9ae5162ffc0f057ae85d22b1e15cf5698311247f567b", size = 14728, upload_time = "2025-04-26T20:37:57.217Z" }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, ] [[package]] name = "validators" version = "0.35.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399 } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712 }, + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, ] [[package]] @@ -3229,33 +3328,33 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808 } +sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload_time = "2025-08-13T14:24:07.464Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279 }, + { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload_time = "2025-08-13T14:24:05.111Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, ] [[package]] @@ -3267,88 +3366,88 @@ dependencies = [ { name = "requests" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385 }, + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, ] [[package]] name = "webencodings" version = "0.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload_time = "2017-04-05T20:21:34.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload_time = "2017-04-05T20:21:32.581Z" }, ] [[package]] name = "wheel" version = "0.45.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494 }, + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, ] [[package]] name = "win32-setctime" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, ] [[package]] name = "xlrd" version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167 } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555 }, + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, ] [[package]] name = "xlrd3" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847 } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268 }, + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, ] [[package]] name = "xlsx2csv" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390 } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904 }, + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, ] [[package]] name = "xlsxwriter" version = "3.2.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/2c/c06ef49dc36e7954e55b802a8b231770d286a9758b3d936bd1e04ce5ba88/xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c", size = 215940 } +sdist = { url = "https://files.pythonhosted.org/packages/46/2c/c06ef49dc36e7954e55b802a8b231770d286a9758b3d936bd1e04ce5ba88/xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c", size = 215940, upload_time = "2025-09-16T00:16:21.63Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315 }, + { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315, upload_time = "2025-09-16T00:16:20.108Z" }, ] [[package]] name = "xlwt" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929 } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981 }, + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, ] From 625eb2afc4ed255117598928d0e39ee3dbe17e52 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:46:46 +0100 Subject: [PATCH 31/81] Documentation (#74) --- .codespell.ignore | 2 +- .github/instructions/copilot-instructions.md | 2 +- .github/workflows/ci.yaml | 2 +- .gitignore | 2 +- .pre-commit-config.yaml | 4 +- CITATIONS.cff | 17 +++ CONTRIBUTING.md | 5 + MANIFEST.in | 11 ++ README.md | 43 ++---- REUSE.toml | 12 +- docs/api/commons/commons.md | 1 + docs/api/commons/dateformatenum.md | 1 + docs/api/commons/fileextensionenum.md | 1 + docs/api/datapackage.md | 1 + docs/api/parameter.md | 1 + docs/api/source.md | 1 + docs/api/source_collection.md | 1 + docs/api/technology.md | 1 + docs/api/technology_collection.md | 1 + docs/api/units/customundefineduniterror.md | 1 + docs/api/units/specialunitregistry.md | 1 + docs/contributing/contributors.md | 2 +- docs/contributing/instructions.md | 10 +- docs/examples/dea_storage.md | 84 +++++++++++ docs/home/citing.md | 10 +- docs/home/contacts.md | 4 +- docs/home/installation.md | 8 +- docs/home/license.md | 4 +- docs/home/release-notes.md | 2 +- docs/home/users.md | 14 +- docs/index.md | 15 +- docs/user_guide/class-diagram.puml | 2 +- docs/user_guide/datapackage.md | 113 +++++++++++++++ docs/user_guide/design.md | 8 +- docs/{ => user_guide}/models.md | 23 ++- docs/user_guide/parameter.md | 34 ++--- docs/user_guide/source.md | 82 +++++++++++ docs/user_guide/source_collection.md | 97 +++++++++++++ docs/user_guide/technology.md | 136 ++++++++++++++++++ docs/user_guide/technology_collection.md | 128 +++++++++++++++++ mkdocs.yaml | 38 ++++- pyproject.toml | 10 +- src/technologydata/__init__.py | 3 +- src/technologydata/constants/__init__.py | 2 +- .../constants/energy_density.py | 2 +- src/technologydata/datapackage.py | 2 +- .../dea_energy_storage/dea_energy_storage.py | 2 +- src/technologydata/parameter.py | 14 +- src/technologydata/source.py | 6 +- src/technologydata/source_collection.py | 2 +- src/technologydata/technologies/__init__.py | 2 +- .../technologies/growth_models.py | 3 +- src/technologydata/technology.py | 2 +- src/technologydata/technology_collection.py | 2 +- src/technologydata/utils/__init__.py | 2 +- src/technologydata/utils/carriers.txt | 2 +- src/technologydata/utils/commons.py | 2 +- src/technologydata/utils/heating_values.txt | 2 +- src/technologydata/utils/units.py | 3 +- test/conftest.py | 2 +- test/test_commons.py | 2 +- test/test_datapackage.py | 2 +- test/test_dea_energy_storage.py | 2 +- test/test_growth_models.py | 3 +- test/test_parameter.py | 2 +- test/test_source.py | 2 +- test/test_source_collection.py | 2 +- test/test_technology.py | 2 +- test/test_technology_collection.py | 2 +- test/test_units.py | 2 +- 70 files changed, 848 insertions(+), 163 deletions(-) create mode 100644 CITATIONS.cff create mode 100644 CONTRIBUTING.md create mode 100644 MANIFEST.in create mode 100644 docs/api/commons/commons.md create mode 100644 docs/api/commons/dateformatenum.md create mode 100644 docs/api/commons/fileextensionenum.md create mode 100644 docs/api/datapackage.md create mode 100644 docs/api/parameter.md create mode 100644 docs/api/source.md create mode 100644 docs/api/source_collection.md create mode 100644 docs/api/technology.md create mode 100644 docs/api/technology_collection.md create mode 100644 docs/api/units/customundefineduniterror.md create mode 100644 docs/api/units/specialunitregistry.md create mode 100644 docs/examples/dea_storage.md create mode 100644 docs/user_guide/datapackage.md rename docs/{ => user_guide}/models.md (97%) create mode 100644 docs/user_guide/source.md create mode 100644 docs/user_guide/source_collection.md create mode 100644 docs/user_guide/technology.md create mode 100644 docs/user_guide/technology_collection.md diff --git a/.codespell.ignore b/.codespell.ignore index a292ceee..a706ba1e 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT CAF diff --git a/.github/instructions/copilot-instructions.md b/.github/instructions/copilot-instructions.md index 2d93e54e..169de61f 100644 --- a/.github/instructions/copilot-instructions.md +++ b/.github/instructions/copilot-instructions.md @@ -1,7 +1,7 @@ # Copilot Coding Agent Instructions for `technologydata` - - First of all, thank you for your contributions to `technologydata`! We enthusiastically invite anyone interested in `technologydata` to share new ideas, provide suggestions, submit bug reports, or contribute code changes. @@ -17,7 +11,7 @@ We enthusiastically invite anyone interested in `technologydata` to share new id ## Where to go for help -- To **discuss** with other `technologydata` users, organise projects, share news, and get in touch with the community, please refer to the [Contacts](/docs/home/contacts.md) page. +- To **discuss** with other `technologydata` users, organise projects, share news, and get in touch with the community, please refer to the [Contacts](../home/contacts.md) page. - For **guidelines to contribute**, stay right here. ## Code contributions @@ -183,6 +177,8 @@ The documentation is generated with [MkDocs](https://www.mkdocs.org/). The docum MkDocs offers the possibility to start a built-in development server to preview the documentation as you work on it. To start the development server run: +### Building the documentation locally + ```bash mkdocs serve ``` diff --git a/docs/examples/dea_storage.md b/docs/examples/dea_storage.md new file mode 100644 index 00000000..4b1788cb --- /dev/null +++ b/docs/examples/dea_storage.md @@ -0,0 +1,84 @@ +# Danish Energy Agency Parser Documentation + +## Overview + +The Danish Energy Agency (DEA) data parser `dea_energy_storage.py` demonstrates a full data-cleaning and transformation pipeline for converting raw tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py`. + +## Dataset Description + +The original dataset is available at this [link](https://ens.dk/media/6589/download). A full description of the dataset is available at this [link](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx`. + +The dataset is in Excel format, and it includes, under the data sheet `alldata_flat`, a flat table of technology parameters for a range of energy storage technologies. Columns include `Technology`, `ws`, `par` (parameter name), `val` (value), `unit`, `year`, `est` (case/estimate), `priceyear`, plus metadata columns such as `cat`, `ref`, `note`. Rows are individual parameter records (parameter value + unit + context) for technologies and estimation cases. + +## Parser description + +The parser is articulated in the following steps. + +### Command line argument parsing + +Function `parse_input_arguments()` defines and parses the command-line arguments: + +- `--num_digits` (int, default 4) β€” number of decimals used when rounding numeric values. The default value is 4. +- `--store_source` (boolean flag) β€” whether to store the source on the Wayback Machine. The default value is `false`. +- `--filter_params` (boolean flag) β€” whether to limit exported parameters to a fixed allowed set. The default value is `false`. +- `--export_schema` (boolean flag) β€” export JSON schema files. The default value is `false`. + +### Read the raw data + +The script reads the raw data available at `src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx`, under sheet `alldata_flat`, in a `pandas` dataframe. It uses `pandas.read_excel(..., engine=calamine, dtype=str)`. All entries are handled as strings initially. + +### Data cleaning, validation and dealing with missing/null values + +The data cleaning and validation happens with the following steps. + +Function `drop_invalid_rows(df)` validates whether required columns are present. It drops rows with missing/null or empty critical fields (`Technology`, `par`, `val`, `year`) and keeps rows where `year` contains a 4-digit year and `val` contains numeric characters and no comparator symbols (`<`, `>`, `≀`, `β‰₯`). + +Function `clean_technology_string()` normalizes text fields by removing leading 3-digit numeric codes, trims whitespace and lower-cases the string for consistent matching. It is applied to the columns `Technology` and `ws`. As an example, `clean_technology_string()` converts `151b Hydrogen Storage - LOHC` to `hydrogen storage - lohc`. + +Function `extract_year()` extracts the first sequence of digits from the `year` column and converts it to an integer. The column contains in fact entries like `Uncertainty (2050)` (str) which are converted to `2050` (int). + +Function `clean_parameter_string()` removes leading hyphens, removes text inside square brackets (units/notes), collapses extra spaces and lower-cases the parameter name. It is applied to the `par` column. + +Function `standardize_units()` is applied to columns `par` and `unit`. It completes missing units based on parameter name (e.g., `energy storage capacity for one unit` is mapped to the unit `MWh`) via a parameter-to-unit map. Moreover, it replaces known incorrect unit strings as `⁰C` -> `C` or `m2` to `meter**2`. The unit substitutions are driven by the `pint` documentation available at this [link](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt). + +Function `Commons.update_unit_with_currency_year(unit, priceyear)`, if present, appends `priceyear` information to currency units. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `EUR_2021`. + +Function `format_val_number(value, num_decimals)` parses numeric formats including comma decimal separators and scientific notation variants (e.g., `Γ—10`) and converts them to float and rounds them to `num_decimals`. + +The parser also applies the following corrections and substitutions: + +- Convert `MEUR_2020` and `kEUR_2020`/`KEUR_2020` to `EUR_2020` and scale numeric `val` accordingly (Γ—1e6 or Γ—1e3). +- Specific unit fixes (example: `mol/s/m/MPa1/2` β†’ `mol/s/m/Pa` with value scaling). +- Certain `par` values (e.g., `energy storage capacity for one unit`, `tank volume of example`) are normalized to `capacity`. + +Function `clean_est_string()` normalizes the `est` column by casefolding it and by replacing `ctrl` with `control`. + +Function `filter_parameters(df, filter_flag)`, if `filter_flag` is true, keeps only an allowed set of parameters (e.g., `technical lifetime`, `fixed o&m`, `specific investment`, `variable o&m`, `charge efficiency`, `discharge efficiency`, `capacity`). Otherwise returns the full set. + +### Populate and export the source and technology collections + +Function `build_technology_collection()`: + +- if `store_source` is set, constructs a `Source` object for the DEA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. +- groups the cleaned DataFrame by `est`, `year`, `ws`, `Technology`. +- for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `units`, `sources`, `provenance`). +- creates a `Technology` object for each group, with `name` = `ws`, `detailed_technology` = `Technology`, `year`=`year`, `region` = `EU`, `case` = `est` and collects them into a `TechnologyCollection` object. +- writes the `TechnologyCollection` object to a `technologies.json`. +- if `--export_schema` is used, schema files produced during export are moved to the sub-folder `src/technologydata/package_data/schemas`. + +## Running the parser + +### Execution instructions + +From repository root: + +- Basic run: `python src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py` +- Example with options: `--num_digits 3 --store_source --filter_params --export_schema` + +### Outputs + +The parser generates the following outputs: + +- `src/technologydata/package_data/dea_energy_storage/technologies.json`. +- `src/technologydata/package_data/dea_energy_storage/sources.json`. +- Optional schema files moved to `src/technologydata/package_data/schemas` when `--export_schema` is used. diff --git a/docs/home/citing.md b/docs/home/citing.md index 5922dbef..94157163 100644 --- a/docs/home/citing.md +++ b/docs/home/citing.md @@ -1,3 +1,11 @@ # Citing -TODO +If you use `technologydata` for your research, we suggest the following way of citing it. + +```text +technologydata: Data for Energy Systems Models. + +The package is available at: https://github.com/open-energy-transition/technology-data/tree/prototype-2. + +Authors: Johannes Hampp, Fabrizio Finozzi +``` diff --git a/docs/home/contacts.md b/docs/home/contacts.md index edec8092..a5ceb67f 100644 --- a/docs/home/contacts.md +++ b/docs/home/contacts.md @@ -3,5 +3,5 @@ Please consider the following ways to reach out to the community and the developers: * To **discuss** with other `technology-data` users, organise projects, share news, and get in touch with the community you can use the [Discord server](https://discord.gg/T7YZbnVU). -* For **bugs and feature requests**, please use the [issue tracker](https://github.com/PyPSA/technology-data/issues). -* We strongly welcome anyone interested in providing **contributions** to this project. If you have any ideas, suggestions or encounter problems, feel invited to file issues or make pull requests on [GitHub](https://github.com/PyPSA/technology-data). +* For **bugs and feature requests**, please use the [issue tracker](https://github.com/open-energy-transition/technology-data/issues). +* We strongly welcome anyone interested in providing **contributions** to this project. If you have any ideas, suggestions or encounter problems, feel invited to file issues or make pull requests on [GitHub](https://github.com/open-energy-transition/technology-data). diff --git a/docs/home/installation.md b/docs/home/installation.md index 6238f0c1..df05a97e 100644 --- a/docs/home/installation.md +++ b/docs/home/installation.md @@ -1,6 +1,6 @@ # Installation -You can install `technologydata` using either **PyPI** or **conda-forge**. Choose the method that best fits your workflow. +You can install `technologydata` using **PyPI**. ## Using pip (from PyPI) @@ -13,9 +13,3 @@ pip install technologydata ```bash uv pip install technologydata ``` - -## Using conda (from conda-forge) - -```bash -conda install -c conda-forge technologydata -``` diff --git a/docs/home/license.md b/docs/home/license.md index ae029c5b..122cfe36 100644 --- a/docs/home/license.md +++ b/docs/home/license.md @@ -1,11 +1,11 @@ # License -`technology-data` is licensed under the open-source [MIT](https://opensource.org/license/mit) license: +`technologydata` is licensed under the open-source [MIT](https://opensource.org/license/mit) license: ```text MIT License -Copyright The technology-data authors +Copyright (c) 2026 technologydata contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the diff --git a/docs/home/release-notes.md b/docs/home/release-notes.md index 36a9d8bd..3fd24143 100644 --- a/docs/home/release-notes.md +++ b/docs/home/release-notes.md @@ -6,4 +6,4 @@ The features listed below are not released yet, but will be part of the next release! To use the features already you have to clone and install the repository from GitHub, e.g. using - ``pip install git+https://github.com/PyPSA/technology-data``. + ``pip install git+https://github.com/open-energy-transition/technology-data``. diff --git a/docs/home/users.md b/docs/home/users.md index 76711e86..c619137b 100644 --- a/docs/home/users.md +++ b/docs/home/users.md @@ -3,17 +3,23 @@ The following contains a list of users from academia, industry, institutions and organisations that are actively using `technologydata` or have used it in the past. The list references to specific projects to showcase the different use cases of `technologydata`. -If you are missing from this list and would like to be included, give us a shoutout on our Discord server, drop us a message elsewhere or open a pull request in the repository, as described . +If you are missing from this list and would like to be included, give us a shoutout on our [Discord server](https://discord.gg/T7YZbnVU), drop us a message elsewhere or open a pull request in the repository, as described . We would love to hear about your use case and stay in touch, in order to develop and evolve this package further. ## Academia and Research institutions -TODO + + +For the moment, this is a prototype of the new version of `technologydata`. Users will be specified at a later stage. ## Industry -TODO + + +For the moment, this is a prototype of the new version of `technologydata`. Users will be specified at a later stage. ## Institutions and Organisations -TODO + + +For the moment, this is a prototype of the new version of `technologydata`. Users will be specified at a later stage. diff --git a/docs/index.md b/docs/index.md index 7efe43cb..e66a6f9c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,15 @@ +

+ technologydata Header Logo +

+ +[![License](https://img.shields.io/pypi/l/pypsa.svg)](https://github.com/PyPSA/pypsa?tab=MIT-1-ov-file) +[![Discord](https://img.shields.io/discord/911692131440148490?logo=discord)](https://discord.gg/T7YZbnVU) + # technologydata: Techno-economic assumptions for energy models -!!! note "Under Construction" +`technologydata` is a Python package that supports the management of techno-economic assumptions for energy system models. +It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, +including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. - The documentation is currently under construction. - Please come back later. +The goal of this package is to make energy system modelling easier and more efficient, +automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. diff --git a/docs/user_guide/class-diagram.puml b/docs/user_guide/class-diagram.puml index 1892e442..6492d977 100644 --- a/docs/user_guide/class-diagram.puml +++ b/docs/user_guide/class-diagram.puml @@ -1,5 +1,5 @@ /' -SPDX-FileCopyrightText: The technology-data authors +SPDX-FileCopyrightText: technologydata contributors SPDX-License-Identifier: MIT '/ diff --git a/docs/user_guide/datapackage.md b/docs/user_guide/datapackage.md new file mode 100644 index 00000000..c67e78d5 --- /dev/null +++ b/docs/user_guide/datapackage.md @@ -0,0 +1,113 @@ +# `DataPackage` Class Documentation + + + +## Overview + +The `DataPackage` class in `technologydata` provides a container for managing collections of `Technology` and `Source` objects, supporting batch operations and import/export utilities. It is designed to facilitate the organization, sharing, and processing of technology datasets, including provenance tracking and source management. + +## Features + +- **Technology Collection**: Stores a collection of `Technology` objects via the `TechnologyCollection` class. +- **Source Collection**: Stores a collection of `Source` objects via the `SourceCollection` class. +- **Batch Operations**: Supports batch export to JSON and CSV formats. +- **Source Extraction**: Automatically extracts and aggregates sources from all parameters in the technology collection. +- **Loading Utilities**: Provides methods to load a data package from JSON files. + +## Usage Examples + +### Creating a DataPackage + +You can create a `DataPackage` by instantiating it directly or by loading from JSON files. + +```python +from technologydata import DataPackage, TechnologyCollection, SourceCollection + +# Create a DataPackage with existing collections +dp = DataPackage( + technologies=TechnologyCollection(...), + sources=SourceCollection(...), +) +``` + +### Loading from JSON + +To load a `DataPackage` from a folder containing `technologies.json` and (optionally) `sources.json`: + +```python +from technologydata import DataPackage +dp = DataPackage.from_json("path/to/data_package_folder") +``` + +This will automatically extract sources from the technologies if not already present. + +### Exporting to JSON + +Export the data package to JSON files in a specified folder: + +```python +from technologydata import DataPackage, TechnologyCollection, SourceCollection + +# Create a DataPackage with existing collections +dp = DataPackage( + technologies=TechnologyCollection(...), + sources=SourceCollection(...), +) +dp.to_json("path/to/output_folder") +``` + +### Exporting to CSV + +Export the data package to CSV files: + +```python +from technologydata import DataPackage, TechnologyCollection, SourceCollection + +# Create a DataPackage with existing collections +dp = DataPackage( + technologies=TechnologyCollection(...), + sources=SourceCollection(...), +) + +dp.to_csv("path/to/output_folder") +# Creates technologies.csv and sources.csv in the output folder +``` + +### Extracting Source Collection + +The `sources` attribute of the `DataPackage` can be automatically populated by extracting the sources from the `TechnologyCollection`. + +In this context, `extracting` means scanning the `TechnologyCollection` for all `Source` references that appear in the technology parameters, and aggregating them into a single `SourceCollection`. The extraction process yields a collection of unique sources, by removing duplicates based on all source attributes. + +```python +from technologydata.datapackage import DataPackage +from technologydata.technology_collection import TechnologyCollection + +# Create a DataPackage with existing collections +dp = DataPackage( + technologies=TechnologyCollection(...), +) + +# Populate dp.sources with all unique sources from the technology collection +dp.get_source_collection() +``` + +Extracting the source collection can be useful in scenarios such as: + +- When loading a data package that does not include a `sources.json` file, to ensure that all sources referenced in the technologies are captured. +- Before exporting the data package (to `sources.json`, CSV, or for sharing) so the package includes a consistent, central catalog of sources. +- When you need to produce provenance, citation lists, or run validations that require an explicit `SourceCollection`. + +## API Reference + +Please refer to the [API documentation](../api/datapackage.md) for detailed information on the `DataPackage` class methods and attributes. + +## Limitations & Notes + +- **Error Handling**: If neither technologies nor sources are available, source extraction will raise a `ValueError`. +- **No Data Validation**: The class assumes that the underlying `TechnologyCollection` and `SourceCollection` are valid and compatible. diff --git a/docs/user_guide/design.md b/docs/user_guide/design.md index 4f01732c..b6e8fe7a 100644 --- a/docs/user_guide/design.md +++ b/docs/user_guide/design.md @@ -1,10 +1,4 @@ -# Use cases we have designed `technology-data` for - - +# Use cases we have designed `technologydata` for ## Design diff --git a/docs/models.md b/docs/user_guide/models.md similarity index 97% rename from docs/models.md rename to docs/user_guide/models.md index 21ba4e3c..d043bf4e 100644 --- a/docs/models.md +++ b/docs/user_guide/models.md @@ -1,11 +1,4 @@ -# Title - - +# Growth Models Documentation ## Models @@ -13,6 +6,8 @@ Different models can be used to modify assumptions to fit specific scenarios. ## Supported Model Types +`technologydata` currently supports the following model types: + - **Growth models**: For projecting technology parameters forward in time using mathematical models. These are implemented as Python classes and can be used for fitting to data and making projections. @@ -21,8 +16,6 @@ These are implemented as Python classes and can be used for fitting to data and Growth models are mathematical models for projecting technology parameters over time. They are implemented as Pydantic classes in `technologydata.technologies.growth_models` and can be used for both fitting to data and making projections. The following growth models are available: -### Available Growth Models - - `LinearGrowth`: Linear model, $f(x) = m \cdot (x - x_0) + c$ - `ExponentialGrowth`: Exponential model, $f(x) = A \cdot \exp(k \cdot (x - x_0))$ - `LogisticGrowth`: Logistic (sigmoid) model, $f(x) = \frac{L}{1 + \exp(-k \cdot (x - x_0))}$ @@ -36,7 +29,7 @@ Each model exposes: - A `project(to_year)` method to project to a given year. Requires all parameters of the models to be set, either manually or via fitting. - Data points can be added via each models constructor or later via the `add_data((x, y))` function -#### Model Parameters +### Model Parameters Each model has its own parameters, e.g. for `LinearGrowth` those are `x0`, `A` and `m`. These parameters can either be set when instantiating the model or later by setting the attributes directly. @@ -44,6 +37,7 @@ Not all parameters need to be set, e.g. if you are planning on fitting one param Omitting parameters can be done by either not providing them at all or setting them to `None`. ```python +from technologydata.technologies.growth_models import LinearGrowth model = LinearGrowth(x0=2020, A=None) # Set only x0; A and m are not set # Set A after instantiation of the model @@ -75,7 +69,7 @@ and the function docstring: ::: technologydata.technologies.growth_models.LinearGrowth.function ``` -#### Creating a model and projecting a value +### Creating a model and projecting a value To create a model, e.g. for the growth of electric vehicles over time, instantiate the model with the known parameters: @@ -101,7 +95,7 @@ LinearGrowth().function(2030, x0=2020, A=5_000_000, m=2_000_000) Note that when using the `function` method directly, all parameters must be explicitly provided. (TODO: maybe function should be a classmethod or read the parameters from the instance if they are set?) -#### Fitting a model to data +### Fitting a model to data To fit a model to data points, provide the data points to the model via the `data_points` argument when instantiating the model or add them later via the `add_data((x, y))` method: @@ -209,7 +203,6 @@ Take for example the following `TechnologyCollection` for utility scale solar ph ```python from technologydata import TechnologyCollection, Technology, Parameter -from technologydata.technologies.growth_models import ExponentialGrowth, LinearGrowth tc = TechnologyCollection( technologies=[ @@ -260,6 +253,7 @@ By using models it is possible to create consistent scenarios for the parameters Using the `.project()` method of the `TechnologyCollection`, models can be specified for each parameter to be projected to specified years: ```python +from technologydata.technologies.growth_models import ExponentialGrowth, LinearGrowth tc.project( to_years=[2010, 2020, 2030, 2040, 2050], parameters={ @@ -289,6 +283,7 @@ This allows models to be reused across multiple projections, e.g. for different A model can also be fit to data points before being provided to the `project` method, allowing more control over the fitting process like providing initial guesses `p0`: ```python +from technologydata.technologies.growth_models import ExponentialGrowth model = tc.fit( parameter="electricity supply", model=ExponentialGrowth(x0=2010), diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index 5a51ca3b..0354727d 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -1,12 +1,5 @@ # `Parameter` Class Documentation - - ## Overview The `Parameter` class in `technologydata` encapsulates a value, its unit, provenance, notes, sources, and additional attributes required to describe technology parameters, such as carrier and heating value. It is designed for use in energy system modeling workflows, supporting unit handling, currency/inflation adjustments, and provenance tracking. @@ -14,7 +7,7 @@ The `Parameter` class in `technologydata` encapsulates a value, its unit, proven ## Features - **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). The default `pint` units definition file is available [here](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt) for reference. Be mindful of false unit-friends, e.g. `t = metric_ton = tonne != ton = US_ton` -- **Currency Unit Convention**: Currency units must follow the pattern `XYZ_YYYY`, where `XYZ` is the 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code (e.g., `USD`, `EUR`, `CNY`) and `YYYY` is the 4-digit year (e.g., `USD_2020`). This allows for both currency and inflation adjustment. +- **Currency Unit Convention**: Currency units must follow the pattern `XYZ_YYYY`, where `XYZ` is the 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code (e.g., `USD`, `EUR`, `CNY`) and `YYYY` is the 4-digit year (e.g., `USD_2020`). This allows for both currency and inflation adjustments. - **Carrier and Heating Value**: Optionally specify an energy carrier (e.g., `H2`) and a heating value type (`LHV` or `HHV`). - **Provenance and Notes**: Track the origin of the data and any additional notes. - **Sources**: Attach a `SourceCollection` of references for traceability. @@ -39,12 +32,12 @@ param = Parameter( provenance="Directly extracted from literature", note="Estimated", sources=SourceCollection(sources=[ - Source(name="Example Source", authors="some authors", title="Example Title") + Source(title="Example Title", authors="some authors") ]), ) >>> param -Parameter(magnitude=1000.0, units='USD_2020/kW', carrier='H2', heating_value='LHV', provenance='literature', note='Estimated', sources=SourceCollection(sources=[Source(name='Example Source', authors='some authors', title='Example Title')])) +Parameter(magnitude=1000.0, units='USD_2020/kW', carrier='H2', heating_value='LHV', provenance='literature', note='Estimated', sources=SourceCollection(sources=[Source(title='Example Title', authors='some authors', )])) ``` ### Unit Conversion (excluding currency) @@ -64,15 +57,17 @@ euro_param = param.to_currency("EUR_2023", "DEU", source="worldbank") 950.0 EUR_2023 / kilowatt ``` -Currency conversion and infation adjustment are also available for `Technology` and `TechnologyCollection` objects. -This allows to quickly adjust and harmonise the currency of all parameters in a technology or collection. +Currency conversion and inflation adjustment are also available for `Technology` and `TechnologyCollection` objects. This allows to quickly adjust and harmonise the currency of all parameters in a technology or collection. ```python # for a Technology from technologydata.technology import Technology tech = Technology( name="Example Tech", + detailed_technology="Detailed Example Tech", + case="Scenario", region="DEU", + year="2020", parameters={"cost": param} ) converted_tech = tech.to_currency("USD_2020", source="worldbank") @@ -88,7 +83,7 @@ USD_2020 / kilowatt ``` Compared to the `to_currency()` method of the `Parameter` class, the `to_currency()` methods of `Technology` and `TechnologyCollection` do not require specifying a country for inflation adjustment. -By default the `region` field of the `Technology` object or the `Technology` objects in the `TechnologyCollection` are used for inflation adjustment. +By default, the `region` field of the `Technology` object or the `Technology` objects in the `TechnologyCollection` are used for inflation adjustment. If the value of the `region` field should not be used or is not suitable, because e.g. it is not a valid ISO 3166 alpha-3 country code, the optional `overwrite_country` argument can be used to specify a different country code for inflation adjustment. ```python @@ -104,6 +99,8 @@ DEU ### Arithmetic Operations ```python +from technologydata.parameter import Parameter + param2 = Parameter(magnitude=500, units="USD_2020/kW", carrier="H2", heating_value="LHV") sum_param = param + param2 >>> print(sum_param.magnitude, sum_param.units) @@ -113,6 +110,8 @@ sum_param = param + param2 **Note:** If you try to add or subtract parameters with different carriers or heating values, a `ValueError` will be raised: ```python +from technologydata.parameter import Parameter + param_hhv = Parameter(magnitude=1, units="USD_2020/kW", carrier="H2", heating_value="HHV") param + param_hhv >>> # ValueError: Cannot add parameters with different heating values @@ -135,8 +134,7 @@ Only parameters with the same heating value can be used in arithmetic operations The heating value can be changed using the `change_heating_value` method, which uses the `carrier` attribute of the `Parameter` to determine the conversion factor between LHV and HHV based on their energy densities. - **Supported Carriers:** The method currently supports conversion for common carriers such as hydrogen and methane. For any other carrier that is not implemented, a ratio of 1 is assumed. -- **Changing Heating Value -- **Adding Carriers:** New carriers can be added programmatically by extending the `EnergyDensityLHV` and `EnergyDensityHHV` dictionaries in the `technologydata.constants`. The LHV/HHV ratio is calculated based on these two dictionaries, so any new carrier must have both LHV and HHV energy densities defined. In addition the carrier name must be a valid dimensionality defined in `technologydata.utils.units.creg`. +- **Adding Carriers:** New carriers can be added programmatically by extending the `EnergyDensityLHV` and `EnergyDensityHHV` dictionaries in `technologydata.constants`. The LHV/HHV ratio is calculated based on these two dictionaries, so any new carrier must have both LHV and HHV energy densities defined. In addition, the carrier name must be a valid dimensionality defined in `technologydata.utils.units.creg`. ### Example: Converting Between LHV and HHV @@ -165,7 +163,11 @@ param_mixed_hhv = param_mixed.change_heating_value("HHV") 0.13 kWh/kg higher_heating_value ``` -## Limitations & Missing Features +## API Reference + +Please refer to the [API documentation](../api/parameter.md) for detailed information on the `Parameter` class methods and attributes. + +## Notes - **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, the handling and merging of `provenance`, `note`, and `sources` is not yet implemented (see `TODO` comments in the code). - **Unit Conversion**: The `.to()` method does not support currency conversion; use `.to_currency()` for that. diff --git a/docs/user_guide/source.md b/docs/user_guide/source.md new file mode 100644 index 00000000..95502d97 --- /dev/null +++ b/docs/user_guide/source.md @@ -0,0 +1,82 @@ +# `Source` Class Documentation + +## Overview + +The `Source` class in `technologydata` represents bibliographic and web sources, supporting metadata, archiving, and retrieval from the Wayback Machine. It is designed to track provenance, ensure reproducibility, and facilitate the management of references for technology parameters and datasets. + +## Features + +- **Bibliographic Metadata**: Stores title, authors, and optional URL, access date, archive URL, and archive date. +- **Equality and Hashing**: Implements equality and hashing for use in sets and as dictionary keys. +- **String Representation**: Provides a readable string summary of the source. +- **Wayback Machine Archiving**: Ensures URLs are archived and retrieves archive URLs and timestamps from the Wayback Machine. +- **File Retrieval**: Downloads archived files from the Wayback Machine to a specified directory. +- **Automatic File Naming**: Determines file extension and save path based on content type or URL. + +## Usage Examples + +### Creating a Source + +```python +from technologydata.source import Source +src = Source(title="Example Source", authors="The Authors", url="http://example.com") +``` + +A `Source` object can also be used to archive and retrieve PDFs or other files format as Excel. + +### Archiving a URL + +```python +from technologydata.source import Source +src = Source(title="Example Source", authors="The Authors", url="http://example.com") + +src.ensure_in_wayback() +print(src.url_archive) # Archived URL +print(src.url_date_archive) # Archive timestamp +``` + +### Downloading an Archived File + +```python +import pathlib +from technologydata.source import Source +src = Source(title="Example Source", authors="The Authors", url="http://example.com") + +output_path = src.retrieve_from_wayback(pathlib.Path("downloads/")) +print(output_path) # Path to downloaded file +``` + +### Example usage for an Excel file + +```python +import pathlib +import pandas as pd +from technologydata.source import Source + +# Create a Source for an Excel file +excel_src = Source(title="Example Spreadsheet", authors="The Authors", url="http://example.com/data.xlsx") + +# Ensure the URL is archived (creates an archive if missing) +excel_src.ensure_in_wayback() +print("Archive URL:", excel_src.url_archive) +print("Archive timestamp:", excel_src.url_date_archive) + +# Retrieve the archived file to `downloads/` +out_path = excel_src.retrieve_from_wayback(pathlib.Path("downloads/")) +print("Downloaded to:", out_path) + +# Read the downloaded Excel file with pandas +df = pd.read_excel(out_path) +print(df.head()) +``` + +## API Reference + +Please refer to the [API documentation](../api/source.md) for detailed information on the `Source` class methods and attributes. + +## Notes + +- **Archiving**: If the URL is not set, archiving will raise a `ValueError`. +- **File Extensions**: File extension is inferred from content type or URL; unsupported types raise a `ValueError`. +- **HTTP Errors**: Download and content type retrieval may raise `requests.exceptions.RequestException`. +- **Duplicates**: Equality and hashing are based on all attributes; sources with identical metadata are considered equal. diff --git a/docs/user_guide/source_collection.md b/docs/user_guide/source_collection.md new file mode 100644 index 00000000..1ce9970d --- /dev/null +++ b/docs/user_guide/source_collection.md @@ -0,0 +1,97 @@ +# `SourceCollection` Class Documentation + +## Overview + +The `SourceCollection` class in `technologydata` represents a collection of `Source` objects, providing tools for filtering, exporting, archiving, and data conversion. It is designed to manage multiple bibliographic or web sources, supporting reproducibility and provenance tracking for technology datasets. + +## Features + +- **Collection Management**: Stores and iterates over multiple `Source` objects. +- **Filtering**: Supports regex-based filtering by title and authors. +- **Archiving**: Downloads archived files for all sources using the Wayback Machine. +- **Data Export**: Converts the collection to pandas DataFrame, CSV, and JSON formats. +- **Schema Export**: Exports a JSON schema describing the collection structure. +- **Integration**: Designed for use with technology parameters and datasets. + +## Usage Examples + +### Creating a SourceCollection + +```python +from technologydata.source import Source +from technologydata.source_collection import SourceCollection + +src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") +src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") +collection = SourceCollection(sources=[src1, src2]) +``` + +### Filtering Sources + +```python +from technologydata.source import Source +from technologydata.source_collection import SourceCollection + +src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") +src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") +collection = SourceCollection(sources=[src1, src2]) + +filtered = collection.get(title="Source One", authors="Author A") +print(filtered) # SourceCollection with sources matching the patterns +``` + +### Exporting to CSV + +```python +from technologydata.source import Source +from technologydata.source_collection import SourceCollection + +src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") +src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") +collection = SourceCollection(sources=[src1, src2]) + +collection.to_csv(path_or_buf="sources.csv") +``` + +### Exporting to JSON and Schema + +```python +import pathlib + +from technologydata.source import Source +from technologydata.source_collection import SourceCollection + +src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") +src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") +collection = SourceCollection(sources=[src1, src2]) + +collection.to_json(file_path=pathlib.Path("sources.json")) +``` + +### Downloading Archived Files + +```python +import pathlib + +from technologydata.source import Source +from technologydata.source_collection import SourceCollection + +src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") +src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") +collection = SourceCollection(sources=[src1, src2]) + +downloaded_paths = collection.retrieve_all_from_wayback(pathlib.Path("downloads/")) +print(downloaded_paths) +``` + +## API Reference + +Please refer to the [API documentation](../api/source_collection.md) for detailed information on the `SourceCollection` class methods and attributes. + +## Notes + +- **Filtering**: Regex patterns are case-insensitive and applied to non-optional attributes. +- **Archiving**: Download failures return `None` for the corresponding source. +- **Export**: Default CSV export uses UTF-8 encoding and quotes all fields. +- **Schema**: JSON schema is generated automatically and includes field descriptions. +- **Type Checking**: The class uses Pydantic for validation and type enforcement. diff --git a/docs/user_guide/technology.md b/docs/user_guide/technology.md new file mode 100644 index 00000000..2adc6faa --- /dev/null +++ b/docs/user_guide/technology.md @@ -0,0 +1,136 @@ +# `Technology` Class Documentation + +## Overview + +The `Technology` class in `technologydata` represents a single technology, including its region, year, scenario, and a flexible set of parameters. It provides methods for accessing, modifying, and transforming technology parameters, as well as for currency adjustment and scaling. + +## Features + +- **Flexible Parameter Storage**: Stores technology parameters as a dictionary mapping names to `Parameter` objects. +- **Region, Year, and Scenario**: Tracks metadata for each technology, including `region`, `year`, `case`, and `detailed technology` name. +- **Parameter Access**: Supports dictionary-like access and assignment for parameters. +- **Consistency Checking**: Checks for completeness and consistency of required parameters. +- **Parameter Calculation**: Placeholder for calculating missing or derived parameters. +- **Currency Adjustment**: Harmonizes all technology parameters to a target currency, including inflation and exchange rates. +- **Region and Scale Adjustment**: Placeholder methods for adjusting technology parameters to a different region or scaling values. + +## Usage Examples + +### Creating a Technology + +```python +from technologydata.technology import Technology +from technologydata.parameter import Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Crystalline Silicon", + case="Base", + region="DEU", + year=2020, + parameters={ + "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), + "lifetime": Parameter(magnitude=25, units="year"), + } +) +``` + +### Accessing and Setting Parameters + +```python +from technologydata.technology import Technology +from technologydata.parameter import Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Crystalline Silicon", + case="Base", + region="DEU", + year=2020, + parameters={ + "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), + "lifetime": Parameter(magnitude=25, units="year"), + } +) + +# Access a parameter +investment = tech["specific_investment"] + +# Set a parameter +tech["efficiency"] = Parameter(magnitude=0.18, units=None) +``` + +### Checking Consistency + +```python +from technologydata.technology import Technology +from technologydata.parameter import Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Crystalline Silicon", + case="Base", + region="DEU", + year=2020, + parameters={ + "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), + "lifetime": Parameter(magnitude=25, units="year"), + } +) + +is_consistent = tech.check_consistency() +print(is_consistent) # True if all required parameters are present +``` + +### Adjusting Currency + +```python +from technologydata.technology import Technology +from technologydata.parameter import Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Crystalline Silicon", + case="Base", + region="DEU", + year=2020, + parameters={ + "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), + "lifetime": Parameter(magnitude=25, units="year"), + } +) + +converted_tech = tech.to_currency("USD_2025", source="worldbank") +``` + +### Scaling Parameters + +```python +from technologydata.technology import Technology +from technologydata.parameter import Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Crystalline Silicon", + case="Base", + region="DEU", + year=2020, + parameters={ + "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), + "lifetime": Parameter(magnitude=25, units="year"), + } +) + +scaled_tech = tech.adjust_scale(1.1) +``` + +## API Reference + +Please refer to the [API documentation](../api/technology.md) for detailed information on the `Technology` class methods and attributes. + +## Notes + +- **Parameter Calculation**: The method for calculating missing or derived parameters is a placeholder and not yet implemented. +- **Region and Scale Adjustment**: Methods for region and scale adjustment are placeholders. +- **Consistency Checking**: Only checks for the presence of required parameters; does not validate values. +- **Type Checking**: The class uses Pydantic for validation and type enforcement. diff --git a/docs/user_guide/technology_collection.md b/docs/user_guide/technology_collection.md new file mode 100644 index 00000000..9b745481 --- /dev/null +++ b/docs/user_guide/technology_collection.md @@ -0,0 +1,128 @@ +# `TechnologyCollection` Class Documentation + +## Overview + +The `TechnologyCollection` class in `technologydata` represents a collection of `Technology` objects, providing tools for filtering, exporting, currency adjustment, model fitting, and projection. It is designed to manage multiple technology datasets, supporting reproducibility, scenario analysis, and future projections. + +## Features + +- **Collection Management**: Stores and iterates over multiple `Technology` objects. +- **Filtering**: Supports regex-based filtering by attributes `name`, `region`, `year`, `case`, and `detailed technology`. +- **Data Export**: Converts the collection to pandas DataFrame, CSV, and JSON formats, with schema export. +- **Currency Adjustment**: Harmonizes all technology parameters to a target currency, including inflation and exchange rates. +- **Model Fitting**: Fits growth models to technology parameters across the collection. +- **Projection**: Projects parameters to future years using growth models or statistical options. +- **Integration**: Designed for use with energy system modeling and technology parameter analysis. + +## Usage Examples + +### Creating a TechnologyCollection + +```python +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) +``` + +### Filtering Technologies + +```python +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) + +filtered = collection.get(name="Tech", region="DEU", year=2020, case="Base", detailed_technology="Solar") +print(filtered) # TechnologyCollection with matching technologies +``` + +### Exporting to CSV + +```python +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) + +collection.to_csv(path_or_buf="technologies.csv") +``` + +### Exporting to JSON and Schema + +```python +import pathlib +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) + +collection.to_json(file_path=pathlib.Path("technologies.json")) +``` + +### Currency Adjustment + +```python +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) +converted = collection.to_currency("USD_2025", source="worldbank") +``` + +### Fitting a Growth Model + +```python +from technologydata.technologies.growth_models import LinearGrowth +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) + +fitted_model = collection.fit(parameter="installed capacity", model=LinearGrowth(m=0.5, A=10)) +``` + +### Projecting Parameters + +```python +from technologydata.technologies.growth_models import LinearGrowth +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection + +tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) +tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) +collection = TechnologyCollection(technologies=[tech1, tech2]) + +projected = collection.project( + to_years=[2030, 2040], + parameters={ + "installed capacity": LinearGrowth(m=0.5, A=10), + "lifetime": "mean", + "efficiency": "NaN" + } +) +``` + +## API Reference + +Please refer to the [API documentation](../api/technology_collection.md) for detailed information on the `TechnologyCollection` class methods and attributes. + +## Notes + +- **Filtering**: Regex patterns are case-insensitive and applied to non-optional attributes. +- **Export**: Default CSV export uses UTF-8 encoding and quotes all fields. +- **Schema**: JSON schema is generated automatically and includes field descriptions. +- **Type Checking**: The class uses Pydantic for validation and type enforcement. +- **Projection**: The 'closest' option for parameter projection is not yet implemented. diff --git a/mkdocs.yaml b/mkdocs.yaml index 4304e194..7456ad0c 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,7 +1,7 @@ site_name: Documentation site_url: !ENV READTHEDOCS_CANONICAL_URL -repo_url: https://github.com/PyPSA/technology-data -repo_name: PyPSA/technology-data +repo_url: https://github.com/open-energy-transition/technology-data +repo_name: open-energy-transition/technology-data edit_uri: edit/master/docs/ # Navigation @@ -21,8 +21,34 @@ nav: - Contacts: home/contacts.md - User Guide: - - Use Cases: user_guide/design.md + - Data Package: user_guide/datapackage.md + - Models: user_guide/models.md - Parameter: user_guide/parameter.md + - Source: user_guide/source.md + - Source Collection: user_guide/source_collection.md + - Technology: user_guide/technology.md + - Technology Collection: user_guide/technology_collection.md + - Use Cases: user_guide/design.md + +- Examples: + - Danish Energy Agency Parser: examples/dea_storage.md + +- API Reference: + - Data Package: api/datapackage.md + - Parameter: api/parameter.md + - Source: api/source.md + - Source Collection: api/source_collection.md + - Technology: api/technology.md + - Technology Collection: api/technology_collection.md + - Utils: + - Commons: + - Common functionalities: api/commons/commons.md + - File extension enumeration: api/commons/fileextensionenum.md + - Date format enumeration: api/commons/dateformatenum.md + - Units: + - Custom undefined unit error: api/units/customundefineduniterror.md + - Special unit registry: api/units/specialunitregistry.md + - Contributing: - Instructions: contributing/instructions.md @@ -128,7 +154,7 @@ plugins: - argref: autolinks: - reference_prefix: ":octicons-git-pull-request-16:" - target_url: https://github.com/PyPSA/technology-data/pull/ + target_url: https://github.com/open-energy-transition/technology-data/pull/ - social: cards_layout_options: font_family: Overpass @@ -148,6 +174,7 @@ plugins: filters: - "!^_[^_]" - "!logger" + - "!iteration" heading_level: 1 merge_init_into_class: true parameter_headings: false @@ -162,9 +189,10 @@ plugins: summary: true show_if_no_docstring: true show_inheritance_diagram: true + show_root_toc_entry: false hooks: - docs/assets/overrides/hooks/shortcodes.py copyright: >- - © The technology-data authors + © technologydata contributors diff --git a/pyproject.toml b/pyproject.toml index 0303bd82..2bc9070c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT @@ -40,10 +40,10 @@ dependencies = [ ] [project.urls] -Homepage = "https://github.com/PyPSA/technology-data" -Source = "https://github.com/PyPSA/technology-data" -BugTracker = "https://github.com/PyPSA/technology-data/issues" -Changelog = "https://github.com/PyPSA/technology-data/releases" +Homepage = "https://github.com/open-energy-transition/technology-data" +Source = "https://github.com/open-energy-transition/technology-data" +BugTracker = "https://github.com/open-energy-transition/technology-data/issues" +Changelog = "https://github.com/open-energy-transition/technology-data/releases" # https://docs.astral.sh/uv/concepts/projects/dependencies/#dependency-groups # editable installation of package and non-packaged dependencies diff --git a/src/technologydata/__init__.py b/src/technologydata/__init__.py index 1e2962ef..75bb5122 100644 --- a/src/technologydata/__init__.py +++ b/src/technologydata/__init__.py @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors +# # SPDX-License-Identifier: MIT """technologydata: A package for managing and analyzing technology data used for energy system models.""" diff --git a/src/technologydata/constants/__init__.py b/src/technologydata/constants/__init__.py index 3c2b6ca2..24351d20 100644 --- a/src/technologydata/constants/__init__.py +++ b/src/technologydata/constants/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/constants/energy_density.py b/src/technologydata/constants/energy_density.py index 51b005c7..1146783f 100644 --- a/src/technologydata/constants/energy_density.py +++ b/src/technologydata/constants/energy_density.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index 10c0c340..78e91593 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py b/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py index da178dc8..69b0b562 100644 --- a/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py +++ b/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 34d59200..2db0f7b7 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -1,18 +1,8 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT -""" -Parameter class for encapsulating a value, its unit, provenance, notes, and sources. - -Examples --------- ->>> from technologydata.source import Source ->>> uv = pint.Quantity(1000, "EUR_2020/kW") ->>> src = Source(name="Example Source", authors="some authors", url="http://example.com") ->>> param = Parameter(quantity=uv, provenance="literature", note="Estimated", sources=[src]) - -""" +"""Parameter class for encapsulating a value, its unit, provenance, notes, and sources.""" import logging from typing import Annotated, Self diff --git a/src/technologydata/source.py b/src/technologydata/source.py index 7fda6b9b..73dcd338 100644 --- a/src/technologydata/source.py +++ b/src/technologydata/source.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT @@ -140,10 +140,6 @@ def ensure_in_wayback(self) -> None: an archived URL or archive date is already present. If neither is available, it attempts to archive the URL using the Wayback Machine and updates the corresponding attributes. - Parameters - ---------- - None - Returns ------- None diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index 4e14d4f2..4ab8ddd4 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/technologies/__init__.py b/src/technologydata/technologies/__init__.py index 5cbb4a64..0a01b9f6 100644 --- a/src/technologydata/technologies/__init__.py +++ b/src/technologydata/technologies/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2025 The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/technologies/growth_models.py b/src/technologydata/technologies/growth_models.py index dbfa2774..23183c8a 100644 --- a/src/technologydata/technologies/growth_models.py +++ b/src/technologydata/technologies/growth_models.py @@ -1,6 +1,7 @@ -# SPDX-FileCopyrightText: 2025 The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT + """Growth models for projecting technology parameters over time.""" import inspect diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index eafb5811..8065f8e1 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index 5e7a56ab..b3f78fa1 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/utils/__init__.py b/src/technologydata/utils/__init__.py index d7f45354..98e977c7 100644 --- a/src/technologydata/utils/__init__.py +++ b/src/technologydata/utils/__init__.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/utils/carriers.txt b/src/technologydata/utils/carriers.txt index 41108aa5..ab41391c 100644 --- a/src/technologydata/utils/carriers.txt +++ b/src/technologydata/utils/carriers.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/utils/commons.py b/src/technologydata/utils/commons.py index 64b829f9..a740a7e0 100644 --- a/src/technologydata/utils/commons.py +++ b/src/technologydata/utils/commons.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/utils/heating_values.txt b/src/technologydata/utils/heating_values.txt index 8b2162db..5afde0e4 100644 --- a/src/technologydata/utils/heating_values.txt +++ b/src/technologydata/utils/heating_values.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/src/technologydata/utils/units.py b/src/technologydata/utils/units.py index 47ce8131..d12eaac2 100644 --- a/src/technologydata/utils/units.py +++ b/src/technologydata/utils/units.py @@ -1,6 +1,7 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT + """Submodule containing pint.UnitRegistry subclasses and utility functions for handling units, conversions, and currency units.""" import json diff --git a/test/conftest.py b/test/conftest.py index a1f77a9d..07d6ba9f 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_commons.py b/test/test_commons.py index 1c302f56..e9deb158 100644 --- a/test/test_commons.py +++ b/test/test_commons.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_datapackage.py b/test/test_datapackage.py index ce345e87..d6d24489 100644 --- a/test/test_datapackage.py +++ b/test/test_datapackage.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_dea_energy_storage.py b/test/test_dea_energy_storage.py index 7a74e1ad..2da6ccc4 100644 --- a/test/test_dea_energy_storage.py +++ b/test/test_dea_energy_storage.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_growth_models.py b/test/test_growth_models.py index a29a10f9..d2a4cbf5 100644 --- a/test/test_growth_models.py +++ b/test/test_growth_models.py @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2025 The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors +# # SPDX-License-Identifier: MIT """Unit tests for growth models in technologydata.technologies.growth_models.""" diff --git a/test/test_parameter.py b/test/test_parameter.py index e99a1a42..116abcd3 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_source.py b/test/test_source.py index 92fa313b..4e3dab27 100644 --- a/test/test_source.py +++ b/test/test_source.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_source_collection.py b/test/test_source_collection.py index 7ec6e7f9..faa95fb5 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_technology.py b/test/test_technology.py index 14495733..c85b823f 100644 --- a/test/test_technology.py +++ b/test/test_technology.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index 84560d50..db1537fe 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT diff --git a/test/test_units.py b/test/test_units.py index e729a327..d2a033c4 100644 --- a/test/test_units.py +++ b/test/test_units.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: The technology-data authors +# SPDX-FileCopyrightText: technologydata contributors # # SPDX-License-Identifier: MIT """Test the creation of custom units and handling of currencies using Pint.""" From 78bd9cbdf626967f5479efe39c838bf727deb142 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 19 Jan 2026 10:27:41 +0100 Subject: [PATCH 32/81] add first version of release.yml (#84) --- .github/workflows/release.yml | 139 ++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..57f75fef --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +name: Release + +on: + push: + tags: + - v*.*.* + +env: + PREPARATION_COMMIT: '[github-actions.ci] prepare release ${{ github.ref_name }}' + +jobs: + check-preparation: + name: Check if release is prepared + runs-on: ubuntu-latest + outputs: + prepared: ${{ steps.validate.outputs.prepared }} + steps: + - uses: actions/checkout@v6 + + - name: Validate commit message + id: validate + run: | + # Check if last commit is the expected commit message + COMMIT_MESSAGE=$(git log -1 --pretty=%B) + echo "Expected: '${{ env.PREPARATION_COMMIT }}'" + echo "Received: '$COMMIT_MESSAGE'" + + prepared="false" + if [[ "$COMMIT_MESSAGE" == "${{ env.PREPARATION_COMMIT }}" ]]; then + prepared="true" + fi + + echo "prepared=$prepared" >> $GITHUB_OUTPUT + + prepare-release: + name: Prepare release + needs: [check-preparation] + if: ${{ needs.check-preparation.outputs.prepared == 'false' }} + runs-on: ubuntu-latest + steps: + - name: Find the branch for commit/ tag + run: | + branch=$(git branch -r --contains ${{ github.sha }} | grep -v 'HEAD' | head -n 1 | sed 's|origin/||' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + echo "Branch found: $branch" + echo "BRANCH_NAME=$branch" >> $GITHUB_ENV + + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ env.BRANCH_NAME }} + token: ${{ steps.generate-token.outputs.token }} + + # Start of preparation script + + - uses: actions/setup-python@v6 + with: + python-version: 3.12 + + - name: Install packages + run: | + python -m pip install uv + uv pip install --system toml + uv pip install --system setuptools_scm + uv pip install --system . + + - name: Update CITATION.cff + run: | + import re + from setuptools_scm import get_version + + version = get_version() + + with open('CITATION.cff', 'r') as file: + cff_content = file.read() + cff_content = open('CITATION.cff', 'r').read() + + updated_cff_content = re.sub(r"(?<=version: ).+(?= #)",version,cff_content,flags=re.MULTILINE) + + with open('CITATION.cff', 'w') as file: + file.write(updated_cff_content) + shell: python + + # End of preparation script + + - name: Remove previous tag + run: | + git tag -d ${{ github.ref_name }} + git push origin --delete ${{ github.ref_name }} + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v7 + with: + branch: ${{ env.BRANCH_NAME }} + commit_message: '${{ env.PREPARATION_COMMIT }}' + tagging_message: '${{ github.ref_name }}' # add tag again + push_options: '${{ github.ref_name }}' + add_options: '-u' # Never add untracked files + + build: + name: Build and verify package + needs: [check-preparation] + if: ${{ needs.check-preparation.outputs.prepared == 'true' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: hynek/build-and-inspect-python-package@v2 + + release: + name: Create GitHub release + needs: [build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: softprops/action-gh-release@v2 + with: + body: | + Revised release notes are available in the documentation. + append_body: true + generate_release_notes: true + + publish: + name: Publish to PyPI + needs: [build] + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/project/technologydata + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v6 + with: + name: Packages + path: dist + - uses: pypa/gh-action-pypi-publish@release/v1 From daa20c771edd6c9e5db1cb8fc17d3d8dfb280330 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Mon, 19 Jan 2026 10:34:28 +0100 Subject: [PATCH 33/81] Prepare Release v0.1.0 --- docs/home/release-notes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/home/release-notes.md b/docs/home/release-notes.md index 3fd24143..a7914e3a 100644 --- a/docs/home/release-notes.md +++ b/docs/home/release-notes.md @@ -1,5 +1,6 @@ # Release Notes + + +### Release v0.1.0 +First version of the new `technologydata` prototype. + From 2700fd6c05e9c7589e61151887a0e9d93b072c60 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Mon, 19 Jan 2026 10:52:42 +0100 Subject: [PATCH 34/81] Prepare Release v0.1.0 --- .github/workflows/release.yml | 11 +++-------- docs/home/release-notes.md | 3 ++- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 57f75fef..41805283 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,18 +42,13 @@ jobs: if: ${{ needs.check-preparation.outputs.prepared == 'false' }} runs-on: ubuntu-latest steps: + - name: Find the branch for commit/ tag run: | branch=$(git branch -r --contains ${{ github.sha }} | grep -v 'HEAD' | head -n 1 | sed 's|origin/||' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') echo "Branch found: $branch" echo "BRANCH_NAME=$branch" >> $GITHUB_ENV - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - ref: ${{ env.BRANCH_NAME }} - token: ${{ steps.generate-token.outputs.token }} - # Start of preparation script - uses: actions/setup-python@v6 @@ -113,6 +108,8 @@ jobs: name: Create GitHub release needs: [build] runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v6 - uses: softprops/action-gh-release@v2 @@ -129,8 +126,6 @@ jobs: environment: name: pypi url: https://pypi.org/project/technologydata - permissions: - id-token: write steps: - uses: actions/download-artifact@v6 with: diff --git a/docs/home/release-notes.md b/docs/home/release-notes.md index a7914e3a..ffd159e9 100644 --- a/docs/home/release-notes.md +++ b/docs/home/release-notes.md @@ -1,6 +1,7 @@ # Release Notes ### Release v0.1.0 -First version of the new `technologydata` prototype. +First version of the new `technologydata` prototype. From 7ca5abce2a70e9cdd75ca07c21214df77f5b8cf3 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Mon, 19 Jan 2026 11:02:16 +0100 Subject: [PATCH 35/81] Prepare Release v0.1.0 --- .github/workflows/release.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41805283..93d11255 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: if [[ "$COMMIT_MESSAGE" == "${{ env.PREPARATION_COMMIT }}" ]]; then prepared="true" fi - + prepared="true" # HOTFIX as preparation step is not working. Force true echo "prepared=$prepared" >> $GITHUB_OUTPUT prepare-release: @@ -42,13 +42,18 @@ jobs: if: ${{ needs.check-preparation.outputs.prepared == 'false' }} runs-on: ubuntu-latest steps: - - name: Find the branch for commit/ tag run: | branch=$(git branch -r --contains ${{ github.sha }} | grep -v 'HEAD' | head -n 1 | sed 's|origin/||' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') echo "Branch found: $branch" echo "BRANCH_NAME=$branch" >> $GITHUB_ENV + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ env.BRANCH_NAME }} + token: ${{ steps.generate-token.outputs.token }} + # Start of preparation script - uses: actions/setup-python@v6 @@ -109,7 +114,7 @@ jobs: needs: [build] runs-on: ubuntu-latest permissions: - contents: write + contents: write steps: - uses: actions/checkout@v6 - uses: softprops/action-gh-release@v2 @@ -126,6 +131,8 @@ jobs: environment: name: pypi url: https://pypi.org/project/technologydata + permissions: + id-token: write steps: - uses: actions/download-artifact@v6 with: From dd2e4b86bd7213a262297125d5bc34d63f1b15bc Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 30 Jan 2026 18:15:21 +0100 Subject: [PATCH 36/81] Prototest manual input USA (#68) * data: add manual_input_usa.csv * code: create parser file * code: improve manual_input_usa.py * code: update manual_input_usa.py * code: update manual_input_usa.py * code: update carrier and unit * code: pre-commit * code: new update * pre-commit * code: modify manual_input_usa.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: include pre-commit hooks * code: re-set parameter dictionary * code: move parse_input_arguments to Commons * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: move parse_input_arguments to Commons * code: add unit tests * Update src/technologydata/utils/carriers.txt Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/package_data/manual_input_usa/manual_input_usa.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/package_data/manual_input_usa/manual_input_usa.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/package_data/manual_input_usa/manual_input_usa.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update src/technologydata/parsers/manual_input_usa/manual_input_usa.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update src/technologydata/parsers/manual_input_usa/manual_input_usa.py Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * further changes * code: update manual_input_usa technologies.json * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: include changes to parser * include pre-commit * doc: update documentation' * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * include pre-commit * modify MANIFEST.in --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- MANIFEST.in | 5 +- REUSE.toml | 7 +- docs/examples/dea_storage.md | 16 +- docs/examples/manual_input_usa.md | 78 + mkdocs.yaml | 1 + src/technologydata/parsers/commons.py | 136 + .../dea_energy_storage/dea_energy_storage.py | 79 +- .../dea_energy_storage/sources.json | 0 .../dea_energy_storage/technologies.json | 0 .../manual_input_usa/manual_input_usa.py | 256 + .../parsers/manual_input_usa/sources.json | 12 + .../manual_input_usa/technologies.json | 4149 +++++++++++++++++ ...chnology_datasheet_for_energy_storage.xlsx | Bin .../parsers/raw/manual_input_usa.csv | 287 ++ src/technologydata/utils/carriers.txt | 2 + test/test_dea_energy_storage.py | 2 +- test/test_parser_commons.py | 28 + 17 files changed, 4987 insertions(+), 71 deletions(-) create mode 100644 docs/examples/manual_input_usa.md create mode 100644 src/technologydata/parsers/commons.py rename src/technologydata/{package_data => parsers}/dea_energy_storage/dea_energy_storage.py (92%) rename src/technologydata/{package_data => parsers}/dea_energy_storage/sources.json (100%) rename src/technologydata/{package_data => parsers}/dea_energy_storage/technologies.json (100%) create mode 100644 src/technologydata/parsers/manual_input_usa/manual_input_usa.py create mode 100644 src/technologydata/parsers/manual_input_usa/sources.json create mode 100644 src/technologydata/parsers/manual_input_usa/technologies.json rename src/technologydata/{package_data => parsers}/raw/Technology_datasheet_for_energy_storage.xlsx (100%) create mode 100644 src/technologydata/parsers/raw/manual_input_usa.csv create mode 100644 test/test_parser_commons.py diff --git a/MANIFEST.in b/MANIFEST.in index 4239df3a..8bfd8dee 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,7 @@ include src/technologydata/utils/*.txt -include src/technologydata/package_data/dea_energy_storage/*.json -include src/technologydata/package_data/raw/* +include src/technologydata/parsers/dea_energy_storage/*.json +include src/technologydata/parsers/manual_input_usa/*.json +include src/technologydata/parsers/raw/* include test/test_data/currency_conversion/WB_CNY_2020/* include test/test_data/currency_conversion/WB_EUR_2020/* include test/test_data/currency_conversion/WB_USD_2020/* diff --git a/REUSE.toml b/REUSE.toml index 99934bc1..c23a3566 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -8,22 +8,21 @@ path = ["uv.lock", "*.yaml", "docs/**", "*.md", "*.in"] SPDX-FileCopyrightText = "technologydata contributors" SPDX-License-Identifier = "MIT" - [[annotations]] -path = ["test/test_data/**",] +path = ["test/test_data/**"] SPDX-FileCopyrightText = "technologydata contributors" SPDX-License-Identifier = "CC-BY-4.0" [[annotations]] path = [ - "src/technologydata/package_data/dea_energy_storage/*.json", "src/technologydata/package_data/schemas/*.json" + "src/technologydata/parsers/dea_energy_storage/*.json", "src/technologydata/parsers/schemas/*.json", "src/technologydata/parsers/raw/manual_input_usa.csv", "src/technologydata/parsers/manual_input_usa/*.json", ] SPDX-FileCopyrightText = "technologydata contributors" SPDX-License-Identifier = "CC-BY-4.0" [[annotations]] path = [ - "src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx" + "src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx" ] SPDX-FileCopyrightText = "The Danish Energy Agency" SPDX-License-Identifier = "CC-BY-4.0" diff --git a/docs/examples/dea_storage.md b/docs/examples/dea_storage.md index 4b1788cb..67853a5f 100644 --- a/docs/examples/dea_storage.md +++ b/docs/examples/dea_storage.md @@ -2,11 +2,11 @@ ## Overview -The Danish Energy Agency (DEA) data parser `dea_energy_storage.py` demonstrates a full data-cleaning and transformation pipeline for converting raw tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py`. +The Danish Energy Agency (DEA) data parser `dea_energy_storage.py` demonstrates a full data-cleaning and transformation pipeline for converting raw tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py`. ## Dataset Description -The original dataset is available at this [link](https://ens.dk/media/6589/download). A full description of the dataset is available at this [link](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx`. +The original dataset is available at this [link](https://ens.dk/media/6589/download). A full description of the dataset is available at this [link](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`. The dataset is in Excel format, and it includes, under the data sheet `alldata_flat`, a flat table of technology parameters for a range of energy storage technologies. Columns include `Technology`, `ws`, `par` (parameter name), `val` (value), `unit`, `year`, `est` (case/estimate), `priceyear`, plus metadata columns such as `cat`, `ref`, `note`. Rows are individual parameter records (parameter value + unit + context) for technologies and estimation cases. @@ -25,7 +25,7 @@ Function `parse_input_arguments()` defines and parses the command-line arguments ### Read the raw data -The script reads the raw data available at `src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx`, under sheet `alldata_flat`, in a `pandas` dataframe. It uses `pandas.read_excel(..., engine=calamine, dtype=str)`. All entries are handled as strings initially. +The script reads the raw data available at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`, under sheet `alldata_flat`, in a `pandas` dataframe. It uses `pandas.read_excel(..., engine=calamine, dtype=str)`. All entries are handled as strings initially. ### Data cleaning, validation and dealing with missing/null values @@ -64,7 +64,7 @@ Function `build_technology_collection()`: - for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `units`, `sources`, `provenance`). - creates a `Technology` object for each group, with `name` = `ws`, `detailed_technology` = `Technology`, `year`=`year`, `region` = `EU`, `case` = `est` and collects them into a `TechnologyCollection` object. - writes the `TechnologyCollection` object to a `technologies.json`. -- if `--export_schema` is used, schema files produced during export are moved to the sub-folder `src/technologydata/package_data/schemas`. +- if `--export_schema` is used, schema files produced during export are moved to the sub-folder `src/technologydata/parsers/schemas`. ## Running the parser @@ -72,13 +72,13 @@ Function `build_technology_collection()`: From repository root: -- Basic run: `python src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py` +- Basic run: `python src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py` - Example with options: `--num_digits 3 --store_source --filter_params --export_schema` ### Outputs The parser generates the following outputs: -- `src/technologydata/package_data/dea_energy_storage/technologies.json`. -- `src/technologydata/package_data/dea_energy_storage/sources.json`. -- Optional schema files moved to `src/technologydata/package_data/schemas` when `--export_schema` is used. +- `src/technologydata/parsers/dea_energy_storage/technologies.json`. +- `src/technologydata/parsers/dea_energy_storage/sources.json`. +- Optional schema files moved to `src/technologydata/parsers/schemas` when `--export_schema` is used. diff --git a/docs/examples/manual_input_usa.md b/docs/examples/manual_input_usa.md new file mode 100644 index 00000000..83e75263 --- /dev/null +++ b/docs/examples/manual_input_usa.md @@ -0,0 +1,78 @@ +# Manual Input USA Parser Documentation + +## Overview + +The Manual Input USA data parser `manual_input_usa.py` demonstrates a data-cleaning and transformation pipeline for converting manually curated, USA-specific tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/manual_input_usa/manual_input_usa.py`. + +## Dataset Description + +The original dataset is a manually curated CSV file containing USA-specific technology parameters available at this [link](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv). The raw source file is included in the repository at `src/technologydata/parsers/raw/manual_input_usa.csv`. + +The dataset is in CSV format and includes a flat table of technology parameters for various energy technologies relevant to the USA context. Columns include `technology`, `parameter`, `year`, `value`, `unit`, `currency_year`, `source`, `further_description`, `financial_case`, and `scenario`. Rows are individual parameter records (parameter value + unit + context) for technologies with different scenarios and financial cases. + +## Parser description + +The parser is articulated in the following steps. + +### Command line argument parsing + +Function `CommonsParser.parse_input_arguments()` defines and parses the command-line arguments: + +- `--num_digits` (int, default 4) β€” number of decimals used when rounding numeric values. The default value is 4. +- `--store_source` (boolean flag) β€” whether to store the source on the Wayback Machine. The default value is `false`. + +### Read the raw data + +The script reads the raw data available at `src/technologydata/parsers/raw/manual_input_usa.csv` in a `pandas` dataframe. It uses `pandas.read_csv(..., dtype=str, na_values="None")`. All entries are handled as strings initially except for the `value` column which is converted to float. + +### Data cleaning, validation and dealing with missing/null values + +The data cleaning and validation happens with the following steps. + +Function `extract_units_carriers_heating_value()` extracts standardized units, carriers, and heating values from input unit strings. This function maps complex unit representations to simplified unit, carrier, and heating value combinations using a predefined dictionary of special patterns. Examples include: + +- `USD_2022/MW_FT` β†’ unit: `USD_2022/MW`, carrier: `1/FT`, heating_value: `1/LHV` +- `MWh_H2/MWh_FT` β†’ unit: `MWh/MWh`, carrier: `H2/FT`, heating_value: `LHV` +- `MWh_el/MWh_FT` β†’ unit: `MWh/MWh`, carrier: `el/FT`, heating_value: `LHV` +- `t_CO2/MWh_FT` β†’ unit: `t/MWh`, carrier: `CO2/FT`, heating_value: `LHV` +- `USD_2022/kWh_H2` β†’ unit: `USD_2022/kWh`, carrier: `1/H2`, heating_value: `LHV` +- `USD_2023/t_CO2/h` β†’ unit: `USD_2023/t/h`, carrier: `1/CO2`, heating_value: `None` +- `MWh_el/t_CO2` β†’ unit: `MWh/t`, carrier: `el/CO2`, heating_value: `LHV` +- `MWh_th/t_CO2` β†’ unit: `MWh/t`, carrier: `thermal/CO2`, heating_value: `LHV` + +The parser also fills missing values in the `scenario` column with `"not_available"`. + +The parser applies the following unit conversions: + +- Convert `per unit` to `%` and multiply the corresponding `value` by 100.0, rounding to `num_digits` decimals. + +Function `Commons.update_unit_with_currency_year(unit, currency_year)` appends `currency_year` information to currency units when present. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `USD_2022`. + +### Populate and export the source and technology collections + +Function `build_technology_collection()`: + +- if `store_source` is set, constructs a `Source` object for the manual input USA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. +- groups the cleaned DataFrame by `scenario`, `year`, `technology`. +- for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `sources`, and optionally `carrier`, `heating_value`, `units`, `note`). +- captures the `financial_case` value from rows within each group to combine with `scenario`. +- creates a `case` value by combining `scenario` and `financial_case` in the format `"{scenario} - {financial_case}"` when `financial_case` is present; otherwise uses `scenario` alone. +- creates a `Technology` object for each group, with `name` = `technology`, `detailed_technology` = `technology`, `year` = `year`, `region` = `USA`, `case` = combined case value, and collects them into a `TechnologyCollection` object. +- writes the `TechnologyCollection` object to a `technologies.json`. + +## Running the parser + +### Execution instructions + +From repository root: + +- Basic run: `python src/technologydata/parsers/manual_input_usa/manual_input_usa.py` +- Example with options: `--num_digits 3 --store_source` + +### Outputs + +The parser generates the following outputs: + +- `src/technologydata/parsers/manual_input_usa/technologies.json`. +- `src/technologydata/parsers/manual_input_usa/sources.json`. +- Optional schema files moved to `src/technologydata/parsers/schemas` when `--export_schema` is used. diff --git a/mkdocs.yaml b/mkdocs.yaml index 7456ad0c..2c8b5aa0 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -32,6 +32,7 @@ nav: - Examples: - Danish Energy Agency Parser: examples/dea_storage.md + - Manual Input USA Parser: examples/manual_input_usa.md - API Reference: - Data Package: api/datapackage.md diff --git a/src/technologydata/parsers/commons.py b/src/technologydata/parsers/commons.py new file mode 100644 index 00000000..b820b64e --- /dev/null +++ b/src/technologydata/parsers/commons.py @@ -0,0 +1,136 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Classes for Commons methods for the data parsers.""" + +import argparse +from typing import Annotated, Any + +import pydantic +from pydantic import BaseModel, ConfigDict + + +class ArgumentConfig(BaseModel): + """ + Pydantic model for defining argument configurations. + + Allows flexible configuration of command-line arguments with type checking + and validation. + """ + + name: Annotated[str, pydantic.Field(description="Name of the argument config")] + arg_type: Annotated[ + type | None, + pydantic.Field( + description="The type to which the command-line argument should be converted." + ), + ] = None + default: Annotated[ + Any | None, pydantic.Field(description="Default value of the argument config") + ] = None + help: Annotated[ + str | None, + pydantic.Field(description="A brief description of what the argument does."), + ] = None + action: Annotated[ + str | None, + pydantic.Field( + description="Specification of how the command-line arguments should be handled" + ), + ] = None + required: Annotated[ + bool, pydantic.Field(description="Flag to check whether field is mondatory") + ] = False + + # Allow extra fields for maximum flexibility + model_config = ConfigDict(extra="allow") + + +class CommonsParser: + """Commons methods for the data parsers.""" + + @staticmethod + @pydantic.validate_call + def parse_input_arguments( + additional_arguments: list[ArgumentConfig] | None = None, + description: str = "Flexible command line argument parser", + ) -> argparse.Namespace: + """ + Parse command line arguments with robust configuration. + + Parameters + ---------- + additional_arguments : Optional[List[ArgumentConfig]] + A list of ArgumentConfig objects defining extra arguments. + description : str + Description for the argument parser. Defaults to a generic message. + + Returns + ------- + argparse.Namespace + Parsed command line arguments + + Examples + -------- + >>> extra_args = [ + ... ArgumentConfig( + ... name="--input_file", + ... arg_type=str, + ... required=True, + ... help="Path to input CSV file" + ... ), + ... ArgumentConfig( + ... name="--verbose", + ... action="store_true", + ... help="Enable verbose output" + ... ) + ... ] + >>> args = CommonsParser.parse_input_arguments(additional_arguments=extra_args) + + """ + # Create parser with provided or default description + parser = argparse.ArgumentParser( + description=description, + formatter_class=argparse.RawTextHelpFormatter, + ) + + # Default arguments + default_args = [ + ArgumentConfig( + name="--num_digits", + arg_type=int, + default=4, + help="Number of significant digits to round the values.", + ), + ArgumentConfig( + name="--store_source", + action="store_true", + help="Store_source, store the source object on the wayback machine. Default: false", + ), + ] + + # Combine default and additional arguments + all_arguments = default_args + (additional_arguments or []) + + # Add arguments to parser (Option 1) + for arg_config in all_arguments: + # Convert Pydantic model to argparse-compatible dictionary + arg_dict = { + k: v + for k, v in arg_config.model_dump().items() + if v is not None and k != "name" + } + + if arg_dict.get("arg_type") is not None: + arg_dict["type"] = arg_dict.pop("arg_type") + + print("arg_dict", arg_dict) + + # Add argument to parser + parser.add_argument(arg_config.name, **arg_dict) + + # Parse arguments + args = parser.parse_args() + + return args diff --git a/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py b/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py similarity index 92% rename from src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py rename to src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py index 69b0b562..46c7fe22 100644 --- a/src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py +++ b/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py @@ -7,19 +7,19 @@ How to run: From the repository root, execute: - python src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py + python src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py Configuration options (command-line arguments): --num_digits Number of significant digits to round the values. Default: 4 --store_source Store the source object on the Wayback Machine. Default: False --filter_params Filter the parameters stored to technologies.json. Default: False + --export_schema Export the Source/TechnologyCollection schemas. Default: False Example: - python src/technologydata/package_data/dea_energy_storage/dea_energy_storage.py --num_digits 3 --store_source --filter_params + python src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py --num_digits 3 --store_source --filter_params """ -import argparse import logging import pathlib import re @@ -36,6 +36,7 @@ Technology, TechnologyCollection, ) +from technologydata.parsers.commons import ArgumentConfig, CommonsParser path_cwd = pathlib.Path.cwd() @@ -478,60 +479,26 @@ def build_technology_collection( return TechnologyCollection(technologies=list_techs) -@pydantic.validate_call -def parse_input_arguments() -> argparse.Namespace: - """ - Parse command line arguments. +if __name__ == "__main__": + # Parse input arguments - Returns - ------- - argparse.Namespace - Parsed command line arguments containing: - - Number of significant digits - - Store source flag + additional_input_args = [ + ArgumentConfig( + name="--filter_params", + action="store_true", + help="filter_params. Filter the parameters stored to technologies.json. Default: false", + ), + ArgumentConfig( + name="--export_schema", + action="store_true", + help="export_schema. Export the Source/TechnologyCollection schemas. Default: false", + ), + ] - """ - # Create the parser - parser = argparse.ArgumentParser( + input_args = CommonsParser.parse_input_arguments( + additional_arguments=additional_input_args, description="Parse the DEA technology storage dataset", - formatter_class=argparse.RawTextHelpFormatter, - ) - - # Define arguments - parser.add_argument( - "--num_digits", - type=int, - default=4, - help="Name of significant digits to round the values. ", ) - - parser.add_argument( - "--store_source", - action="store_true", - help="store_source, store the source object on the wayback machine. Default: false", - ) - - parser.add_argument( - "--filter_params", - action="store_true", - help="filter_params. Filter the parameters stored to technologies.json. Default: false", - ) - - parser.add_argument( - "--export_schema", - action="store_true", - help="export_schema. Export the Source/TechnologyCollection schemas. Default: false", - ) - - # Parse arguments - args = parser.parse_args() - - return args - - -if __name__ == "__main__": - # Parse input arguments - input_args = parse_input_arguments() logger.info("Command line arguments parsed.") # Read the raw data @@ -539,7 +506,7 @@ def parse_input_arguments() -> argparse.Namespace: path_cwd, "src", "technologydata", - "package_data", + "parsers", "raw", "Technology_datasheet_for_energy_storage.xlsx", ) @@ -651,7 +618,7 @@ def parse_input_arguments() -> argparse.Namespace: path_cwd, "src", "technologydata", - "package_data", + "parsers", "dea_energy_storage", ) output_technologies_path = pathlib.Path( @@ -676,7 +643,7 @@ def parse_input_arguments() -> argparse.Namespace: if input_args.export_schema: # Move schema files if they exist schema_folder = pathlib.Path( - path_cwd, "src", "technologydata", "package_data", "schemas" + path_cwd, "src", "technologydata", "parsers", "schemas" ) sources_schema = pathlib.Path(dea_storage_path, "sources.schema.json") technologies_schema = pathlib.Path(dea_storage_path, "technologies.schema.json") diff --git a/src/technologydata/package_data/dea_energy_storage/sources.json b/src/technologydata/parsers/dea_energy_storage/sources.json similarity index 100% rename from src/technologydata/package_data/dea_energy_storage/sources.json rename to src/technologydata/parsers/dea_energy_storage/sources.json diff --git a/src/technologydata/package_data/dea_energy_storage/technologies.json b/src/technologydata/parsers/dea_energy_storage/technologies.json similarity index 100% rename from src/technologydata/package_data/dea_energy_storage/technologies.json rename to src/technologydata/parsers/dea_energy_storage/technologies.json diff --git a/src/technologydata/parsers/manual_input_usa/manual_input_usa.py b/src/technologydata/parsers/manual_input_usa/manual_input_usa.py new file mode 100644 index 00000000..7ad159e4 --- /dev/null +++ b/src/technologydata/parsers/manual_input_usa/manual_input_usa.py @@ -0,0 +1,256 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +""" +Data parser for manually specified, USA-specific data from the technology-data repository (`manual_input_usa.csv`). + +How to run: + From the repository root, execute: + python src/technologydata/parsers/manual_input_usa/manual_input_usa.py + +This will regenerate the files `src/technologydata/parsers/manual_input_usa/{sources.json|technologies.json}` with the specified options. +Use the default options to reproduce the file provided with the package. + +Configuration options (command-line arguments): + --num_digits Number of significant digits to round the values. Default: 4 + --store_source Store the source object on the Wayback Machine. Default: False + +Example: + python src/technologydata/parsers/manual_input_usa/manual_input_usa.py --num_digits 3 --store_source + +""" + +import logging +import pathlib + +import pandas + +from technologydata import ( + Commons, + Parameter, + Source, + SourceCollection, + Technology, + TechnologyCollection, +) +from technologydata.parsers.commons import CommonsParser + +path_cwd = pathlib.Path.cwd() + +logger = logging.getLogger(__name__) + + +def extract_units_carriers_heating_value( + input_unit: str, +) -> tuple[str, str | None, str | None]: + """ + Extract standardized units and carriers from an input unit string. Add also heating_value. + + This function maps complex unit representations to simplified unit and carrier + combinations using a predefined dictionary of special patterns. + + Parameters + ---------- + input_unit : str + A specialized unit string to be converted. + + Returns + ------- + tuple[str, str | None, str | None] + A tuple containing two elements: + - The first element is the standardized unit + - The second element is the corresponding carrier (or None if not found) + - The third element is the corresponding heating value (or None if not found) + + """ + # Define conversion dictionary + special_patterns = { + "USD_2022/MW_FT": ("USD_2022/MW", "1/FT", "1/LHV"), + "MWh_H2/MWh_FT": ("MWh/MWh", "H2/FT", "LHV"), + "MWh_el/MWh_FT": ("MWh/MWh", "el/FT", "LHV"), + "t_CO2/MWh_FT": ("t/MWh", "CO2/FT", "LHV"), + "USD_2022/kWh_H2": ("USD_2022/kWh", "1/H2", "LHV"), + "MWh_el/MWh_H2": ("MWh/MWh", "el/H2", "LHV"), + "USD_2023/t_CO2/h": ("USD_2023/t/h", "1/CO2", None), + "MWh_el/t_CO2": ("MWh/t", "el/CO2", "LHV"), + "MWh_th/t_CO2": ("MWh/t", "thermal/CO2", "LHV"), + } + + if isinstance(input_unit, str) and input_unit in special_patterns.keys(): + return special_patterns[input_unit] + else: + return input_unit, None, None + + +def build_technology_collection( + dataframe: pandas.DataFrame, + sources_path: pathlib.Path, + store_source: bool = False, +) -> TechnologyCollection: + """ + Compute a collection of technologies from a grouped DataFrame. + + Processes input DataFrame by grouping technologies and extracting their parameters, + creating Technology instances for each unique group. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing technology parameters. + Expected columns include: + - 'scenario': Estimation or case identifier + - 'year': Year of the technology + - 'technology': Detailed technology name + - 'parameter': Parameter name + - 'value': Parameter value + - 'unit': Parameter units + - 'further_description': Extra information about the technology + - 'financial_case': Technology financial case + sources_path: pathlib.Path + Output path for storing the SourceCollection object + store_source: Optional[bool] + Flag to decide whether to store the source object on the Wayback Machine. Default False. + + Returns + ------- + TechnologyCollection + A collection of Technology instances, each representing a unique + technology group with its associated parameters. + + Notes + ----- + - The function groups the DataFrame by ["scenario", "year", "technology"] + - For each group, it creates a dictionary of Parameters + - Each Technology is instantiated with group-specific attributes + + """ + list_techs = [] + + if store_source: + source = Source( + title="Energy system technology data for the US", + authors="Contributors to technology-data. Data source: manual_input_usa.csv", + url="https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + ) + source.ensure_in_wayback() + sources = SourceCollection(sources=[source]) + sources.to_json(sources_path) + else: + sources = SourceCollection.from_json(sources_path) + + for (scenario, year, technology), group in dataframe.groupby( + ["scenario", "year", "technology"] + ): + parameters = {} + financial_case_for_tech = None + for _, row in group.iterrows(): + unit, carrier, heating_value = extract_units_carriers_heating_value( + row["unit"] + ) + param_kwargs = { + "magnitude": row["value"], + "sources": sources, + } + if carrier is not None: + param_kwargs["carrier"] = carrier + if heating_value is not None: + param_kwargs["heating_value"] = heating_value + if unit is not None: + param_kwargs["units"] = unit + if row["further_description"] is not None and isinstance( + row["further_description"], str + ): + param_kwargs["note"] = row["further_description"] + if row["financial_case"] is not None and isinstance( + row["financial_case"], str + ): + financial_case_for_tech = str(row["financial_case"]) + parameters[row["parameter"]] = Parameter(**param_kwargs) + + # Combine scenario and financial_case for the case attribute + case_value = str(scenario) + if financial_case_for_tech is not None: + case_value = f"{scenario} - {financial_case_for_tech}" + + list_techs.append( + Technology( + name=technology, + region="USA", + year=year, + parameters=parameters, + case=case_value, + detailed_technology=technology, + ) + ) + + return TechnologyCollection(technologies=list_techs) + + +if __name__ == "__main__": + # Parse input arguments + input_args = CommonsParser.parse_input_arguments( + description="Parse the technology_data manual_input_usa.csv dataset" + ) + logger.info("Command line arguments parsed.") + + manual_input_usa_input_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "parsers", + "raw", + "manual_input_usa.csv", + ) + + manual_input_usa_df = pandas.read_csv( + manual_input_usa_input_path, dtype=str, na_values="None" + ) + manual_input_usa_df["value"] = manual_input_usa_df["value"].astype(float) + manual_input_usa_df["scenario"] = manual_input_usa_df["scenario"].fillna( + "not_available" + ) + + # Replace "per unit" with "%" and multiply val by 100 + mask_per_unit = manual_input_usa_df["unit"].str.contains("per unit") + manual_input_usa_df.loc[mask_per_unit, "unit"] = manual_input_usa_df.loc[ + mask_per_unit, "unit" + ].str.replace("per unit", "%") + manual_input_usa_df.loc[mask_per_unit, "value"] = ( + manual_input_usa_df.loc[mask_per_unit, "value"] * 100.0 + ).round(input_args.num_digits) + logger.info("`per unit` replaced by `%`. Corresponding value multiplied by 100.") + + # Include currency_year in unit if applicable + manual_input_usa_df["unit"] = manual_input_usa_df.apply( + lambda row: Commons.update_unit_with_currency_year( + row["unit"], row["currency_year"] + ), + axis=1, + ) + logger.info("`currency_year` included in `unit` column.") + + # Build TechnologyCollection + manual_input_usa_base_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "parsers", + "manual_input_usa", + ) + output_technologies_path = pathlib.Path( + manual_input_usa_base_path, + "technologies.json", + ) + output_sources_path = pathlib.Path( + manual_input_usa_base_path, + "sources.json", + ) + + tech_col = build_technology_collection( + manual_input_usa_df, output_sources_path, store_source=input_args.store_source + ) + + logger.info("TechnologyCollection object instantiated.") + tech_col.to_json(output_technologies_path) + logger.info("TechnologyCollection object exported to json.") diff --git a/src/technologydata/parsers/manual_input_usa/sources.json b/src/technologydata/parsers/manual_input_usa/sources.json new file mode 100644 index 00000000..0d0db8fc --- /dev/null +++ b/src/technologydata/parsers/manual_input_usa/sources.json @@ -0,0 +1,12 @@ +{ + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] +} diff --git a/src/technologydata/parsers/manual_input_usa/technologies.json b/src/technologydata/parsers/manual_input_usa/technologies.json new file mode 100644 index 00000000..2e87e336 --- /dev/null +++ b/src/technologydata/parsers/manual_input_usa/technologies.json @@ -0,0 +1,4149 @@ +{ + "technologies": [ + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1671.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2851.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 7103597.31, + "units": "USD_2023 / hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 480.1, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 405.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1342.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2062.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2258.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 294.7, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 205.8, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1086.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1646.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1797.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 262.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 169.5, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 888.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1322.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1440.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 226.6, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 134.0, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1671.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2851.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 19180739.93, + "units": "USD_2023 / hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 480.1, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 405.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2160.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2721.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 454.2, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 330.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1531.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1802.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 2598.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 430.3, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 307.8, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1466.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1509.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 2481.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 406.2, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 285.2, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1671.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2851.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 12398844.91, + "units": "USD_2023 / hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 480.1, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 405.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1402.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2160.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2366.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 432.8, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 254.8, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1182.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1802.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1970.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 409.6, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 208.6, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1002.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1509.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1646.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 384.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 163.0, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-IGCC", + "detailed_technology": "Coal-IGCC", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 50.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "efficiency": { + "magnitude": 70.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 1696429.0, + "units": "USD_2022 / megawatt", + "carrier": "1 / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.43, + "units": "dimensionless", + "carrier": "hydrogen / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.04, + "units": "dimensionless", + "carrier": "electricity / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.32, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame)", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame)", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "efficiency": { + "magnitude": 57.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.24, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / carbon_dioxide", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "heat-input": { + "magnitude": 1.17, + "units": "megawatt_hour / metric_ton", + "carrier": "thermal / carbon_dioxide", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen storage compressor", + "detailed_technology": "hydrogen storage compressor", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2.28, + "units": "USD_2022 / kilowatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "compression-electricity-input": { + "magnitude": 0.05, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "1.707 kWh/kg.", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen storage tank type 1", + "detailed_technology": "hydrogen storage tank type 1", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 16.87, + "units": "USD_2022 / kilowatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "min_fill_level": { + "magnitude": 6.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "not_available", + "region": "USA", + "year": 2022, + "parameters": { + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "not_available", + "region": "USA", + "year": 2022, + "parameters": { + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal integrated retrofit 90%-CCS", + "detailed_technology": "Coal integrated retrofit 90%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 38.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal integrated retrofit 95%-CCS", + "detailed_technology": "Coal integrated retrofit 95%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 38.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-95%-CCS", + "detailed_technology": "Coal-95%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 40.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-99%-CCS", + "detailed_technology": "Coal-99%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 40.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-IGCC-90%-CCS", + "detailed_technology": "Coal-IGCC-90%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 40.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame)", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame)", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 57.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 52.7, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 52.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG Combined Cycle F-Class integrated retrofit 90%-CCS", + "detailed_technology": "NG Combined Cycle F-Class integrated retrofit 90%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 53.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG Combined Cycle F-Class integrated retrofit 95%-CCS", + "detailed_technology": "NG Combined Cycle F-Class integrated retrofit 95%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 53.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": "2025-10-20", + "url_date_archive": null + } + ] + } + } + } + } + ] +} diff --git a/src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx b/src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx similarity index 100% rename from src/technologydata/package_data/raw/Technology_datasheet_for_energy_storage.xlsx rename to src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx diff --git a/src/technologydata/parsers/raw/manual_input_usa.csv b/src/technologydata/parsers/raw/manual_input_usa.csv new file mode 100644 index 00000000..57ff9ce6 --- /dev/null +++ b/src/technologydata/parsers/raw/manual_input_usa.csv @@ -0,0 +1,287 @@ +technology,parameter,year,value,unit,currency_year,source,further_description,financial_case,scenario +Fischer-Tropsch,efficiency,2020,0.7,per unit,,ICCT IRA e-fuels assumptions ,,, +Fischer-Tropsch,investment,2020,1696429,USD/MW_FT,2022,ICCT IRA e-fuels assumptions ,,, +Fischer-Tropsch,lifetime,2020,20,years,,ICCT IRA e-fuels assumptions ,,, +Fischer-Tropsch,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,,, +Fischer-Tropsch,lifetime,2030,30,years,,ICCT IRA e-fuels assumptions ,,, +Fischer-Tropsch,hydrogen-input,2020,1.43,MWh_H2/MWh_FT,,ICCT IRA e-fuels assumptions ,"0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).",, +Fischer-Tropsch,electricity-input,2020,0.04,MWh_el/MWh_FT,,ICCT IRA e-fuels assumptions ,"0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).",, +Fischer-Tropsch,carbondioxide-input,2020,0.32,t_CO2/MWh_FT,,ICCT IRA e-fuels assumptions ,"Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).",, +hydrogen storage tank type 1,investment,2020,16.87,USD/kWh_H2,2022,ICCT IRA e-fuels assumptions ,,, +hydrogen storage tank type 1,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,,, +hydrogen storage tank type 1,lifetime,2020,30,years,,ICCT IRA e-fuels assumptions ,,, +hydrogen storage tank type 1,min_fill_level,2020,6,%,,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.9.",,, +hydrogen storage compressor,investment,2020,2.28,USD/kWh_H2,2022,ICCT IRA e-fuels assumptions ,,, +hydrogen storage compressor,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,,, +hydrogen storage compressor,lifetime,2020,30,years,,ICCT IRA e-fuels assumptions ,,, +hydrogen storage compressor,compression-electricity-input,2020,0.05,MWh_el/MWh_H2,,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.4.",1.707 kWh/kg.,, +direct air capture,lifetime,2020,30,years,-,ICCT IRA e-fuels assumptions ,,, +direct air capture,FOM,2020,1.3,%/year,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +direct air capture,FOM,2020,1.3,%/year,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +direct air capture,FOM,2020,1.3,%/year,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +direct air capture,investment,2020,12398844.91,USD/t_CO2/h,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +direct air capture,investment,2020,19180739.93,USD/t_CO2/h,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +direct air capture,investment,2020,7103597.31,USD/t_CO2/h,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +direct air capture,FOM,2020,1.3,%/year,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +direct air capture,FOM,2020,1.3,%/year,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +direct air capture,FOM,2020,1.3,%/year,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +direct air capture,investment,2020,12398844.91,USD/t_CO2/h,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +direct air capture,investment,2020,19180739.93,USD/t_CO2/h,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +direct air capture,investment,2020,7103597.31,USD/t_CO2/h,2023,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +direct air capture,electricity-input,2020,0.24,MWh_el/t_CO2,-,ICCT IRA e-fuels assumptions ,,, +direct air capture,heat-input,2020,1.17,MWh_th/t_CO2,-,ICCT IRA e-fuels assumptions ,,, +Coal-IGCC,lifetime,2020,40,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +Coal-IGCC-90%-CCS,lifetime,2030,40,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +Coal-95%-CCS,lifetime,2030,40,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +Coal-99%-CCS,lifetime,2030,40,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +NG 2-on-1 Combined Cycle (F-Frame),lifetime,2030,30,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +NG 2-on-1 Combined Cycle (F-Frame) 95% CCS,lifetime,2030,30,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +NG 2-on-1 Combined Cycle (F-Frame) 97% CCS,lifetime,2030,30,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +Coal-95%-CCS,capture_rate,2030,0.95,per unit,-,"NREL, NREL ATB 2024",,, +Coal-99%-CCS,capture_rate,2030,0.99,per unit,-,"NREL, NREL ATB 2024",,, +Coal-IGCC-90%-CCS,capture_rate,2030,0.9,per unit,-,"NREL, NREL ATB 2024",,, +NG 2-on-1 Combined Cycle (F-Frame) 95% CCS,capture_rate,2030,0.95,per unit,-,"NREL, NREL ATB 2024",,, +NG 2-on-1 Combined Cycle (F-Frame) 97% CCS,capture_rate,2030,0.97,per unit,-,"NREL, NREL ATB 2024",,, +Coal-IGCC,efficiency,2020,0.5,per unit,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +Coal-IGCC-90%-CCS,efficiency,2030,0.403,per unit,,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +NG 2-on-1 Combined Cycle (F-Frame),efficiency,2020,0.573,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +Coal-95%-CCS,efficiency,2030,0.403,per unit,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +Coal-99%-CCS,efficiency,2030,0.403,per unit,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx`",,, +NG 2-on-1 Combined Cycle (F-Frame),efficiency,2030,0.573,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +NG 2-on-1 Combined Cycle (F-Frame) 95% CCS,efficiency,2030,0.527,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +NG 2-on-1 Combined Cycle (F-Frame) 97% CCS,efficiency,2030,0.525,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +Coal integrated retrofit 90%-CCS,capture_rate,2030,0.9,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +Coal integrated retrofit 95%-CCS,capture_rate,2030,0.95,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +NG Combined Cycle F-Class integrated retrofit 90%-CCS,capture_rate,2030,0.9,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +NG Combined Cycle F-Class integrated retrofit 95%-CCS,capture_rate,2030,0.95,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +Coal integrated retrofit 90%-CCS,efficiency,2030,0.386,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +Coal integrated retrofit 95%-CCS,efficiency,2030,0.386,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +NG Combined Cycle F-Class integrated retrofit 90%-CCS,efficiency,2030,0.536,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +NG Combined Cycle F-Class integrated retrofit 95%-CCS,efficiency,2030,0.536,per unit,-,"NREL, β€œCost and performance projections for coal- and natural gas-fired power plants""",,, +Alkaline electrolyzer large size,lifetime,2020,30,years,-,ICCT IRA e-fuels assumptions ,,, +PEM electrolyzer small size,lifetime,2020,30,years,-,ICCT IRA e-fuels assumptions ,,, +SOEC,lifetime,2020,30,years,-,ICCT IRA e-fuels assumptions ,,, +Alkaline electrolyzer large size,investment,2020,1671,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,investment,2030,1402,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,investment,2040,1182,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,investment,2050,1002,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,investment,2020,2599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,investment,2030,2160,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,investment,2040,1802,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,investment,2050,1509,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,investment,2020,2851,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,investment,2030,2366,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,investment,2040,1970,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,investment,2050,1646,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,investment,2020,1671,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,investment,2030,1599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,investment,2040,1531,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,investment,2050,1466,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,investment,2020,2599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,investment,2030,2160,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,investment,2040,1802,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,investment,2050,1509,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,investment,2020,2851,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,investment,2030,2721,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,investment,2040,2598,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,investment,2050,2481,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,investment,2020,1671,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,investment,2030,1342,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,investment,2040,1086,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,investment,2050,888,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,investment,2020,2599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,investment,2030,2062,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,investment,2040,1646,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,investment,2050,1322,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,investment,2020,2851,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,investment,2030,2258,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,investment,2040,1797,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,investment,2050,1440,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,investment,2020,1671,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,investment,2030,1402,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,investment,2040,1182,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,investment,2050,1002,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,investment,2020,2599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,investment,2030,2160,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,investment,2040,1802,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,investment,2050,1509,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,investment,2020,2851,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,investment,2030,2366,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,investment,2040,1970,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,investment,2050,1646,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,investment,2020,1671,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,investment,2030,1599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,investment,2040,1531,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,investment,2050,1466,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,investment,2020,2599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,investment,2030,2160,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,investment,2040,1802,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,investment,2050,1509,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,investment,2020,2851,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,investment,2030,2721,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,investment,2040,2598,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,investment,2050,2481,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,investment,2020,1671,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +Alkaline electrolyzer large size,investment,2030,1342,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +Alkaline electrolyzer large size,investment,2040,1086,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +Alkaline electrolyzer large size,investment,2050,888,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,investment,2020,2599,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,investment,2030,2062,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,investment,2040,1646,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,investment,2050,1322,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,investment,2020,2851,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,investment,2030,2258,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,investment,2040,1797,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,investment,2050,1440,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +Alkaline electrolyzer large size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +PEM electrolyzer small size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +SOEC,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +Alkaline electrolyzer large size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +PEM electrolyzer small size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +SOEC,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +Alkaline electrolyzer large size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +PEM electrolyzer small size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +SOEC,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +Alkaline electrolyzer large size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +PEM electrolyzer small size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +SOEC,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +Alkaline electrolyzer large size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +PEM electrolyzer small size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +SOEC,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +Alkaline electrolyzer large size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +Alkaline electrolyzer large size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +Alkaline electrolyzer large size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +PEM electrolyzer small size,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,FOM,2030,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +SOEC,FOM,2050,4,%/year,2022,ICCT IRA e-fuels assumptions ,Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,investment,2022,405.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,investment,2030,254.8,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,investment,2040,208.6,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,investment,2050,163,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,investment,2022,405.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,investment,2030,330.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,investment,2040,307.8,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,investment,2050,285.2,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,investment,2022,405.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,investment,2030,205.8,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,investment,2040,169.5,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,investment,2050,134,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,investment,2022,405.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,investment,2030,254.8,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,investment,2040,208.6,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,investment,2050,163,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,investment,2022,405.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,investment,2030,330.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,investment,2040,307.8,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,investment,2050,285.2,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,investment,2022,405.4,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,investment,2030,205.8,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,investment,2040,169.5,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,investment,2050,134,USD/kWh,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,investment,2022,480.1,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,investment,2030,432.8,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,investment,2040,409.6,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,investment,2050,384,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,investment,2022,480.1,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,investment,2030,454.2,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,investment,2040,430.3,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,investment,2050,406.2,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,investment,2022,480.1,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,investment,2030,294.7,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,investment,2040,262,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,investment,2050,226.6,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,investment,2022,480.1,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,investment,2030,432.8,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,investment,2040,409.6,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,investment,2050,384,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,investment,2022,480.1,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,investment,2030,454.2,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,investment,2040,430.3,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,investment,2050,406.2,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,investment,2022,480.1,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,investment,2030,294.7,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,investment,2040,262,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,investment,2050,226.6,USD/kW,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery storage,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery storage,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery storage,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery storage,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery storage,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Moderate +battery inverter,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Conservative +battery inverter,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,R&D,Advanced +battery inverter,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Moderate +battery inverter,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Conservative +battery inverter,FOM,2022,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,FOM,2030,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,FOM,2040,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery inverter,FOM,2050,2.5,%/year,2022,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios,Market,Advanced +battery storage,lifetime,2022,15,years,-,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",,, +battery inverter,lifetime,2022,15,years,-,"NREL, 2024 ATB Excel Workbook, Sheet β€œUtility-Scale Battery Storage”, https://data.openei.org/files/6006/2024_v3_Workbook.xlsx",,, diff --git a/src/technologydata/utils/carriers.txt b/src/technologydata/utils/carriers.txt index ab41391c..ce376cb1 100644 --- a/src/technologydata/utils/carriers.txt +++ b/src/technologydata/utils/carriers.txt @@ -19,6 +19,7 @@ carbon_dioxide = [carbon_dioxide] = CO2 carbon_monoxide = [carbon_monoxide] = CO coal = [coal] = anthracite = hard_coal = black_coal diesel = [diesel] +fischer_tropsch = [fischer_tropsch] = FT = FTF = fischer_tropsch_fuel gasoline = [gasoline] = petrol jet_fuel_a1 = [jet_fuel_a1] = JETA1 electricity = [electricity] = e = el @@ -29,5 +30,6 @@ methanol = [methanol] = CH3OH = MeOH natural_gas = [natural_gas] = NG nitrogen = [nitrogen] = N2 oxygen = [oxygen] = O2 +thermal = [thermal] = th water = [water] = H2O wood = [wood] diff --git a/test/test_dea_energy_storage.py b/test/test_dea_energy_storage.py index 2da6ccc4..1a5b02d1 100644 --- a/test/test_dea_energy_storage.py +++ b/test/test_dea_energy_storage.py @@ -10,7 +10,7 @@ import pandas import pytest -from technologydata.package_data.dea_energy_storage.dea_energy_storage import ( +from technologydata.parsers.dea_energy_storage.dea_energy_storage import ( build_technology_collection, clean_est_string, clean_parameter_string, diff --git a/test/test_parser_commons.py b/test/test_parser_commons.py new file mode 100644 index 00000000..4790d84a --- /dev/null +++ b/test/test_parser_commons.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Test the utility methods.""" + +import typing + +from technologydata.parsers.commons import CommonsParser + + +class TestCommonsUtils: + """Test suite for the Commons utility functions in the technologydata module.""" + + def test_defaults_and_flag(self, monkeypatch: typing.Any) -> None: + """Check if parse_input_arguments works when both default arg and the store_true flag are provided.""" + monkeypatch.setattr("sys.argv", ["prog", "--num_digits", "2", "--store_source"]) + args = CommonsParser.parse_input_arguments() + assert args.num_digits == 2 + assert args.store_source is True + + def test_default_values_when_not_provided(self, monkeypatch: typing.Any) -> None: + """Check if parse_input_arguments works when no args are provided (so defaults are used).""" + # no args -> defaults apply + monkeypatch.setattr("sys.argv", ["prog"]) + args = CommonsParser.parse_input_arguments() + assert args.num_digits == 4 # default from the function + assert args.store_source is False From 2f4a96aae153464d60afd9f725c31bf9d573e954 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Mon, 2 Feb 2026 07:54:26 +0100 Subject: [PATCH 37/81] doc: add pypi link --- docs/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/index.md b/docs/index.md index e66a6f9c..0cdac0bb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,6 +2,8 @@ technologydata Header Logo

+ +[![PyPI version](https://img.shields.io/pypi/v/technologydata.svg)](https://pypi.python.org/pypi/technologydata) [![License](https://img.shields.io/pypi/l/pypsa.svg)](https://github.com/PyPSA/pypsa?tab=MIT-1-ov-file) [![Discord](https://img.shields.io/discord/911692131440148490?logo=discord)](https://discord.gg/T7YZbnVU) From 622eb16b74409e2962b6d144331a481557b719d4 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Mon, 2 Feb 2026 08:00:58 +0100 Subject: [PATCH 38/81] doc: add pre-commit checks --- docs/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 0cdac0bb..79c5e0da 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,6 @@ technologydata Header Logo

- [![PyPI version](https://img.shields.io/pypi/v/technologydata.svg)](https://pypi.python.org/pypi/technologydata) [![License](https://img.shields.io/pypi/l/pypsa.svg)](https://github.com/PyPSA/pypsa?tab=MIT-1-ov-file) [![Discord](https://img.shields.io/discord/911692131440148490?logo=discord)](https://discord.gg/T7YZbnVU) From ee4fbebf74afedee484446b27eb5cde882b85a42 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Mon, 2 Feb 2026 10:19:57 +0100 Subject: [PATCH 39/81] update version --- CITATIONS.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATIONS.cff b/CITATIONS.cff index fe9d5c3b..6bdc2722 100644 --- a/CITATIONS.cff +++ b/CITATIONS.cff @@ -6,7 +6,7 @@ cff-version: 1.2.0 message: "If you use this package, we suggest the following way of citing it." title: "technologydata: Data for Energy Systems Models" repository: https://github.com/open-energy-transition/technology-data -version: 0.1.0 # Don't touch, will be updated by the release script +version: 0.2.1 # Don't touch, will be updated by the release script license: MIT authors: - family-names: Hampp From ff94d75a74a8233963e5d14fda3051af2ed55a97 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:54:10 +0100 Subject: [PATCH 40/81] Issue 82 repeated calls change_heating_value (#87) --- src/technologydata/parameter.py | 4 +++- test/test_parameter.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 2db0f7b7..789693df 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -295,7 +295,9 @@ def change_heating_value(self, to_heating_value: str) -> Self: "Cannot change heating value without a current heating value. " "Please provide a valid heating value." ) - if to_heating_value == self.heating_value: + # pint uses canonical names for units, ensure we compare against that + to_heating_value_pint = str(technologydata.hvreg.Unit(to_heating_value)) + if to_heating_value_pint == self.heating_value: # No change needed, return the same parameter return self diff --git a/test/test_parameter.py b/test/test_parameter.py index 116abcd3..65726536 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -740,6 +740,21 @@ def test_change_heating_value_ch4_hhv_to_lhv_adapt_units(self) -> None: assert p2.heating_value == "lower_heating_value" assert p2.carrier == "methane" + def test_change_heating_value_multiple_calls(self) -> None: + """Test conversion when multiple calls are performed and to_heating_value is constant.""" + p = technologydata.Parameter( + magnitude=10, units="kW", heating_value="LHV", carrier="natural_gas" + ) + p = p.change_heating_value("HHV") + assert p.units == "kilowatt" + assert pytest.approx(p.magnitude) == 11.0828 + p = p.change_heating_value("HHV") + assert p.units == "kilowatt" + assert pytest.approx(p.magnitude) == 11.0828 + p = p.change_heating_value("HHV") + assert p.units == "kilowatt" + assert pytest.approx(p.magnitude) == 11.0828 + def test_change_heating_value_no_carrier_in_units(self) -> None: """Test conversion when carrier does not appear in units (should treat as 1 appearance).""" p = technologydata.Parameter( From e65f0a2d241744840a7af5fcf38d7434b8236e85 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Fri, 6 Feb 2026 10:30:13 +0100 Subject: [PATCH 41/81] code: update CITATIONS.cff with new patch release --- CITATIONS.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATIONS.cff b/CITATIONS.cff index 6bdc2722..02720fe6 100644 --- a/CITATIONS.cff +++ b/CITATIONS.cff @@ -6,7 +6,7 @@ cff-version: 1.2.0 message: "If you use this package, we suggest the following way of citing it." title: "technologydata: Data for Energy Systems Models" repository: https://github.com/open-energy-transition/technology-data -version: 0.2.1 # Don't touch, will be updated by the release script +version: 0.2.2 # Don't touch, will be updated by the release script license: MIT authors: - family-names: Hampp From 0465cb059958e8ec68b53925066fe86b4caf36c0 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 17 Feb 2026 15:01:13 +0100 Subject: [PATCH 42/81] Data accessor (#90) * add __init__.py in parsers directory * code: create data_accessor class * code: pre-commit check * code: add datapackage load * code: add data accessor class * code: update test description * code: modify logic for DataSourceName enum * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: fix failing unit test * code: omit __init__.py from code coverage * Update docs/user_guide/data_accessor.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * Update docs/user_guide/data_accessor.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: add load * code: new changes --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- MANIFEST.in | 4 +- REUSE.toml | 2 +- docs/api/data_accessor.md | 1 + docs/user_guide/data_accessor.md | 85 +++++++++++ mkdocs.yaml | 2 + pyproject.toml | 1 + src/technologydata/parsers/__init__.py | 5 + src/technologydata/parsers/data_accessor.py | 143 ++++++++++++++++++ .../parsers/dea_energy_storage/__init__.py | 5 + .../dea_energy_storage/dea_energy_storage.py | 4 +- .../dea_energy_storage/{ => v10}/sources.json | 0 .../{ => v10}/technologies.json | 0 .../parsers/manual_input_usa/__init__.py | 5 + .../manual_input_usa/manual_input_usa.py | 4 +- .../{ => v0.13.4}/sources.json | 0 .../{ => v0.13.4}/technologies.json | 0 test/test_parser_data_accessor.py | 72 +++++++++ 17 files changed, 326 insertions(+), 7 deletions(-) create mode 100644 docs/api/data_accessor.md create mode 100644 docs/user_guide/data_accessor.md create mode 100644 src/technologydata/parsers/__init__.py create mode 100644 src/technologydata/parsers/data_accessor.py create mode 100644 src/technologydata/parsers/dea_energy_storage/__init__.py rename src/technologydata/parsers/dea_energy_storage/{ => v10}/sources.json (100%) rename src/technologydata/parsers/dea_energy_storage/{ => v10}/technologies.json (100%) create mode 100644 src/technologydata/parsers/manual_input_usa/__init__.py rename src/technologydata/parsers/manual_input_usa/{ => v0.13.4}/sources.json (100%) rename src/technologydata/parsers/manual_input_usa/{ => v0.13.4}/technologies.json (100%) create mode 100644 test/test_parser_data_accessor.py diff --git a/MANIFEST.in b/MANIFEST.in index 8bfd8dee..e9341945 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,6 @@ include src/technologydata/utils/*.txt -include src/technologydata/parsers/dea_energy_storage/*.json -include src/technologydata/parsers/manual_input_usa/*.json +include src/technologydata/parsers/dea_energy_storage/v10/*.json +include src/technologydata/parsers/manual_input_usa/v0.13.4/*.json include src/technologydata/parsers/raw/* include test/test_data/currency_conversion/WB_CNY_2020/* include test/test_data/currency_conversion/WB_EUR_2020/* diff --git a/REUSE.toml b/REUSE.toml index c23a3566..f4f198a1 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -15,7 +15,7 @@ SPDX-License-Identifier = "CC-BY-4.0" [[annotations]] path = [ - "src/technologydata/parsers/dea_energy_storage/*.json", "src/technologydata/parsers/schemas/*.json", "src/technologydata/parsers/raw/manual_input_usa.csv", "src/technologydata/parsers/manual_input_usa/*.json", + "src/technologydata/parsers/dea_energy_storage/v*/*.json", "src/technologydata/parsers/schemas/*.json", "src/technologydata/parsers/raw/manual_input_usa.csv", "src/technologydata/parsers/manual_input_usa/v*/*.json", ] SPDX-FileCopyrightText = "technologydata contributors" SPDX-License-Identifier = "CC-BY-4.0" diff --git a/docs/api/data_accessor.md b/docs/api/data_accessor.md new file mode 100644 index 00000000..dcd66bd3 --- /dev/null +++ b/docs/api/data_accessor.md @@ -0,0 +1 @@ +::: technologydata.parsers.data_accessor.DataAccessor diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md new file mode 100644 index 00000000..7532198c --- /dev/null +++ b/docs/user_guide/data_accessor.md @@ -0,0 +1,85 @@ +# `DataAccessor` Class Documentation + + + +## Overview + +The `DataAccessor` class provides a standardized way to access and load technology datasets from versioned data sources. It simplifies the process of selecting a specific data source and version, automatically handling the resolution of file paths and loading the data into a `DataPackage` object. + +It is designed to work with a specific directory structure where datasets are organized by name and version. + +## Features + +- **Data Source Selection**: Easily specify which dataset to load using the `DataSourceName` enumeration. +- **Version Management**: Load a specific version of a dataset or automatically detect and use the latest available version. +- **Standardized Loading**: Loads a `DataPackage` from a versioned folder, which is expected to contain `technologies.json` and optionally `sources.json`. +- **Error Handling**: Raises `FileNotFoundError` if the specified data source or version directories cannot be found. +- **Seamless Integration**: Returns a `DataPackage` object, ready for use with other components of the `technologydata` library. + +## Usage Examples + +### Creating a DataAccessor + +To use the `DataAccessor`, you first create an instance, specifying the `data_source_name`. You can optionally provide a `data_version`. If no version is specified, the latest available version for this dataset is used. + +```python +from technologydata.parsers.data_accessor import DataAccessor + +# Create an accessor for a specific version +accessor_v1 = DataAccessor( + data_source="manual_input_usa", + version="v1.0.0" +) + +# Create an accessor that will use the latest version +accessor_latest = DataAccessor( + data_source_name="dea_energy_storage" +) +``` + +### Accessing Data + +Once the `DataAccessor` is instantiated, call the `access_data()` method to load the dataset. The method handles finding the correct directory and then calls `DataPackage.from_json()` on that directory. + +The directory structure is expected to be: `src/technologydata/parsers///`. + +#### Loading a Specific Version + +If `data_version` was specified during instantiation, `access_data()` will look for that exact version. + +```python +# Assuming the path .../parsers/manual_input_usa/v1.0.0/ exists +dp_v1 = accessor_v1.access_data() + +# dp_v1 is now a DataPackage object containing the data from v1.0.0 +print(type(dp_v1)) +# +``` + +#### Loading the Latest Version + +If `data_version` is not provided or not found, `access_data()` automatically identifies the latest version based on semantic versioning rules (e.g., `v2.1.0` is newer than `v2.0.0`, and `v10` is newer than `v2`). + +```python +# Assuming .../parsers/dea_energy_storage/ contains version directories like 'v1', 'v2' +# The accessor will load data from the latest version found (e.g., 'v2') +dp_latest = accessor_latest.access_data() + +print(type(dp_latest)) +# +``` + +## API Reference + +Please refer to the [API documentation](../api/data_accessor.md) for detailed information on the `DataAccessor` class methods and attributes. + +## Limitations & Notes + +- **Directory Structure**: The `DataAccessor` expects a specific directory structure within the project: `src/technologydata/parsers///`. It will not find data located elsewhere. +- **Version Naming**: Version directories must be prefixed with a `v` and follow a pattern that can be parsed by `packaging.version` (e.g., `v1`, `v2.0`, `v1.0.1-alpha`). Directories that do not match this pattern will be ignored when searching for the latest version. +- **Target Data**: The class is designed to load a `DataPackage` from a folder. See the `DataPackage` documentation for more details on the expected contents of that folder (i.e., `technologies.json`). diff --git a/mkdocs.yaml b/mkdocs.yaml index 2c8b5aa0..0455268c 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -28,6 +28,7 @@ nav: - Source Collection: user_guide/source_collection.md - Technology: user_guide/technology.md - Technology Collection: user_guide/technology_collection.md + - Data Accessor: user_guide/data_accessor.md - Use Cases: user_guide/design.md - Examples: @@ -41,6 +42,7 @@ nav: - Source Collection: api/source_collection.md - Technology: api/technology.md - Technology Collection: api/technology_collection.md + - Data Accessor: api/data_accessor.md - Utils: - Commons: - Common functionalities: api/commons/commons.md diff --git a/pyproject.toml b/pyproject.toml index 2bc9070c..e41f9a34 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -112,6 +112,7 @@ include = ["technologydata"] source = [ "src/technologydata", ] +omit = ["*/__init__.py"] # Static type checker settings [tool.mypy] diff --git a/src/technologydata/parsers/__init__.py b/src/technologydata/parsers/__init__.py new file mode 100644 index 00000000..7aa2c725 --- /dev/null +++ b/src/technologydata/parsers/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Provide parsers for datasets.""" diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/parsers/data_accessor.py new file mode 100644 index 00000000..8d01b811 --- /dev/null +++ b/src/technologydata/parsers/data_accessor.py @@ -0,0 +1,143 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Provide a class to access data from a data source.""" + +import logging +import pathlib +import re +from enum import Enum +from typing import Annotated + +import pydantic +from packaging.version import parse +from pydantic import field_validator + +from technologydata import DataPackage + +path_cwd = pathlib.Path.cwd() + +logger = logging.getLogger(__name__) + + +class DataSourceName(str, Enum): + """An enumeration of available data sources.""" + + DEA_ENERGY_STORAGE = "dea_energy_storage" + MANUAL_INPUT_USA = "manual_input_usa" + + +class DataAccessor(pydantic.BaseModel): + """ + Access data from a versioned data source. + + This class provides a standardized interface to locate and load technology + datasets from predefined data sources. It can either load a specific version + or automatically determine and load the latest available version. + + Parameters + ---------- + data_source_name : str + The name of the data source to access, as defined in the + `DataSourceName` enumeration. + data_version : str, optional + The specific version string of the data to load (e.g., "v1.0.0"). + If not provided, the latest version will be automatically determined + and used. Default is None. + + Attributes + ---------- + data_source_name : str + The name of the data source. + data_version : str or None + The version of the data source. + + """ + + data_source_name: Annotated[ + str, pydantic.Field(description="The name of the data source.") + ] + data_version: Annotated[ + str | None, pydantic.Field(description="The version of the data source.") + ] = None + + @field_validator("data_source_name", mode="before") + @classmethod + def _validate_data_source_name(cls, v: str) -> DataSourceName: + # Validate if the given string is a valid DataSourceName + try: + return DataSourceName(v) + except ValueError: + raise ValueError( + f"{v} is not a valid DataSourceName. Available options: {[e for e in DataSourceName]}" + ) + + @staticmethod + def get_latest_version_string(data_source_path_list: list[pathlib.Path]) -> str: + """ + Find the latest version string for the data source. + + Returns + ------- + str + The string of the latest version (e.g., 'v10', 'v1.0.0'). + + Raises + ------ + FileNotFoundError + If the data source directory or valid version directories are not found. + + """ + version_pattern = re.compile(r"^v(\d+(\.\d+)*)$") + versions = [] + for item in data_source_path_list: + if item.is_dir(): + match = version_pattern.match(item.name) + if match: + versions.append(item.name) + + if not versions: + raise FileNotFoundError("No valid version directories found.") + + latest_version_str = max(versions, key=lambda v: parse(v[1:])) + return latest_version_str + + def load(self) -> DataPackage: + """ + Load the default 'technologies.json' from the package data. + + Returns + ------- + DataPackage + An instance of DataPackage initialized with the requested data. + + Raises + ------ + FileNotFoundError + If the data source directory or the specified version directory is not found. + ValueError + If the specified version is not found. The user is notified of the latest available version. + + """ + source_path = pathlib.Path( + path_cwd, "src", "technologydata", "parsers", self.data_source_name + ) + if not source_path.is_dir(): + raise FileNotFoundError(f"Data source directory not found: {source_path}") + + source_path_list = [p.name for p in source_path.iterdir() if p.is_dir()] + + if self.data_version and self.data_version in source_path_list: + version = self.data_version + logger.info( + f"Data source directory corresponding to version {self.data_version} found." + ) + else: + version = self.get_latest_version_string(list(source_path.iterdir())) + raise ValueError( + f"Data source version '{self.data_version}' not found. The latest available version is {version}." + ) + + data_path = pathlib.Path(source_path, version) + return DataPackage.from_json(data_path) diff --git a/src/technologydata/parsers/dea_energy_storage/__init__.py b/src/technologydata/parsers/dea_energy_storage/__init__.py new file mode 100644 index 00000000..1ef3068c --- /dev/null +++ b/src/technologydata/parsers/dea_energy_storage/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Provide a parser for the DEA data storage dataset.""" diff --git a/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py b/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py index 46c7fe22..2a3be692 100644 --- a/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py +++ b/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py @@ -623,11 +623,11 @@ def build_technology_collection( ) output_technologies_path = pathlib.Path( dea_storage_path, - "technologies.json", + "v10/technologies.json", ) output_sources_path = pathlib.Path( dea_storage_path, - "sources.json", + "v10/sources.json", ) tech_col = build_technology_collection( diff --git a/src/technologydata/parsers/dea_energy_storage/sources.json b/src/technologydata/parsers/dea_energy_storage/v10/sources.json similarity index 100% rename from src/technologydata/parsers/dea_energy_storage/sources.json rename to src/technologydata/parsers/dea_energy_storage/v10/sources.json diff --git a/src/technologydata/parsers/dea_energy_storage/technologies.json b/src/technologydata/parsers/dea_energy_storage/v10/technologies.json similarity index 100% rename from src/technologydata/parsers/dea_energy_storage/technologies.json rename to src/technologydata/parsers/dea_energy_storage/v10/technologies.json diff --git a/src/technologydata/parsers/manual_input_usa/__init__.py b/src/technologydata/parsers/manual_input_usa/__init__.py new file mode 100644 index 00000000..c0cd27e1 --- /dev/null +++ b/src/technologydata/parsers/manual_input_usa/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Provide a parser for manually inputted data for the USA.""" diff --git a/src/technologydata/parsers/manual_input_usa/manual_input_usa.py b/src/technologydata/parsers/manual_input_usa/manual_input_usa.py index 7ad159e4..1212c95f 100644 --- a/src/technologydata/parsers/manual_input_usa/manual_input_usa.py +++ b/src/technologydata/parsers/manual_input_usa/manual_input_usa.py @@ -240,11 +240,11 @@ def build_technology_collection( ) output_technologies_path = pathlib.Path( manual_input_usa_base_path, - "technologies.json", + "v0.13.4/technologies.json", ) output_sources_path = pathlib.Path( manual_input_usa_base_path, - "sources.json", + "v0.13.4/sources.json", ) tech_col = build_technology_collection( diff --git a/src/technologydata/parsers/manual_input_usa/sources.json b/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json similarity index 100% rename from src/technologydata/parsers/manual_input_usa/sources.json rename to src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json diff --git a/src/technologydata/parsers/manual_input_usa/technologies.json b/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json similarity index 100% rename from src/technologydata/parsers/manual_input_usa/technologies.json rename to src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py new file mode 100644 index 00000000..f7b9cbec --- /dev/null +++ b/test/test_parser_data_accessor.py @@ -0,0 +1,72 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Test the DataAccessor class.""" + +import pathlib + +import pytest + +from technologydata.parsers.data_accessor import DataAccessor, DataSourceName + + +class TestDataAccessor: + """Test suite for the DataAccessor class in the technologydata module.""" + + @pytest.mark.parametrize( + ("versions", "expected"), + [ + (["v1", "v2", "v3", "v4"], "v4"), + (["v0.1.0", "v0.1.1"], "v0.1.1"), + (["v1", "v10", "v2"], "v10"), + (["v1.0.0", "v0.2.1", "v0.1.0"], "v1.0.0"), + ], + ) # type: ignore + def test_get_latest_version_string( + self, tmp_path: pathlib.Path, versions: list[pathlib.Path], expected: str + ) -> None: + """Test get_latest_version_string.""" + versions_dir = [pathlib.Path(tmp_path, version) for version in versions] + for version in versions_dir: + version.mkdir() + + assert DataAccessor.get_latest_version_string(versions_dir) == expected + + def test_get_latest_version_string_raises_error( + self, tmp_path: pathlib.Path + ) -> None: + """Test if get_latest_version_string raises FileNotFoundError for no valid versions.""" + (tmp_path / "invalid1").mkdir() + (tmp_path / "another_invalid").mkdir() + + path_list = [p for p in tmp_path.iterdir() if p.is_dir()] + + with pytest.raises( + FileNotFoundError, match="No valid version directories found." + ): + DataAccessor.get_latest_version_string(path_list) + + def test_access_data_dea_energy_storage(self) -> None: + """Test access_data.""" + data_accessor = DataAccessor( + data_source_name="dea_energy_storage", data_version="v10" + ) + data_package = data_accessor.load() + + assert data_accessor.data_source_name == DataSourceName.DEA_ENERGY_STORAGE + assert data_accessor.data_version == "v10" + assert data_package is not None + assert data_package.technologies is not None + assert data_package.sources is not None + assert len(data_package.technologies) == 136 + + def test_load_raises_value_error_for_invalid_version(self) -> None: + """Test if load raises ValueError for an invalid version.""" + with pytest.raises( + ValueError, + match="Data source version 'v11' not found. The latest available version is v10.", + ): + DataAccessor( + data_source_name="dea_energy_storage", data_version="v11" + ).load() From 899eb52aa8997c818c011b2f439f49f0390271f7 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:45:47 +0100 Subject: [PATCH 43/81] Multi version parser (#91) --- docs/api/dea_energy_storage_parser.md | 2 + docs/api/manual_input_usa_parser.md | 2 + docs/examples/dea_storage.md | 84 --- docs/examples/dea_storage_v10.md | 111 +++ ...input_usa.md => manual_input_usa_v0134.md} | 64 +- docs/user_guide/data_accessor.md | 43 +- docs/user_guide/datapackage.md | 20 +- docs/user_guide/dea_energy_storage_parser.md | 80 +++ docs/user_guide/manual_input_usa_parser.md | 78 ++ mkdocs.yaml | 8 +- src/technologydata/datapackage.py | 26 +- src/technologydata/parsers/commons.py | 15 +- src/technologydata/parsers/data_accessor.py | 117 ++- .../parsers/data_parser_base.py | 41 ++ .../parsers/dea_energy_storage/__init__.py | 87 +++ .../dea_energy_storage/dea_energy_storage.py | 658 ----------------- .../parsers/dea_energy_storage/parser_v10.py | 668 ++++++++++++++++++ .../parsers/manual_input_usa/__init__.py | 89 ++- .../manual_input_usa/manual_input_usa.py | 256 ------- .../parsers/manual_input_usa/parser_v0134.py | 273 +++++++ test/test_datapackage.py | 4 + ...rage.py => test_dea_energy_storage_v10.py} | 39 +- test/test_parser_commons.py | 20 +- test/test_parser_data_accessor.py | 53 +- 24 files changed, 1742 insertions(+), 1096 deletions(-) create mode 100644 docs/api/dea_energy_storage_parser.md create mode 100644 docs/api/manual_input_usa_parser.md delete mode 100644 docs/examples/dea_storage.md create mode 100644 docs/examples/dea_storage_v10.md rename docs/examples/{manual_input_usa.md => manual_input_usa_v0134.md} (58%) create mode 100644 docs/user_guide/dea_energy_storage_parser.md create mode 100644 docs/user_guide/manual_input_usa_parser.md create mode 100644 src/technologydata/parsers/data_parser_base.py delete mode 100644 src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py create mode 100644 src/technologydata/parsers/dea_energy_storage/parser_v10.py delete mode 100644 src/technologydata/parsers/manual_input_usa/manual_input_usa.py create mode 100644 src/technologydata/parsers/manual_input_usa/parser_v0134.py rename test/{test_dea_energy_storage.py => test_dea_energy_storage_v10.py} (87%) diff --git a/docs/api/dea_energy_storage_parser.md b/docs/api/dea_energy_storage_parser.md new file mode 100644 index 00000000..50fd3513 --- /dev/null +++ b/docs/api/dea_energy_storage_parser.md @@ -0,0 +1,2 @@ +::: technologydata.parsers.dea_energy_storage.DeaEnergyStorageParser +::: technologydata.parsers.dea_energy_storage.parser_v10.DeaEnergyStorageV10Parser diff --git a/docs/api/manual_input_usa_parser.md b/docs/api/manual_input_usa_parser.md new file mode 100644 index 00000000..a88a53f1 --- /dev/null +++ b/docs/api/manual_input_usa_parser.md @@ -0,0 +1,2 @@ +::: technologydata.parsers.manual_input_usa.ManualInputUsaParser +::: technologydata.parsers.manual_input_usa.parser_v0134.ManualInputUSAV0134Parser diff --git a/docs/examples/dea_storage.md b/docs/examples/dea_storage.md deleted file mode 100644 index 67853a5f..00000000 --- a/docs/examples/dea_storage.md +++ /dev/null @@ -1,84 +0,0 @@ -# Danish Energy Agency Parser Documentation - -## Overview - -The Danish Energy Agency (DEA) data parser `dea_energy_storage.py` demonstrates a full data-cleaning and transformation pipeline for converting raw tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py`. - -## Dataset Description - -The original dataset is available at this [link](https://ens.dk/media/6589/download). A full description of the dataset is available at this [link](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`. - -The dataset is in Excel format, and it includes, under the data sheet `alldata_flat`, a flat table of technology parameters for a range of energy storage technologies. Columns include `Technology`, `ws`, `par` (parameter name), `val` (value), `unit`, `year`, `est` (case/estimate), `priceyear`, plus metadata columns such as `cat`, `ref`, `note`. Rows are individual parameter records (parameter value + unit + context) for technologies and estimation cases. - -## Parser description - -The parser is articulated in the following steps. - -### Command line argument parsing - -Function `parse_input_arguments()` defines and parses the command-line arguments: - -- `--num_digits` (int, default 4) β€” number of decimals used when rounding numeric values. The default value is 4. -- `--store_source` (boolean flag) β€” whether to store the source on the Wayback Machine. The default value is `false`. -- `--filter_params` (boolean flag) β€” whether to limit exported parameters to a fixed allowed set. The default value is `false`. -- `--export_schema` (boolean flag) β€” export JSON schema files. The default value is `false`. - -### Read the raw data - -The script reads the raw data available at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`, under sheet `alldata_flat`, in a `pandas` dataframe. It uses `pandas.read_excel(..., engine=calamine, dtype=str)`. All entries are handled as strings initially. - -### Data cleaning, validation and dealing with missing/null values - -The data cleaning and validation happens with the following steps. - -Function `drop_invalid_rows(df)` validates whether required columns are present. It drops rows with missing/null or empty critical fields (`Technology`, `par`, `val`, `year`) and keeps rows where `year` contains a 4-digit year and `val` contains numeric characters and no comparator symbols (`<`, `>`, `≀`, `β‰₯`). - -Function `clean_technology_string()` normalizes text fields by removing leading 3-digit numeric codes, trims whitespace and lower-cases the string for consistent matching. It is applied to the columns `Technology` and `ws`. As an example, `clean_technology_string()` converts `151b Hydrogen Storage - LOHC` to `hydrogen storage - lohc`. - -Function `extract_year()` extracts the first sequence of digits from the `year` column and converts it to an integer. The column contains in fact entries like `Uncertainty (2050)` (str) which are converted to `2050` (int). - -Function `clean_parameter_string()` removes leading hyphens, removes text inside square brackets (units/notes), collapses extra spaces and lower-cases the parameter name. It is applied to the `par` column. - -Function `standardize_units()` is applied to columns `par` and `unit`. It completes missing units based on parameter name (e.g., `energy storage capacity for one unit` is mapped to the unit `MWh`) via a parameter-to-unit map. Moreover, it replaces known incorrect unit strings as `⁰C` -> `C` or `m2` to `meter**2`. The unit substitutions are driven by the `pint` documentation available at this [link](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt). - -Function `Commons.update_unit_with_currency_year(unit, priceyear)`, if present, appends `priceyear` information to currency units. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `EUR_2021`. - -Function `format_val_number(value, num_decimals)` parses numeric formats including comma decimal separators and scientific notation variants (e.g., `Γ—10`) and converts them to float and rounds them to `num_decimals`. - -The parser also applies the following corrections and substitutions: - -- Convert `MEUR_2020` and `kEUR_2020`/`KEUR_2020` to `EUR_2020` and scale numeric `val` accordingly (Γ—1e6 or Γ—1e3). -- Specific unit fixes (example: `mol/s/m/MPa1/2` β†’ `mol/s/m/Pa` with value scaling). -- Certain `par` values (e.g., `energy storage capacity for one unit`, `tank volume of example`) are normalized to `capacity`. - -Function `clean_est_string()` normalizes the `est` column by casefolding it and by replacing `ctrl` with `control`. - -Function `filter_parameters(df, filter_flag)`, if `filter_flag` is true, keeps only an allowed set of parameters (e.g., `technical lifetime`, `fixed o&m`, `specific investment`, `variable o&m`, `charge efficiency`, `discharge efficiency`, `capacity`). Otherwise returns the full set. - -### Populate and export the source and technology collections - -Function `build_technology_collection()`: - -- if `store_source` is set, constructs a `Source` object for the DEA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. -- groups the cleaned DataFrame by `est`, `year`, `ws`, `Technology`. -- for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `units`, `sources`, `provenance`). -- creates a `Technology` object for each group, with `name` = `ws`, `detailed_technology` = `Technology`, `year`=`year`, `region` = `EU`, `case` = `est` and collects them into a `TechnologyCollection` object. -- writes the `TechnologyCollection` object to a `technologies.json`. -- if `--export_schema` is used, schema files produced during export are moved to the sub-folder `src/technologydata/parsers/schemas`. - -## Running the parser - -### Execution instructions - -From repository root: - -- Basic run: `python src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py` -- Example with options: `--num_digits 3 --store_source --filter_params --export_schema` - -### Outputs - -The parser generates the following outputs: - -- `src/technologydata/parsers/dea_energy_storage/technologies.json`. -- `src/technologydata/parsers/dea_energy_storage/sources.json`. -- Optional schema files moved to `src/technologydata/parsers/schemas` when `--export_schema` is used. diff --git a/docs/examples/dea_storage_v10.md b/docs/examples/dea_storage_v10.md new file mode 100644 index 00000000..818ff07c --- /dev/null +++ b/docs/examples/dea_storage_v10.md @@ -0,0 +1,111 @@ +# Danish Energy Agency Parser Documentation + + + +## Overview + +!!! note + This example refers specifically to **version 10** (`v10`) of the DEA Energy Storage dataset. Details such as file names, sheet structure, and parser behaviour may differ for other versions. + +The Danish Energy Agency (DEA) data parser demonstrates a full data-cleaning and transformation pipeline for converting raw tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/dea_energy_storage/`. + +## Dataset Description + +The original dataset is available at this [link](https://ens.dk/media/6589/download). A full description of the dataset is available at this [link](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`. + +The dataset is in Excel format, and it includes, under the data sheet `alldata_flat`, a flat table of technology parameters for a range of energy storage technologies. Columns include `Technology`, `ws`, `par` (parameter name), `val` (value), `unit`, `year`, `est` (case/estimate), `priceyear`, plus metadata columns such as `cat`, `ref`, `note`. Rows are individual parameter records (parameter value + unit + context) for technologies and estimation cases. + +## Parser description + +The parser is articulated in the following steps. + +### Read the raw data + +The script reads the raw data available at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`, under sheet `alldata_flat`, in a `pandas` dataframe. It uses `pandas.read_excel(..., engine=calamine, dtype=str)`. All entries are handled as strings initially. + +### Data cleaning, validation and dealing with missing/null values + +The data cleaning and validation happens with the following steps. + +Function `_drop_invalid_rows(df)` validates whether required columns are present. It drops rows with missing/null or empty critical fields (`Technology`, `par`, `val`, `year`) and keeps rows where `year` contains a 4-digit year and `val` contains numeric characters and no comparator symbols (`<`, `>`, `≀`, `β‰₯`). + +Function `_clean_technology_string()` normalizes text fields by removing leading 3-digit numeric codes, trims whitespace and lower-cases the string for consistent matching. It is applied to the columns `Technology` and `ws`. As an example, `_clean_technology_string()` converts `151b Hydrogen Storage - LOHC` to `hydrogen storage - lohc`. + +Function `_extract_year()` extracts the first sequence of digits from the `year` column and converts it to an integer. The column contains in fact entries like `Uncertainty (2050)` (str) which are converted to `2050` (int). + +Function `_clean_parameter_string()` removes leading hyphens, removes text inside square brackets (units/notes), collapses extra spaces and lower-cases the parameter name. It is applied to the `par` column. + +Function `_standardize_units()` is applied to columns `par` and `unit`. It completes missing units based on parameter name (e.g., `energy storage capacity for one unit` is mapped to the unit `MWh`) via a parameter-to-unit map. Moreover, it replaces known incorrect unit strings as `⁰C` -> `C` or `m2` to `meter**2`. The unit substitutions are driven by the `pint` documentation available at this [link](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt). + +Function `Commons.update_unit_with_currency_year(unit, priceyear)`, if present, appends `priceyear` information to currency units. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `EUR_2021`. + +Function `_format_val_number(value, num_decimals)` parses numeric formats including comma decimal separators and scientific notation variants (e.g., `Γ—10`) and converts them to float and rounds them to `num_decimals`. + +The parser also applies the following corrections and substitutions: + +- Convert `MEUR_2020` and `kEUR_2020`/`KEUR_2020` to `EUR_2020` and scale numeric `val` accordingly (Γ—1e6 or Γ—1e3). +- Specific unit fixes (example: `mol/s/m/MPa1/2` β†’ `mol/s/m/Pa` with value scaling). +- Certain `par` values (e.g., `energy storage capacity for one unit`, `tank volume of example`) are normalized to `capacity`. + +Function `_clean_est_string()` normalizes the `est` column by casefolding it and by replacing `ctrl` with `control`. + +Function `_filter_parameters(df, filter_flag)`, if `filter_flag` is true, keeps only an allowed set of parameters (e.g., `technical lifetime`, `fixed o&m`, `specific investment`, `variable o&m`, `charge efficiency`, `discharge efficiency`, `capacity`). Otherwise returns the full set. + +### Populate and export the source and technology collections + +Function `_build_technology_collection()`: + +- if `archive_source` is set, constructs a `Source` object for the DEA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. +- groups the cleaned DataFrame by `est`, `year`, `ws`, `Technology`. +- for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `units`, `sources`, `provenance`). +- creates a `Technology` object for each group, with `name` = `ws`, `detailed_technology` = `Technology`, `year`=`year`, `region` = `EU`, `case` = `est` and collects them into a `TechnologyCollection` object. +- writes the `TechnologyCollection` object to a `technologies.json`. +- if `export_schema` is used, schema files produced during export are moved to the sub-folder `src/technologydata/parsers/schemas`. + +## Running the parser + +### Execution instructions + +The parser is run using the `DataAccessor` class. You need to create an instance of `DataAccessor` with the desired `data_source` and `version`, and then call the `parse()` method. + +Here is an example of how to run the parser from a Python script: + +```python +from technologydata.parsers.data_accessor import DataAccessor + +# Create an accessor for the version to be parsed +parser_accessor = DataAccessor( + data_source="dea_energy_storage", + version="v10" +) + +# Run the parser with desired options +parser_accessor.parse( + input_file_name="Technology_datasheet_for_energy_storage.xlsx", + num_digits=3, + archive_source=True, + filter_params=True, + export_schema=True, +) +``` + +The `parse` method accepts the following arguments: +- `input_file_name` (str): The name of the raw data file located in `src/technologydata/parsers/raw/`. +- `num_digits` (int, default 4): Number of decimals for rounding numeric values. +- `archive_source` (bool, default False): Whether to store the source on the Wayback Machine. +- `filter_params` (bool, default False): Whether to filter parameters. +- `export_schema` (bool, default False): Whether to export Pydantic schemas. + +### Outputs + +The parser generates the following outputs inside `src/technologydata/parsers/dea_energy_storage/v10/`: + +- `technologies.json` +- `sources.json` + +If `export_schema` is set to `True`, the Pydantic schema files are generated and moved to `src/technologydata/parsers/schemas/`. diff --git a/docs/examples/manual_input_usa.md b/docs/examples/manual_input_usa_v0134.md similarity index 58% rename from docs/examples/manual_input_usa.md rename to docs/examples/manual_input_usa_v0134.md index 83e75263..abfa1351 100644 --- a/docs/examples/manual_input_usa.md +++ b/docs/examples/manual_input_usa_v0134.md @@ -1,8 +1,18 @@ # Manual Input USA Parser Documentation + + ## Overview -The Manual Input USA data parser `manual_input_usa.py` demonstrates a data-cleaning and transformation pipeline for converting manually curated, USA-specific tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/manual_input_usa/manual_input_usa.py`. +!!! note + This example refers specifically to **version 0.13.4** (`v0134`) of the Manual Input USA dataset. + +The Manual Input USA data parser demonstrates a data-cleaning and transformation pipeline for converting manually curated, USA-specific tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/manual_input_usa/`. ## Dataset Description @@ -14,13 +24,6 @@ The dataset is in CSV format and includes a flat table of technology parameters The parser is articulated in the following steps. -### Command line argument parsing - -Function `CommonsParser.parse_input_arguments()` defines and parses the command-line arguments: - -- `--num_digits` (int, default 4) β€” number of decimals used when rounding numeric values. The default value is 4. -- `--store_source` (boolean flag) β€” whether to store the source on the Wayback Machine. The default value is `false`. - ### Read the raw data The script reads the raw data available at `src/technologydata/parsers/raw/manual_input_usa.csv` in a `pandas` dataframe. It uses `pandas.read_csv(..., dtype=str, na_values="None")`. All entries are handled as strings initially except for the `value` column which is converted to float. @@ -29,7 +32,7 @@ The script reads the raw data available at `src/technologydata/parsers/raw/manua The data cleaning and validation happens with the following steps. -Function `extract_units_carriers_heating_value()` extracts standardized units, carriers, and heating values from input unit strings. This function maps complex unit representations to simplified unit, carrier, and heating value combinations using a predefined dictionary of special patterns. Examples include: +Function `_extract_units_carriers_heating_value()` extracts standardized units, carriers, and heating values from input unit strings. This function maps complex unit representations to simplified unit, carrier, and heating value combinations using a predefined dictionary of special patterns. Examples include: - `USD_2022/MW_FT` β†’ unit: `USD_2022/MW`, carrier: `1/FT`, heating_value: `1/LHV` - `MWh_H2/MWh_FT` β†’ unit: `MWh/MWh`, carrier: `H2/FT`, heating_value: `LHV` @@ -50,9 +53,9 @@ Function `Commons.update_unit_with_currency_year(unit, currency_year)` appends ` ### Populate and export the source and technology collections -Function `build_technology_collection()`: +Function `_build_technology_collection()`: -- if `store_source` is set, constructs a `Source` object for the manual input USA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. +- if `archive_source` is set, constructs a `Source` object for the manual input USA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. - groups the cleaned DataFrame by `scenario`, `year`, `technology`. - for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `sources`, and optionally `carrier`, `heating_value`, `units`, `note`). - captures the `financial_case` value from rows within each group to combine with `scenario`. @@ -64,15 +67,40 @@ Function `build_technology_collection()`: ### Execution instructions -From repository root: +The parser is run using the `DataAccessor` class. You need to create an instance of `DataAccessor` with the desired `data_source` and `version`, and then call the `parse()` method. + +Here is an example of how to run the parser from a Python script: + +```python +from technologydata.parsers.data_accessor import DataAccessor -- Basic run: `python src/technologydata/parsers/manual_input_usa/manual_input_usa.py` -- Example with options: `--num_digits 3 --store_source` +# Create an accessor for the version to be parsed +parser_accessor = DataAccessor( + data_source="manual_input_usa", + version="v0.13.4" +) + +# Run the parser with desired options +parser_accessor.parse( + input_file_name="manual_input_usa.csv", + num_digits=3, + archive_source=True, + export_schema=True, +) +``` + +The `parse` method accepts the following arguments: +- `input_file_name` (str): The name of the raw data file located in `src/technologydata/parsers/raw/`. +- `num_digits` (int, default 4): Number of decimals for rounding numeric values. +- `archive_source` (bool, default False): Whether to store the source on the Wayback Machine. +- `filter_params` (bool, default False): Whether to filter parameters (not used by this parser). +- `export_schema` (bool, default False): Whether to export Pydantic schemas. ### Outputs -The parser generates the following outputs: +The parser generates the following outputs inside `src/technologydata/parsers/manual_input_usa/v0.13.4/`: + +- `technologies.json` +- `sources.json` -- `src/technologydata/parsers/manual_input_usa/technologies.json`. -- `src/technologydata/parsers/manual_input_usa/sources.json`. -- Optional schema files moved to `src/technologydata/parsers/schemas` when `--export_schema` is used. +If `export_schema` is set to `True`, the Pydantic schema files are generated and moved to `src/technologydata/parsers/schemas/`. diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 7532198c..0af0d876 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -9,7 +9,7 @@ SPDX-License-Identifier: MIT ## Overview -The `DataAccessor` class provides a standardized way to access and load technology datasets from versioned data sources. It simplifies the process of selecting a specific data source and version, automatically handling the resolution of file paths and loading the data into a `DataPackage` object. +The `DataAccessor` class provides a standardized way to access and load technology datasets from versioned data sources. It simplifies the process of selecting a specific data source and version, automatically handling the resolution of file paths and loading the data into a `DataPackage` object. It also provides an interface to run the parsers that generate this data. It is designed to work with a specific directory structure where datasets are organized by name and version. @@ -18,8 +18,9 @@ It is designed to work with a specific directory structure where datasets are or - **Data Source Selection**: Easily specify which dataset to load using the `DataSourceName` enumeration. - **Version Management**: Load a specific version of a dataset or automatically detect and use the latest available version. - **Standardized Loading**: Loads a `DataPackage` from a versioned folder, which is expected to contain `technologies.json` and optionally `sources.json`. -- **Error Handling**: Raises `FileNotFoundError` if the specified data source or version directories cannot be found. -- **Seamless Integration**: Returns a `DataPackage` object, ready for use with other components of the `technologydata` library. +- **Parsing Interface**: Provides a `parse()` method to run the appropriate parser for a given data source and version to generate the data files. +- **Error Handling**: Raises `FileNotFoundError` if the specified data source or version directories cannot be found, and `ValueError` for unsupported sources or versions. +- **Seamless Integration**: The `load()` method returns a `DataPackage` object, ready for use with other components of the `technologydata` library. ## Usage Examples @@ -38,40 +39,46 @@ accessor_v1 = DataAccessor( # Create an accessor that will use the latest version accessor_latest = DataAccessor( - data_source_name="dea_energy_storage" + data_source="dea_energy_storage" ) ``` -### Accessing Data +### Loading Data -Once the `DataAccessor` is instantiated, call the `access_data()` method to load the dataset. The method handles finding the correct directory and then calls `DataPackage.from_json()` on that directory. +Once the `DataAccessor` is instantiated, call the `load()` method to load the dataset. The method handles finding the correct directory and then calls `DataPackage.from_json()` on that directory. The directory structure is expected to be: `src/technologydata/parsers///`. -#### Loading a Specific Version - -If `data_version` was specified during instantiation, `access_data()` will look for that exact version. +The `load()` method will look for the exact version specified during instantiation. If the version is not provided or not found, it will raise a `ValueError` and inform you of the latest available version. ```python # Assuming the path .../parsers/manual_input_usa/v1.0.0/ exists -dp_v1 = accessor_v1.access_data() +dp_v1 = accessor_v1.load() # dp_v1 is now a DataPackage object containing the data from v1.0.0 print(type(dp_v1)) # ``` -#### Loading the Latest Version +### Parsing Raw Data -If `data_version` is not provided or not found, `access_data()` automatically identifies the latest version based on semantic versioning rules (e.g., `v2.1.0` is newer than `v2.0.0`, and `v10` is newer than `v2`). +The `parse()` method is used to execute the data processing pipeline for a specific data source and version. It takes the raw data file as input and generates the structured `technologies.json` and `sources.json` files. ```python -# Assuming .../parsers/dea_energy_storage/ contains version directories like 'v1', 'v2' -# The accessor will load data from the latest version found (e.g., 'v2') -dp_latest = accessor_latest.access_data() +from technologydata.parsers.data_accessor import DataAccessor -print(type(dp_latest)) -# +# Create an accessor for the version to be parsed +parser_accessor = DataAccessor( + data_source="dea_energy_storage", + version="v10" +) + +# Run the parser +parser_accessor.parse( + input_file_name="dea_energy_storage_v10.xlsx", + num_digits=2, + archive_source=True +) ``` ## API Reference @@ -82,4 +89,4 @@ Please refer to the [API documentation](../api/data_accessor.md) for detailed in - **Directory Structure**: The `DataAccessor` expects a specific directory structure within the project: `src/technologydata/parsers///`. It will not find data located elsewhere. - **Version Naming**: Version directories must be prefixed with a `v` and follow a pattern that can be parsed by `packaging.version` (e.g., `v1`, `v2.0`, `v1.0.1-alpha`). Directories that do not match this pattern will be ignored when searching for the latest version. -- **Target Data**: The class is designed to load a `DataPackage` from a folder. See the `DataPackage` documentation for more details on the expected contents of that folder (i.e., `technologies.json`). +- **Target Data**: The `load()` method is designed to load a `DataPackage` from a folder. See the [DataPackage](./datapackage.md) documentation for more details on the expected contents of that folder (i.e.,`technologies.json`). diff --git a/docs/user_guide/datapackage.md b/docs/user_guide/datapackage.md index c67e78d5..019c5616 100644 --- a/docs/user_guide/datapackage.md +++ b/docs/user_guide/datapackage.md @@ -13,6 +13,7 @@ The `DataPackage` class in `technologydata` provides a container for managing co ## Features +- **Name & Version**: Stores the dataset name (required) and version (optional) as first-class attributes. - **Technology Collection**: Stores a collection of `Technology` objects via the `TechnologyCollection` class. - **Source Collection**: Stores a collection of `Source` objects via the `SourceCollection` class. - **Batch Operations**: Supports batch export to JSON and CSV formats. @@ -23,13 +24,15 @@ The `DataPackage` class in `technologydata` provides a container for managing co ### Creating a DataPackage -You can create a `DataPackage` by instantiating it directly or by loading from JSON files. +You can create a `DataPackage` by instantiating it directly or by loading from JSON files. The `name` field is required; `version` is optional. ```python from technologydata import DataPackage, TechnologyCollection, SourceCollection # Create a DataPackage with existing collections dp = DataPackage( + name="dataset_name", + version="v10", technologies=TechnologyCollection(...), sources=SourceCollection(...), ) @@ -37,11 +40,16 @@ dp = DataPackage( ### Loading from JSON -To load a `DataPackage` from a folder containing `technologies.json` and (optionally) `sources.json`: +To load a `DataPackage` from a folder containing `technologies.json` and (optionally) `sources.json`, pass the dataset `name`, an optional `version`, and the path to the folder: ```python from technologydata import DataPackage -dp = DataPackage.from_json("path/to/data_package_folder") + +dp = DataPackage.from_json( + name="dataset_name", + version="v10", + path_to_folder="path/to/data_package_folder", +) ``` This will automatically extract sources from the technologies if not already present. @@ -55,6 +63,8 @@ from technologydata import DataPackage, TechnologyCollection, SourceCollection # Create a DataPackage with existing collections dp = DataPackage( + name="dataset_name", + version="v10", technologies=TechnologyCollection(...), sources=SourceCollection(...), ) @@ -70,6 +80,8 @@ from technologydata import DataPackage, TechnologyCollection, SourceCollection # Create a DataPackage with existing collections dp = DataPackage( + name="dataset_name", + version="v10", technologies=TechnologyCollection(...), sources=SourceCollection(...), ) @@ -90,6 +102,8 @@ from technologydata.technology_collection import TechnologyCollection # Create a DataPackage with existing collections dp = DataPackage( + name="dataset_name", + version="v10", technologies=TechnologyCollection(...), ) diff --git a/docs/user_guide/dea_energy_storage_parser.md b/docs/user_guide/dea_energy_storage_parser.md new file mode 100644 index 00000000..ff9482c3 --- /dev/null +++ b/docs/user_guide/dea_energy_storage_parser.md @@ -0,0 +1,80 @@ +# DEA Energy Storage Parser + +The `DeaEnergyStorageParser` is responsible for parsing data from the Danish Energy Agency (DEA) Energy Storage dataset. It is designed to handle different versions of the dataset, with a specific implementation for `v10`. + +## Main Parser: `DeaEnergyStorageParser` + +The main parser, `DeaEnergyStorageParser`, acts as a dispatcher that selects the appropriate version-specific parser based on the user's request. + +### Key Features: + +- **Version Dispatching**: Dynamically selects the correct parser for a given dataset version (e.g., `v10`). +- **Supported Versions**: Provides a method to get a list of all supported dataset versions. + +### Usage: + +While it is possible to use the parser directly, the recommended way to access the data is through the `DataAccessor` class, which provides a higher-level interface and handles the parsing process internally. See the [Data Accessor](./data_accessor.md) documentation for more details. + +If you need to use the parser directly, you can instantiate `DeaEnergyStorageParser` and call the `parse` method with the desired version and other parameters. + +```python +from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser +import pathlib + +# Instantiate the main parser +dea_parser = DeaEnergyStorageParser() + +# Define parameters +version = "v10" +input_file = pathlib.Path("path/to/your/data.xlsx") +num_digits = 3 +archive_source = False +filter_params = True +export_schema = False + +# Parse the data +dea_parser.parse( + version=version, + input_path=input_file, + num_digits=num_digits, + archive_source=archive_source, + filter_params=filter_params, + export_schema=export_schema, +) +``` + +## Version-Specific Parser: `DeaEnergyStorageV10Parser` + +The `DeaEnergyStorageV10Parser` is a concrete implementation that handles version 10 of the DEA Energy Storage dataset. It inherits from `ParserBase` and contains the logic for reading, cleaning, and transforming the raw data. + +### Key Responsibilities: + +- **Data Loading**: Reads data from the specified Excel file (`alldata_flat` sheet). +- **Data Cleaning**: + - Removes invalid or incomplete rows. + - Cleans and standardizes technology names, parameters, and units. + - Extracts and formats year values. +- **Data Transformation**: + - Converts currency units (e.g., `MEUR_2020` to `EUR_2020`) and adjusts values accordingly. + - Standardizes parameter names (e.g., maps `energy storage capacity for one unit` to `capacity`). +- **Object Creation**: Builds a `TechnologyCollection` from the processed data. +- **Output Generation**: Exports the final `TechnologyCollection` and `SourceCollection` to JSON files. + +### `parse` Method + +The `parse` method orchestrates the entire parsing process for the `v10` dataset. + +**Parameters:** + +- `input_path` (`pathlib.Path`): Path to the raw input Excel file. +- `num_digits` (`int`): Number of significant digits for rounding numerical values. +- `archive_source` (`bool`): If `True`, archives the data source on the Wayback Machine. +- `**kwargs`: + - `filter_params` (`bool`): If `True`, filters parameters to a predefined allowed set. + - `export_schema` (`bool`): If `True`, exports the Pydantic schema for the data models. + +The processed data is saved to `technologies.json` and `sources.json` in the `src/technologydata/parsers/dea_energy_storage/v10/` directory. + +## API Reference + +Please refer to the [API documentation](../api/dea_energy_storage_parser.md) for detailed information on the class methods and attributes. diff --git a/docs/user_guide/manual_input_usa_parser.md b/docs/user_guide/manual_input_usa_parser.md new file mode 100644 index 00000000..af924820 --- /dev/null +++ b/docs/user_guide/manual_input_usa_parser.md @@ -0,0 +1,78 @@ +# Manual Input USA Parser + +The `ManualInputUsaParser` is responsible for parsing data from the `manual_input_usa.csv` dataset. It is designed to handle different versions of the dataset, with a specific implementation for `v0.13.4`. + +## Main Parser: `ManualInputUsaParser` + +The main parser, `ManualInputUsaParser`, acts as a dispatcher that selects the appropriate version-specific parser based on the user's request. + +### Key Features: + +- **Version Dispatching**: Dynamically selects the correct parser for a given dataset version (e.g., `v0.13.4`). +- **Supported Versions**: Provides a method to get a list of all supported dataset versions. + +### Usage: + +While it is possible to use the parser directly, the recommended way to access the data is through the `DataAccessor` class, which provides a higher-level interface and handles the parsing process internally. See the [Data Accessor](./data_accessor.md) documentation for more details. + +If you need to use the parser directly, you can instantiate `ManualInputUsaParser` and call the `parse` method with the desired version and other parameters. + +```python +from technologydata.parsers.manual_input_usa import ManualInputUsaParser +import pathlib + +# Instantiate the main parser +manual_input_parser = ManualInputUsaParser() + +# Define parameters +version = "v0.13.4" +input_file = pathlib.Path("path/to/your/manual_input_usa.csv") +num_digits = 3 +archive_source = False +filter_params = True +export_schema = False + +# Parse the data +manual_input_parser.parse( + version=version, + input_path=input_file, + num_digits=num_digits, + archive_source=archive_source, + filter_params=filter_params, + export_schema=export_schema, +) +``` + +## Version-Specific Parser: `ManualInputUSAV0134Parser` + +The `ManualInputUSAV0134Parser` is a concrete implementation that handles version `v0.13.4` of the `manual_input_usa.csv` dataset. It inherits from `ParserBase` and contains the logic for reading, cleaning, and transforming the raw data. + +### Key Responsibilities: + +- **Data Loading**: Reads data from the specified CSV file. +- **Data Cleaning**: + - Handles missing values in the `scenario` column. + - Converts `per unit` to `%` and adjusts the corresponding values. + - Includes `currency_year` in the `unit` column where applicable. +- **Data Transformation**: + - Extracts standardized units, carriers, and heating values from complex unit strings using the `_extract_units_carriers_heating_value` method. +- **Object Creation**: Builds a `TechnologyCollection` from the processed data using the `_build_technology_collection` method. +- **Output Generation**: Exports the final `TechnologyCollection` and `SourceCollection` to JSON files. + +### `parse` Method + +The `parse` method orchestrates the entire parsing process for the `v0.13.4` dataset. + +**Parameters:** + +- `input_path` (`pathlib.Path`): Path to the raw input CSV file. +- `num_digits` (`int`): Number of significant digits for rounding numerical values. +- `archive_source` (`bool`): If `True`, archives the data source on the Wayback Machine. +- `**kwargs`: + - `export_schema` (`bool`): If `True`, exports the Pydantic schema for the data models. + +The processed data is saved to `technologies.json` and `sources.json` in the `src/technologydata/parsers/manual_input_usa/v0.13.4/` directory. + +## API Reference + +Please refer to the [API documentation](../api/manual_input_usa_parser.md) for detailed information on the class methods and attributes. diff --git a/mkdocs.yaml b/mkdocs.yaml index 0455268c..04ddcbd1 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -28,12 +28,14 @@ nav: - Source Collection: user_guide/source_collection.md - Technology: user_guide/technology.md - Technology Collection: user_guide/technology_collection.md + - DEA Energy Storage Parser: user_guide/dea_energy_storage_parser.md + - Manual Input USA Parser: user_guide/manual_input_usa_parser.md - Data Accessor: user_guide/data_accessor.md - Use Cases: user_guide/design.md - Examples: - - Danish Energy Agency Parser: examples/dea_storage.md - - Manual Input USA Parser: examples/manual_input_usa.md + - Danish Energy Agency Parser (version 10): examples/dea_storage_v10.md + - Manual Input USA Parser (version 0.13.4): examples/manual_input_usa_v0134.md - API Reference: - Data Package: api/datapackage.md @@ -43,6 +45,8 @@ nav: - Technology: api/technology.md - Technology Collection: api/technology_collection.md - Data Accessor: api/data_accessor.md + - Dea Energy Storage Parser: api/dea_energy_storage_parser.md + - Manual Input USA Parser: api/manual_input_usa_parser.md - Utils: - Commons: - Common functionalities: api/commons/commons.md diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index 78e91593..1f7a431e 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -29,6 +29,10 @@ class DataPackage(pydantic.BaseModel): Attributes ---------- + name : str + The name of the dataset stored in the DataPackage object. + version : Optional[str] + The version of the dataset stored in the DataPackage object. technologies : Optional[TechnologyCollection] List of Technology objects. sources : Optional[SourceCollection] @@ -36,6 +40,18 @@ class DataPackage(pydantic.BaseModel): """ + name: Annotated[ + str, + pydantic.Field( + description="The name of the dataset stored in the DataPackage object." + ), + ] + version: Annotated[ + str | None, + pydantic.Field( + description="The version of the dataset stored in the DataPackage object." + ), + ] = None technologies: Annotated[ TechnologyCollection | None, pydantic.Field(description="List of Technology objects."), @@ -70,12 +86,18 @@ def get_source_collection(self) -> None: self.sources = SourceCollection(sources=list(sources_set)) @classmethod - def from_json(cls, path_to_folder: pathlib.Path | str) -> Self: + def from_json( + cls, name: str, version: str | None, path_to_folder: pathlib.Path | str + ) -> Self: """ Load a DataPackage from a JSON file. Parameters ---------- + name : str + The name of the dataset stored in the DataPackage object. + version: Optional[str] + The version of the dataset stored in the DataPackage object. path_to_folder : pathlib.Path or str Path to the data package folder. @@ -91,6 +113,8 @@ def from_json(cls, path_to_folder: pathlib.Path | str) -> Self: # Create DataPackage instance data_package = cls( + name=name, + version=version, path=path_to_folder, technologies=technologies, ) diff --git a/src/technologydata/parsers/commons.py b/src/technologydata/parsers/commons.py index b820b64e..a154d11d 100644 --- a/src/technologydata/parsers/commons.py +++ b/src/technologydata/parsers/commons.py @@ -104,9 +104,20 @@ def parse_input_arguments( help="Number of significant digits to round the values.", ), ArgumentConfig( - name="--store_source", + name="--archive_source", action="store_true", - help="Store_source, store the source object on the wayback machine. Default: false", + help="Archive_source, store the source object on the wayback machine. Default: false", + ), + ArgumentConfig( + name="--version", + arg_type=str, + help="Version of the dataset to parse.", + ), + ArgumentConfig( + name="--input_file_name", + arg_type=str, + help="Name of the dataset file to parse. Default: None", + required=True, ), ] diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/parsers/data_accessor.py index 8d01b811..7d651897 100644 --- a/src/technologydata/parsers/data_accessor.py +++ b/src/technologydata/parsers/data_accessor.py @@ -7,6 +7,7 @@ import logging import pathlib import re +import sys from enum import Enum from typing import Annotated @@ -15,6 +16,8 @@ from pydantic import field_validator from technologydata import DataPackage +from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser +from technologydata.parsers.manual_input_usa import ManualInputUsaParser path_cwd = pathlib.Path.cwd() @@ -36,33 +39,26 @@ class DataAccessor(pydantic.BaseModel): datasets from predefined data sources. It can either load a specific version or automatically determine and load the latest available version. - Parameters + Attributes ---------- - data_source_name : str + data_source : str The name of the data source to access, as defined in the `DataSourceName` enumeration. - data_version : str, optional + version : str, optional The specific version string of the data to load (e.g., "v1.0.0"). If not provided, the latest version will be automatically determined and used. Default is None. - Attributes - ---------- - data_source_name : str - The name of the data source. - data_version : str or None - The version of the data source. - """ - data_source_name: Annotated[ + data_source: Annotated[ str, pydantic.Field(description="The name of the data source.") ] - data_version: Annotated[ + version: Annotated[ str | None, pydantic.Field(description="The version of the data source.") ] = None - @field_validator("data_source_name", mode="before") + @field_validator("data_source", mode="before") @classmethod def _validate_data_source_name(cls, v: str) -> DataSourceName: # Validate if the given string is a valid DataSourceName @@ -121,23 +117,106 @@ def load(self) -> DataPackage: """ source_path = pathlib.Path( - path_cwd, "src", "technologydata", "parsers", self.data_source_name + path_cwd, "src", "technologydata", "parsers", self.data_source ) if not source_path.is_dir(): raise FileNotFoundError(f"Data source directory not found: {source_path}") source_path_list = [p.name for p in source_path.iterdir() if p.is_dir()] - if self.data_version and self.data_version in source_path_list: - version = self.data_version + if self.version and self.version in source_path_list: + version = self.version logger.info( - f"Data source directory corresponding to version {self.data_version} found." + f"Data source directory corresponding to version {self.version} found." ) else: version = self.get_latest_version_string(list(source_path.iterdir())) raise ValueError( - f"Data source version '{self.data_version}' not found. The latest available version is {version}." + f"Data source version '{self.version}' not found. The latest available version is {version}." ) data_path = pathlib.Path(source_path, version) - return DataPackage.from_json(data_path) + dp = DataPackage.from_json(self.data_source, self.version, data_path) + return dp + + def parse( + self, + input_file_name: str, + num_digits: int = 4, + archive_source: bool = False, + filter_params: bool = False, + export_schema: bool = False, + ) -> None: + """ + Run the parser for the specified data source and version. + + This method locates the appropriate parser for the given data source + and version, and executes it to generate the technology data package. + + Parameters + ---------- + input_file_name : str + The name of the input file in the 'raw' directory. + num_digits : int, optional + Number of significant digits to round the values. Default is 4. + archive_source : bool, optional + Store the source object on the Wayback Machine. Default is False. + filter_params : bool, optional + Filter the parameters stored to technologies.json. Default is False. + export_schema : bool, optional + Export the Source/TechnologyCollection schemas. Default is False. + + Raises + ------ + ValueError + If the specified data source or version is not supported. + FileNotFoundError + If the required input data file is not found. + + """ + parser: DeaEnergyStorageParser | ManualInputUsaParser + + if self.data_source == DataSourceName.DEA_ENERGY_STORAGE: + parser = DeaEnergyStorageParser() + elif self.data_source == DataSourceName.MANUAL_INPUT_USA: + parser = ManualInputUsaParser() + else: + raise ValueError( + f"Unsupported data source: {self.data_source}. " + f"Supported data sources are: {[e for e in DataSourceName]}" + ) + + # Read the raw data + input_data_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "parsers", + "raw", + input_file_name, + ) + + logger.info(f"Input data path set to: {input_data_path}") + + if self.version not in parser.get_supported_versions(): + logging.error( + f"Version '{self.version}' is not supported. " + f"Supported versions: {parser.get_supported_versions()}" + ) + sys.exit(1) + + try: + parser.parse( + version=self.version, + input_path=input_data_path, + num_digits=num_digits, + archive_source=archive_source, + filter_params=filter_params, + export_schema=export_schema, + ) + + logging.info(f"Successfully generated files for version {self.version} ") + + except (ValueError, FileNotFoundError, KeyError) as e: + logging.error(f"An error occurred during parsing: {e}") + sys.exit(1) diff --git a/src/technologydata/parsers/data_parser_base.py b/src/technologydata/parsers/data_parser_base.py new file mode 100644 index 00000000..59fb5ec1 --- /dev/null +++ b/src/technologydata/parsers/data_parser_base.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Abstract base class for a specific version of the data parser.""" + +import abc +import pathlib +from typing import Any + + +class ParserBase(abc.ABC): + """Abstract base class for a specific version of the data parser.""" + + @abc.abstractmethod + def parse( + self, + input_path: pathlib.Path, + num_digits: int, + archive_source: bool, + **kwargs: Any, + ) -> None: + """ + Parse a specific version of a dataset. + + Parameters + ---------- + input_path : pathlib.Path + Path to the raw input data file. + num_digits : int + Number of significant digits to round the values. + archive_source : bool + If True, archive the source object on the Wayback Machine. + **kwargs : Any + filter_params : bool, optional + If True, filter the parameters stored in the output. + export_schema : bool, optional + If True, export the Pydantic schema for the data models. + + """ + raise NotImplementedError diff --git a/src/technologydata/parsers/dea_energy_storage/__init__.py b/src/technologydata/parsers/dea_energy_storage/__init__.py index 1ef3068c..49ce63ea 100644 --- a/src/technologydata/parsers/dea_energy_storage/__init__.py +++ b/src/technologydata/parsers/dea_energy_storage/__init__.py @@ -3,3 +3,90 @@ # SPDX-License-Identifier: MIT """Provide a parser for the DEA data storage dataset.""" + +import logging +import pathlib + +from technologydata.parsers.data_parser_base import ParserBase +from technologydata.parsers.dea_energy_storage.parser_v10 import ( + DeaEnergyStorageV10Parser, +) + + +class DeaEnergyStorageParser: + """ + Main parser for the DEA Energy Storage dataset. + + Dispatches to version-specific parser implementations. + """ + + def __init__(self) -> None: + """Initialize the parser and maps versions to parser classes.""" + self._parsers: dict[str, type[ParserBase]] = { + "v10": DeaEnergyStorageV10Parser, + # "v11": DeaEnergyStorageV11Parser, # Add new versions here + } + + def get_supported_versions(self) -> list[str]: + """Return a list of supported dataset versions.""" + return list(self._parsers.keys()) + + def parse( + self, + version: str, + input_path: pathlib.Path, + num_digits: int, + archive_source: bool, + filter_params: bool, + export_schema: bool, + ) -> None: + """ + Parse the specified version of the DEA Energy Storage dataset. + + This method selects the appropriate parser for the given version and + delegates the parsing task to it. + + Parameters + ---------- + version : str + The version of the dataset to parse (e.g., 'v10'). + input_path : pathlib.Path + Path to the raw input data file. + num_digits : int, optional + Number of significant digits to round the values, by default 4. + archive_source : bool, optional + If True, archives the source object on the Wayback Machine, by default False. + filter_params : bool, optional + If True, filters the parameters stored in the output, by default False. + export_schema : bool, optional + If True, exports the Pydantic schema for the data models, by default False. + + Raises + ------ + ValueError + If the specified version is not supported. + + """ + if version not in self._parsers: + raise ValueError( + f"Unsupported version: {version}. " + f"Supported versions are: {', '.join(self.get_supported_versions())}" + ) + + parser_class = self._parsers[version] + parser_instance = parser_class() + + logging.info( + f"Parsing DEA Energy Storage dataset version {version} using {parser_class.__name__}" + ) + return parser_instance.parse( + input_path=input_path, + num_digits=num_digits, + archive_source=archive_source, + filter_params=filter_params, + export_schema=export_schema, + ) + + +# Make the main parser class available for import from the module +__all__ = ["DeaEnergyStorageParser", "DeaEnergyStorageV10Parser"] diff --git a/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py b/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py deleted file mode 100644 index 2a3be692..00000000 --- a/src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py +++ /dev/null @@ -1,658 +0,0 @@ -# SPDX-FileCopyrightText: technologydata contributors -# -# SPDX-License-Identifier: MIT - -""" -Data parser for the DEA energy storage data set. - -How to run: - From the repository root, execute: - python src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py - -Configuration options (command-line arguments): - --num_digits Number of significant digits to round the values. Default: 4 - --store_source Store the source object on the Wayback Machine. Default: False - --filter_params Filter the parameters stored to technologies.json. Default: False - --export_schema Export the Source/TechnologyCollection schemas. Default: False - -Example: - python src/technologydata/parsers/dea_energy_storage/dea_energy_storage.py --num_digits 3 --store_source --filter_params - -""" - -import logging -import pathlib -import re -import typing - -import pandas as pd -import pydantic - -from technologydata import ( - Commons, - Parameter, - Source, - SourceCollection, - Technology, - TechnologyCollection, -) -from technologydata.parsers.commons import ArgumentConfig, CommonsParser - -path_cwd = pathlib.Path.cwd() - -logger = logging.getLogger(__name__) - - -def drop_invalid_rows(dataframe: pd.DataFrame) -> pd.DataFrame: - """ - Clean and filter a DataFrame by removing rows with invalid or incomplete data. - - This function performs multiple validation checks to ensure data quality: - - Removes rows with None or NaN values in critical columns - - Removes rows with empty or whitespace-only strings - - Filters rows based on specific data integrity criteria - - Discards rows where 'val' column contains comparator symbols or non-numeric values - - Parameters - ---------- - dataframe : pd.DataFrame - The input DataFrame to be cleaned and validated. - - Returns - ------- - pd.DataFrame - A new DataFrame with invalid rows removed, maintaining data integrity. - - Notes - ----- - Validation criteria include: - - Non-empty 'Technology', 'par', and 'val' columns - - 'year' column containing a valid 4-digit year - - 'val' column containing only numeric values (no comparator symbols) - - """ - # Create a copy to avoid modifying the original DataFrame - df_cleaned = dataframe.copy() - - # Validate column existence - required_columns = ["Technology", "par", "val", "year"] - missing_columns = [col for col in required_columns if col not in df_cleaned.columns] - if missing_columns: - raise ValueError(f"Missing required columns: {missing_columns}") - - # Remove rows with None or NaN values in critical columns - df_cleaned = df_cleaned.dropna(subset=required_columns) - - # Remove rows with empty or whitespace-only strings - for column in required_columns: - df_cleaned = df_cleaned[df_cleaned[column].astype(str).str.strip() != ""] - - # Filter rows with valid year (4 consecutive digits) - df_cleaned = df_cleaned[ - df_cleaned["year"].astype(str).str.contains(r"\d{4}", regex=True) - ] - - # Remove rows with comparator symbols or without digits in 'val' column - df_cleaned = df_cleaned[ - (~df_cleaned["val"].astype(str).str.contains(r"[<>≀β‰₯]", regex=True)) - & (df_cleaned["val"].astype(str).str.contains(r"\d", regex=True)) - ] - - return df_cleaned - - -@pydantic.validate_call -def clean_parameter_string(text_string: str) -> str: - """ - Remove any string between [] or [), any leading hyphen or double quotes from the input string. Lower-case all. - - Parameters - ---------- - text_string : str - input string to be cleaned. - - Returns - ------- - str - cleaned string with [] and [) and leading hyphen or double quotes removed. - - Examples - -------- - >>> clean_parameter_string("- Charge efficiency [%]") - charge efficiency - >>> clean_parameter_string("Energy storage capacity for one unit [MWh)") - energy storage capacity for one unit - - """ - # Remove leading hyphen - text_string = text_string.lstrip("-") - - # Remove content inside square brackets including the brackets themselves - result = re.sub(r"\[.*?\]", "", text_string) - - # Remove content inside square bracket and parenthesis including the brackets/parenthesis themselves - result = re.sub(r"\[.*?\)", "", result) - - # Remove extra spaces resulting from the removal and set all to lower case - result = re.sub(r"\s+", " ", result).strip().casefold() - - return result - - -@pydantic.validate_call -def clean_technology_string(tech_str: str) -> str: - """ - Clean a technology string by removing numeric patterns and standardizing case. - - This function pre-processes technology-related strings by: - - Removing three-digit numeric patterns (with optional letter) - - Stripping leading and trailing whitespace - - Converting to lowercase for case-insensitive comparison - - Parameters - ---------- - tech_str : str - Input technology string to be cleaned. - - Returns - ------- - str - Cleaned technology string with: - - Numeric patterns (like '123' or '456a') removed - - Whitespace stripped - - Converted to lowercase - - Raises - ------ - Exception - If string conversion or processing fails, logs the error and returns the original input. - - Examples - -------- - >>> clean_technology_string("143a Rock-based Carnot battery") - rock-based carnot battery - >>> clean_technology_string("Pit Thermal Energy Storage [PTES]") - pit thermal energy storage [ptes] - - """ - try: - # Remove three-digit patterns or three digits followed by a letter - return re.sub(r"^(\d{3}[a-zA-Z]?)", "", tech_str.strip()).strip().casefold() - except Exception as e: - logger.error(f"Error cleaning technology '{tech_str}': {e}") - return tech_str - - -@pydantic.validate_call -def format_val_number(input_value: str, num_decimals: int) -> float | None | typing.Any: - """ - Parse various number formats into a float value. - - Parameters - ---------- - input_value : str - The input number in different formats, such as: - - Scientific notation with "x10^": e.g., "2.84x10^23" - - Numbers with commas as decimal separators: e.g., "1,1" - num_decimals : int - Number of decimals - - Returns - ------- - float - The parsed numerical value as a float. - - Raises - ------ - ValueError - If the input cannot be parsed into a float. - - Examples - -------- - >>> format_val_number("1,1") - 1.1 - >>> format_val_numer("2.84Γ—10-27") - 2.84e-27 - - """ - s = str(input_value).strip() - - # Handle scientific notation like "2.84x10^23" - match = re.match(r"([+-]?\d*\.?\d+)Γ—10([+-]?\d+)", s) - if match: - base, exponent = match.groups() - return round(float(base), num_decimals) * (10 ** int(exponent)) - - # Replace comma with dot for decimal numbers - s = s.replace(",", ".") - try: - return round(float(s), num_decimals) - except ValueError: - raise ValueError(f"Cannot parse number from input: {input_value}") - - -@pydantic.validate_call -def extract_year(year_str: str) -> int | None: - """ - Extract the first year (integer) from a given input. - - Parameters - ---------- - year_str : str - Input value containing a potential year. - - Returns - ------- - int, None - Extracted first year. - - Examples - -------- - >>> extract_year('uncertainty (2050)') - 2050 - - """ - # Extract digits - digits = re.findall(r"\d+", year_str) - - # Convert to integer - return int(digits[0]) if digits else None - - -@pydantic.validate_call -def clean_est_string(est_str: str) -> str: - """ - Casefold the 'est' string, trim whitespace and replace `ctrl` with `control`. - - Parameters - ---------- - est_str : str - The input 'est' string to be cleaned. - - Returns - ------- - str - The cleaned 'est' string. - - Examples - -------- - >>> clean_est_string("Lower") - lower - >>> clean_est_string("ctrl") - control - - """ - if est_str == "ctrl": - cleaned_str = "control" - else: - cleaned_str = est_str.casefold().strip() - return cleaned_str - - -def standardize_units(series: pd.Series) -> pd.Series: - """ - Complete missing units based on parameter names and replace incorrect units. - - Parameters - ---------- - series : pandas.Series - A series containing two elements: [par, unit] - - Returns - ------- - pandas.Series - Updated series with completed and corrected unit. - - Notes - ----- - The following substitutions are driven by the `pint` documentation available - at https://github.com/hgrecco/pint/blob/master/pint/default_en.txt: - - "pct.": "percent", - - "m2": "meter**2", - - "m3": "meter**3", - - """ - par, unit = series - - # Mapping of parameters to their default units - param_unit_map = { - "energy storage capacity for one unit": "MWh", - "typical temperature difference in storage": "K", - "fixed o&m": "pct./year", - "lifetime in total number of cycles": "cycles", - "cycle life": "cycles", - } - - # Mapping of incorrect units to correct units - unit_corrections = { - "pct./period": "percent", - "⁰C": "C", - "Β°C": "C", - "pct./30sec": "pct.", - "m2": "meter**2", - "m3": "meter**3", - "MWhoutput": "MWh", - "hot/cold,K": "K", - "pct.investement": "percent", - "pct.investment": "percent", - "tank/": "", - "pct.": "percent", - } - - # Complete missing or empty units - if (not isinstance(unit, str)) or (unit.strip() == ""): - unit = param_unit_map.get(par, unit) - - # Replace wrong units - for incorrect, correct in unit_corrections.items(): - if incorrect == unit or incorrect in unit: - unit = unit.replace(incorrect, correct) - - return pd.Series([par, unit]) - - -def filter_parameters(dataframe: pd.DataFrame, filter_flag: bool) -> pd.DataFrame: - """ - Filter rows of a DataFrame by allowed technology parameters. - - Parameters - ---------- - dataframe : pandas.DataFrame - Input DataFrame containing at least a "Technology" column. - filter_flag : Boolean - If true, filter parameter `par` column - - Returns - ------- - pandas.DataFrame - The filtered DataFrame. The returned - DataFrame contains only rows where the `par` column is one of: - "technical lifetime", "fixed o&m", "specific investment", or - "variable o&m". - - """ - allowed_set = { - "technical lifetime", - "fixed o&m", - "specific investment", - "variable o&m", - "charge efficiency", - "discharge efficiency", - "capacity", - } - print("filter_flag", filter_flag) - if filter_flag: - # Filter the DataFrame based on the allowed set - df_filtered = dataframe[dataframe["par"].isin(allowed_set)].reset_index( - drop=True - ) - logger.info( - f"technologies.json contains a subset of the allowed parameters: {allowed_set}." - ) - else: - # Return the original DataFrame if filter_flag is False - df_filtered = dataframe - logger.info("All parameters are outputted to technologies.json") - return df_filtered - - -def build_technology_collection( - dataframe: pd.DataFrame, - sources_path: pathlib.Path, - store_source: bool = False, - output_schema: bool = False, -) -> TechnologyCollection: - """ - Compute a collection of technologies from a grouped DataFrame. - - Processes input DataFrame by grouping technologies and extracting their parameters, - creating Technology instances for each unique group. - - Parameters - ---------- - dataframe : pandas.DataFrame - Input DataFrame containing technology parameters. - Expected columns include: - - 'est': Estimation or case identifier - - 'year': Year of the technology - - 'ws': Workspace or technology identifier - - 'Technology': Detailed technology name - - 'par': Parameter name - - 'val': Parameter value - - 'unit': Parameter units - sources_path: pathlib.Path - Output path for storing the SourceCollection object - store_source: Optional[bool] - Flag to decide whether to store the source object on the Wayback Machine. Default False. - output_schema : Optional[bool] - Flag to decide whether to export the source collection schema. Default False. - - Returns - ------- - TechnologyCollection - A collection of Technology instances, each representing a unique - technology group with its associated parameters. - - Notes - ----- - - The function groups the DataFrame by 'est', 'year', 'ws', and 'Technology' - - For each group, it creates a dictionary of Parameters - - Each Technology is instantiated with group-specific attributes - - """ - list_techs = [] - - if store_source: - source = Source( - title="Technology Data for Energy storage (May 2025)", - authors="Danish Energy Agency", - url="https://ens.dk/media/6589/download", - url_date="2025-10-08 09:24:00", - ) - source.ensure_in_wayback() - sources = SourceCollection(sources=[source]) - sources.to_json(sources_path, output_schema=output_schema) - else: - sources = SourceCollection.from_json(sources_path) - - for (est, year, ws, technology_name), group in dataframe.groupby( - ["est", "year", "ws", "Technology"] - ): - parameters = {} - for _, row in group.iterrows(): - parameters[row["par"]] = Parameter( - magnitude=row["val"], - units=row["unit"], - sources=sources, - provenance="Parsed from Excel file", - ) - list_techs.append( - Technology( - name=ws, - region="EU", - year=year, - parameters=parameters, - case=est, - detailed_technology=technology_name, - ) - ) - return TechnologyCollection(technologies=list_techs) - - -if __name__ == "__main__": - # Parse input arguments - - additional_input_args = [ - ArgumentConfig( - name="--filter_params", - action="store_true", - help="filter_params. Filter the parameters stored to technologies.json. Default: false", - ), - ArgumentConfig( - name="--export_schema", - action="store_true", - help="export_schema. Export the Source/TechnologyCollection schemas. Default: false", - ), - ] - - input_args = CommonsParser.parse_input_arguments( - additional_arguments=additional_input_args, - description="Parse the DEA technology storage dataset", - ) - logger.info("Command line arguments parsed.") - - # Read the raw data - dea_energy_storage_file_path = pathlib.Path( - path_cwd, - "src", - "technologydata", - "parsers", - "raw", - "Technology_datasheet_for_energy_storage.xlsx", - ) - - dea_energy_storage_df = pd.read_excel( - dea_energy_storage_file_path, - sheet_name="alldata_flat", - engine="calamine", - dtype=str, - ) - logger.info("Input file read-in.") - - # Drop unnecessary rows - cleaned_df = drop_invalid_rows(dea_energy_storage_df) - logger.info("Unnecessary rows dropped.") - - # Clean technology (Technology) column - cleaned_df["Technology"] = cleaned_df["Technology"].apply(clean_technology_string) - - # Clean ws column - cleaned_df["ws"] = cleaned_df["ws"].apply(clean_technology_string) - logger.info("`Technology` and `ws` cleaned.") - - # Clean year column - cleaned_df["year"] = cleaned_df["year"].apply(extract_year) - logger.info("`year` column cleaned.") - - # Clean parameter (par) column - cleaned_df["par"] = cleaned_df["par"].apply(clean_parameter_string) - logger.info("`par` column cleaned.") - - # Complete missing units based on parameter names and replace incorrect units. - cleaned_df[["par", "unit"]] = cleaned_df[["par", "unit"]].apply( - standardize_units, axis=1 - ) - logger.info("Missing units added and wrong units replaced.") - - # Include priceyear in unit if applicable - cleaned_df["unit"] = cleaned_df.apply( - lambda row: Commons.update_unit_with_currency_year( - row["unit"], row["priceyear"] - ), - axis=1, - ) - logger.info("`priceyear` included in `unit` column.") - - # Format value (val) column - cleaned_df["val"] = cleaned_df["val"].apply( - lambda x: format_val_number(x, input_args.num_digits) - ) - logger.info("`val` column formatted.") - - # Replace "MEUR_2020" with "EUR_2020" and multiply val by 1_000_000 - mask_meur = cleaned_df["unit"].str.contains("MEUR_2020") - cleaned_df.loc[mask_meur, "unit"] = cleaned_df.loc[mask_meur, "unit"].str.replace( - "MEUR_2020", "EUR_2020" - ) - cleaned_df.loc[mask_meur, "val"] = ( - cleaned_df.loc[mask_meur, "val"] * 1_000_000.0 - ).round(input_args.num_digits) - - # Replace "kEUR_2020" with "EUR_2020" and multiply val by 1_000 - mask_lower_keur = cleaned_df["unit"].str.contains("kEUR_2020") - cleaned_df.loc[mask_lower_keur, "unit"] = cleaned_df.loc[ - mask_lower_keur, "unit" - ].str.replace("kEUR_2020", "EUR_2020") - cleaned_df.loc[mask_lower_keur, "val"] = ( - cleaned_df.loc[mask_lower_keur, "val"] * 1_000.0 - ).round(input_args.num_digits) - - # Replace "KEUR_2020" with "EUR_2020" and multiply val by 1_000 - mask_upper_keur = cleaned_df["unit"].str.contains("KEUR_2020") - cleaned_df.loc[mask_upper_keur, "unit"] = cleaned_df.loc[ - mask_upper_keur, "unit" - ].str.replace("KEUR_2020", "EUR_2020") - cleaned_df.loc[mask_upper_keur, "val"] = ( - cleaned_df.loc[mask_upper_keur, "val"] * 1_000.0 - ).round(input_args.num_digits) - - # Replace "mol/s/m/MPa1/2" with "mol/s/m/Pa" and multiply val by 1_000_000 - mask_mols = cleaned_df["unit"].str.contains("mol/s/m/MPa1/2") - cleaned_df.loc[mask_mols, "unit"] = cleaned_df.loc[mask_mols, "unit"].str.replace( - "mol/s/m/MPa1/2", "mol/s/m/Pa" - ) - cleaned_df.loc[mask_mols, "val"] = cleaned_df.loc[mask_mols, "val"] * 1_000_000.0 - - # Replace, in column `par`, `energy storage capacity for one unit` and `tank volume of example` with `capacity` - mask_capacity = cleaned_df["par"].isin( - [ - "energy storage capacity for one unit", - "tank volume of example", - ] - ) - cleaned_df.loc[mask_capacity, "par"] = "capacity" - - # Clean est column - cleaned_df["est"] = cleaned_df["est"].apply(clean_est_string) - logger.info("`est` column cleaned.") - - # Drop unnecessary columns - columns_to_drop = ["cat", "priceyear", "ref", "note"] - cleaned_df = cleaned_df.drop(columns=columns_to_drop, errors="ignore") - logger.info("Unnecessary columns dropped.") - - filtered_df = filter_parameters(cleaned_df, input_args.filter_params) - - # Build TechnologyCollection - dea_storage_path = pathlib.Path( - path_cwd, - "src", - "technologydata", - "parsers", - "dea_energy_storage", - ) - output_technologies_path = pathlib.Path( - dea_storage_path, - "v10/technologies.json", - ) - output_sources_path = pathlib.Path( - dea_storage_path, - "v10/sources.json", - ) - - tech_col = build_technology_collection( - filtered_df, - output_sources_path, - store_source=input_args.store_source, - output_schema=input_args.export_schema, - ) - logger.info("TechnologyCollection object instantiated.") - tech_col.to_json(output_technologies_path, output_schema=input_args.export_schema) - logger.info("TechnologyCollection object exported to json.") - - if input_args.export_schema: - # Move schema files if they exist - schema_folder = pathlib.Path( - path_cwd, "src", "technologydata", "parsers", "schemas" - ) - sources_schema = pathlib.Path(dea_storage_path, "sources.schema.json") - technologies_schema = pathlib.Path(dea_storage_path, "technologies.schema.json") - - schema_folder.mkdir(parents=True, exist_ok=True) - - if sources_schema.exists(): - sources_schema.rename(schema_folder / "sources.schema.json") - logger.info(f"Moved {sources_schema} to {schema_folder}") - if technologies_schema.exists(): - technologies_schema.rename(schema_folder / "technologies.schema.json") - logger.info(f"Moved {technologies_schema} to {schema_folder}") diff --git a/src/technologydata/parsers/dea_energy_storage/parser_v10.py b/src/technologydata/parsers/dea_energy_storage/parser_v10.py new file mode 100644 index 00000000..85122342 --- /dev/null +++ b/src/technologydata/parsers/dea_energy_storage/parser_v10.py @@ -0,0 +1,668 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + + +"""Parser for version 10 of the DEA Energy Storage dataset.""" + +import logging +import pathlib +import re +from typing import Any + +import pandas as pd +import pydantic + +from technologydata import ( + Commons, + Parameter, + Source, + SourceCollection, + Technology, + TechnologyCollection, +) +from technologydata.parsers.data_parser_base import ParserBase + +path_cwd = pathlib.Path.cwd() + +logger = logging.getLogger(__name__) + + +class DeaEnergyStorageV10Parser(ParserBase): + """Parser for v10 of the DEA Energy Storage dataset.""" + + @staticmethod + def _drop_invalid_rows(dataframe: pd.DataFrame) -> pd.DataFrame: + """ + Clean and filter a DataFrame by removing rows with invalid or incomplete data. + + This function performs multiple validation checks to ensure data quality: + - Removes rows with None or NaN values in critical columns + - Removes rows with empty or whitespace-only strings + - Filters rows based on specific data integrity criteria + - Discards rows where 'val' column contains comparator symbols or non-numeric values + + Parameters + ---------- + dataframe : pd.DataFrame + The input DataFrame to be cleaned and validated. + + Returns + ------- + pd.DataFrame + A new DataFrame with invalid rows removed, maintaining data integrity. + + Notes + ----- + Validation criteria include: + - Non-empty 'Technology', 'par', and 'val' columns + - 'year' column containing a valid 4-digit year + - 'val' column containing only numeric values (no comparator symbols) + + """ + # Create a copy to avoid modifying the original DataFrame + df_cleaned = dataframe.copy() + + # Validate column existence + required_columns = ["Technology", "par", "val", "year"] + missing_columns = [ + col for col in required_columns if col not in df_cleaned.columns + ] + if missing_columns: + raise ValueError(f"Missing required columns: {missing_columns}") + + # Remove rows with None or NaN values in critical columns + df_cleaned = df_cleaned.dropna(subset=required_columns) + + # Remove rows with empty or whitespace-only strings + for column in required_columns: + df_cleaned = df_cleaned[df_cleaned[column].astype(str).str.strip() != ""] + + # Filter rows with valid year (4 consecutive digits) + df_cleaned = df_cleaned[ + df_cleaned["year"].astype(str).str.contains(r"\d{4}", regex=True) + ] + + # Remove rows with comparator symbols or without digits in 'val' column + df_cleaned = df_cleaned[ + (~df_cleaned["val"].astype(str).str.contains(r"[<>≀β‰₯]", regex=True)) + & (df_cleaned["val"].astype(str).str.contains(r"\d", regex=True)) + ] + + return df_cleaned + + @staticmethod + @pydantic.validate_call + def _clean_parameter_string(text_string: str) -> str: + """ + Remove any string between [] or [), any leading hyphen or double quotes from the input string. Lower-case all. + + Parameters + ---------- + text_string : str + input string to be cleaned. + + Returns + ------- + str + cleaned string with [] and [) and leading hyphen or double quotes removed. + + Examples + -------- + >>> DeaEnergyStorageV10Parser._clean_parameter_string("- Charge efficiency [%]") + charge efficiency + >>> DeaEnergyStorageV10Parser._clean_parameter_string("Energy storage capacity for one unit [MWh)") + energy storage capacity for one unit + + """ + # Remove leading hyphen + text_string = text_string.lstrip("-") + + # Remove content inside square brackets including the brackets themselves + result = re.sub(r"\[.*?\]", "", text_string) + + # Remove content inside square bracket and parenthesis including the brackets/parenthesis themselves + result = re.sub(r"\[.*?\)", "", result) + + # Remove extra spaces resulting from the removal and set all to lower case + result = re.sub(r"\s+", " ", result).strip().casefold() + + return result + + @staticmethod + @pydantic.validate_call + def _clean_technology_string(tech_str: str) -> str: + """ + Clean a technology string by removing numeric patterns and standardizing case. + + This function pre-processes technology-related strings by: + - Removing three-digit numeric patterns (with optional letter) + - Stripping leading and trailing whitespace + - Converting to lowercase for case-insensitive comparison + + Parameters + ---------- + tech_str : str + Input technology string to be cleaned. + + Returns + ------- + str + Cleaned technology string with: + - Numeric patterns (like '123' or '456a') removed + - Whitespace stripped + - Converted to lowercase + + Raises + ------ + Exception + If string conversion or processing fails, logs the error and returns the original input. + + Examples + -------- + >>> DeaEnergyStorageV10Parser._clean_technology_string("143a Rock-based Carnot battery") + rock-based carnot battery + >>> DeaEnergyStorageV10Parser._clean_technology_string("Pit Thermal Energy Storage [PTES]") + pit thermal energy storage [ptes] + + """ + try: + # Remove three-digit patterns or three digits followed by a letter + return re.sub(r"^(\d{3}[a-zA-Z]?)", "", tech_str.strip()).strip().casefold() + except Exception as e: + logger.error(f"Error cleaning technology '{tech_str}': {e}") + return tech_str + + @staticmethod + @pydantic.validate_call + def _format_val_number(input_value: str, num_decimals: int) -> float | None | Any: + """ + Parse various number formats into a float value. + + Parameters + ---------- + input_value : str + The input number in different formats, such as: + - Scientific notation with "x10^": e.g., "2.84x10^23" + - Numbers with commas as decimal separators: e.g., "1,1" + num_decimals : int + Number of decimals + + Returns + ------- + float + The parsed numerical value as a float. + + Raises + ------ + ValueError + If the input cannot be parsed into a float. + + Examples + -------- + >>> DeaEnergyStorageV10Parser._format_val_number("1,1") + 1.1 + >>> DeaEnergyStorageV10Parser._format_val_number("2.84Γ—10-27") + 2.84e-27 + + """ + s = str(input_value).strip() + + # Handle scientific notation like "2.84x10^23" + match = re.match(r"([+-]?\d*\.?\d+)Γ—10([+-]?\d+)", s) + if match: + base, exponent = match.groups() + return round(float(base), num_decimals) * (10 ** int(exponent)) + + # Replace comma with dot for decimal numbers + s = s.replace(",", ".") + try: + return round(float(s), num_decimals) + except ValueError: + raise ValueError(f"Cannot parse number from input: {input_value}") + + @staticmethod + @pydantic.validate_call + def _extract_year(year_str: str) -> int | None: + """ + Extract the first year (integer) from a given input. + + Parameters + ---------- + year_str : str + Input value containing a potential year. + + Returns + ------- + int, None + Extracted first year. + + Examples + -------- + >>> DeaEnergyStorageV10Parser._extract_year('uncertainty (2050)') + 2050 + + """ + # Extract digits + digits = re.findall(r"\d+", year_str) + + # Convert to integer + return int(digits[0]) if digits else None + + @staticmethod + @pydantic.validate_call + def _clean_est_string(est_str: str) -> str: + """ + Casefold the 'est' string, trim whitespace and replace `ctrl` with `control`. + + Parameters + ---------- + est_str : str + The input 'est' string to be cleaned. + + Returns + ------- + str + The cleaned 'est' string. + + Examples + -------- + >>> DeaEnergyStorageV10Parser._clean_est_string("Lower") + lower + >>> DeaEnergyStorageV10Parser._clean_est_string("ctrl") + control + + """ + if est_str == "ctrl": + cleaned_str = "control" + else: + cleaned_str = est_str.casefold().strip() + return cleaned_str + + @staticmethod + def _standardize_units(series: pd.Series) -> pd.Series: + """ + Complete missing units based on parameter names and replace incorrect units. + + Parameters + ---------- + series : pandas.Series + A series containing two elements: [par, unit] + + Returns + ------- + pandas.Series + Updated series with completed and corrected unit. + + Notes + ----- + The following substitutions are driven by the `pint` documentation available + at https://github.com/hgrecco/pint/blob/master/pint/default_en.txt: + - "pct.": "percent", + - "m2": "meter**2", + - "m3": "meter**3", + + """ + par, unit = series + + # Mapping of parameters to their default units + param_unit_map = { + "energy storage capacity for one unit": "MWh", + "typical temperature difference in storage": "K", + "fixed o&m": "pct./year", + "lifetime in total number of cycles": "cycles", + "cycle life": "cycles", + } + + # Mapping of incorrect units to correct units + unit_corrections = { + "pct./period": "percent", + "⁰C": "C", + "Β°C": "C", + "pct./30sec": "pct.", + "m2": "meter**2", + "m3": "meter**3", + "MWhoutput": "MWh", + "hot/cold,K": "K", + "pct.investement": "percent", + "pct.investment": "percent", + "tank/": "", + "pct.": "percent", + } + + # Complete missing or empty units + if (not isinstance(unit, str)) or (unit.strip() == ""): + unit = param_unit_map.get(par, unit) + + # Replace wrong units + for incorrect, correct in unit_corrections.items(): + if incorrect == unit or incorrect in unit: + unit = unit.replace(incorrect, correct) + + return pd.Series([par, unit]) + + @staticmethod + def _filter_parameters(dataframe: pd.DataFrame, filter_flag: bool) -> pd.DataFrame: + """ + Filter rows of a DataFrame by allowed technology parameters. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing at least a "Technology" column. + filter_flag : Boolean + If true, filter parameter `par` column + + Returns + ------- + pandas.DataFrame + The filtered DataFrame. The returned + DataFrame contains only rows where the `par` column is one of: + "technical lifetime", "fixed o&m", "specific investment", or + "variable o&m". + + """ + allowed_set = { + "technical lifetime", + "fixed o&m", + "specific investment", + "variable o&m", + "charge efficiency", + "discharge efficiency", + "capacity", + } + if filter_flag: + # Filter the DataFrame based on the allowed set + df_filtered = dataframe[dataframe["par"].isin(allowed_set)].reset_index( + drop=True + ) + logger.info( + f"technologies.json contains a subset of the allowed parameters: {allowed_set}." + ) + else: + # Return the original DataFrame if filter_flag is False + df_filtered = dataframe + logger.info("All parameters are outputted to technologies.json") + return df_filtered + + @staticmethod + def _build_technology_collection( + dataframe: pd.DataFrame, + sources_path: pathlib.Path, + archive_source: bool = False, + output_schema: bool = False, + ) -> TechnologyCollection: + """ + Compute a collection of technologies from a grouped DataFrame. + + Processes input DataFrame by grouping technologies and extracting their parameters, + creating Technology instances for each unique group. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing technology parameters. + Expected columns include: + - 'est': Estimation or case identifier + - 'year': Year of the technology + - 'ws': Workspace or technology identifier + - 'Technology': Detailed technology name + - 'par': Parameter name + - 'val': Parameter value + - 'unit': Parameter units + sources_path: pathlib.Path + Output path for storing the SourceCollection object + archive_source: Optional[bool] + Flag to decide whether to archive the source object on the Wayback Machine. Default False. + output_schema : Optional[bool] + Flag to decide whether to export the source collection schema. Default False. + + Returns + ------- + TechnologyCollection + A collection of Technology instances, each representing a unique + technology group with its associated parameters. + + Notes + ----- + - The function groups the DataFrame by 'est', 'year', 'ws', and 'Technology' + - For each group, it creates a dictionary of Parameters + - Each Technology is instantiated with group-specific attributes + + """ + list_techs = [] + + if archive_source: + source = Source( + title="Technology Data for Energy storage (May 2025)", + authors="Danish Energy Agency", + url="https://ens.dk/media/6589/download", + url_date="2025-10-08 09:24:00", + ) + source.ensure_in_wayback() + sources = SourceCollection(sources=[source]) + sources.to_json(sources_path, output_schema=output_schema) + else: + sources = SourceCollection.from_json(sources_path) + + for (est, year, ws, technology_name), group in dataframe.groupby( + ["est", "year", "ws", "Technology"] + ): + parameters = {} + for _, row in group.iterrows(): + parameters[row["par"]] = Parameter( + magnitude=row["val"], + units=row["unit"], + sources=sources, + provenance="Parsed from Excel file", + ) + list_techs.append( + Technology( + name=ws, + region="EU", + year=year, + parameters=parameters, + case=est, + detailed_technology=technology_name, + ) + ) + return TechnologyCollection(technologies=list_techs) + + def parse( + self, + input_path: pathlib.Path, + num_digits: int, + archive_source: bool, + **kwargs: Any, + ) -> None: + """ + Parse and process version 10 of the DEA Energy Storage dataset. + + This method reads the raw data from an Excel file, cleans and transforms + it through a series of steps, and then builds a TechnologyCollection. + The processed data is saved to JSON files. + + Parameters + ---------- + input_path : pathlib.Path + Path to the raw input data file (Excel). + num_digits : int + Number of significant digits to round numerical values. + archive_source : bool + If True, archives the source object on the Wayback Machine. + **kwargs : bool + filter_params : bool + If True, filters the parameters to a predefined allowed set. + export_schema : bool + If True, exports the Pydantic schema for the data models. + + Returns + ------- + TechnologyCollection + A collection of parsed technology data. + + """ + filter_params = kwargs.get("filter_params", False) + export_schema = kwargs.get("export_schema", False) + + dea_energy_storage_df = pd.read_excel( + input_path, + sheet_name="alldata_flat", + engine="calamine", + dtype=str, + ) + logger.info("Input file read-in.") + + # Drop unnecessary rows + cleaned_df = DeaEnergyStorageV10Parser._drop_invalid_rows(dea_energy_storage_df) + logger.info("Unnecessary rows dropped.") + + # Clean technology (Technology) column + cleaned_df["Technology"] = cleaned_df["Technology"].apply( + DeaEnergyStorageV10Parser._clean_technology_string + ) + + # Clean ws column + cleaned_df["ws"] = cleaned_df["ws"].apply( + DeaEnergyStorageV10Parser._clean_technology_string + ) + logger.info("`Technology` and `ws` cleaned.") + + # Clean year column + cleaned_df["year"] = cleaned_df["year"].apply( + DeaEnergyStorageV10Parser._extract_year + ) + logger.info("`year` column cleaned.") + + # Clean parameter (par) column + cleaned_df["par"] = cleaned_df["par"].apply( + DeaEnergyStorageV10Parser._clean_parameter_string + ) + logger.info("`par` column cleaned.") + + # Complete missing units based on parameter names and replace incorrect units. + cleaned_df[["par", "unit"]] = cleaned_df[["par", "unit"]].apply( + DeaEnergyStorageV10Parser._standardize_units, axis=1 + ) + logger.info("Missing units added and wrong units replaced.") + + # Include priceyear in unit if applicable + cleaned_df["unit"] = cleaned_df.apply( + lambda row: Commons.update_unit_with_currency_year( + row["unit"], row["priceyear"] + ), + axis=1, + ) + logger.info("`priceyear` included in `unit` column.") + + # Format value (val) column + cleaned_df["val"] = cleaned_df["val"].apply( + lambda x: DeaEnergyStorageV10Parser._format_val_number(x, num_digits) + ) + logger.info("`val` column formatted.") + + # Replace "MEUR_2020" with "EUR_2020" and multiply val by 1_000_000 + mask_meur = cleaned_df["unit"].str.contains("MEUR_2020") + cleaned_df.loc[mask_meur, "unit"] = cleaned_df.loc[ + mask_meur, "unit" + ].str.replace("MEUR_2020", "EUR_2020") + cleaned_df.loc[mask_meur, "val"] = ( + cleaned_df.loc[mask_meur, "val"] * 1_000_000.0 + ).round(num_digits) + + # Replace "kEUR_2020" with "EUR_2020" and multiply val by 1_000 + mask_lower_keur = cleaned_df["unit"].str.contains("kEUR_2020") + cleaned_df.loc[mask_lower_keur, "unit"] = cleaned_df.loc[ + mask_lower_keur, "unit" + ].str.replace("kEUR_2020", "EUR_2020") + cleaned_df.loc[mask_lower_keur, "val"] = ( + cleaned_df.loc[mask_lower_keur, "val"] * 1_000.0 + ).round(num_digits) + + # Replace "KEUR_2020" with "EUR_2020" and multiply val by 1_000 + mask_upper_keur = cleaned_df["unit"].str.contains("KEUR_2020") + cleaned_df.loc[mask_upper_keur, "unit"] = cleaned_df.loc[ + mask_upper_keur, "unit" + ].str.replace("KEUR_2020", "EUR_2020") + cleaned_df.loc[mask_upper_keur, "val"] = ( + cleaned_df.loc[mask_upper_keur, "val"] * 1_000.0 + ).round(num_digits) + + # Replace "mol/s/m/MPa1/2" with "mol/s/m/Pa" and multiply val by 1_000_000 + mask_mols = cleaned_df["unit"].str.contains("mol/s/m/MPa1/2") + cleaned_df.loc[mask_mols, "unit"] = cleaned_df.loc[ + mask_mols, "unit" + ].str.replace("mol/s/m/MPa1/2", "mol/s/m/Pa") + cleaned_df.loc[mask_mols, "val"] = ( + cleaned_df.loc[mask_mols, "val"] * 1_000_000.0 + ) + + # Replace, in column `par`, `energy storage capacity for one unit` and `tank volume of example` with `capacity` + mask_capacity = cleaned_df["par"].isin( + [ + "energy storage capacity for one unit", + "tank volume of example", + ] + ) + cleaned_df.loc[mask_capacity, "par"] = "capacity" + + # Clean est column + cleaned_df["est"] = cleaned_df["est"].apply( + DeaEnergyStorageV10Parser._clean_est_string + ) + logger.info("`est` column cleaned.") + + # Drop unnecessary columns + columns_to_drop = ["cat", "priceyear", "ref", "note"] + cleaned_df = cleaned_df.drop(columns=columns_to_drop, errors="ignore") + logger.info("Unnecessary columns dropped.") + + filtered_df = DeaEnergyStorageV10Parser._filter_parameters( + cleaned_df, filter_params + ) + + # Build TechnologyCollection + dea_storage_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "parsers", + "dea_energy_storage", + ) + output_technologies_path = pathlib.Path( + dea_storage_path, + "v10/technologies.json", + ) + output_sources_path = pathlib.Path( + dea_storage_path, + "v10/sources.json", + ) + + tech_col = DeaEnergyStorageV10Parser._build_technology_collection( + filtered_df, + output_sources_path, + archive_source=archive_source, + output_schema=export_schema, + ) + logger.info("TechnologyCollection object instantiated.") + tech_col.to_json(output_technologies_path, output_schema=export_schema) + logger.info("TechnologyCollection object exported to json.") + + if export_schema: + # Move schema files if they exist + schema_folder = pathlib.Path( + path_cwd, "src", "technologydata", "parsers", "schemas" + ) + sources_schema = pathlib.Path(dea_storage_path, "sources.schema.json") + technologies_schema = pathlib.Path( + dea_storage_path, "technologies.schema.json" + ) + + schema_folder.mkdir(parents=True, exist_ok=True) + + if sources_schema.exists(): + sources_schema.rename(schema_folder / "sources.schema.json") + logger.info(f"Moved {sources_schema} to {schema_folder}") + if technologies_schema.exists(): + technologies_schema.rename(schema_folder / "technologies.schema.json") + logger.info(f"Moved {technologies_schema} to {schema_folder}") diff --git a/src/technologydata/parsers/manual_input_usa/__init__.py b/src/technologydata/parsers/manual_input_usa/__init__.py index c0cd27e1..711c21f5 100644 --- a/src/technologydata/parsers/manual_input_usa/__init__.py +++ b/src/technologydata/parsers/manual_input_usa/__init__.py @@ -2,4 +2,91 @@ # # SPDX-License-Identifier: MIT -"""Provide a parser for manually inputted data for the USA.""" +"""Provide a parser for the technology-data manual_input_usa.csv dataset.""" + +import logging +import pathlib + +from technologydata.parsers.data_parser_base import ParserBase +from technologydata.parsers.manual_input_usa.parser_v0134 import ( + ManualInputUSAV0134Parser, +) + + +class ManualInputUsaParser: + """ + Main parser for the technology_data manual_input_usa.csv dataset. + + Dispatches to version-specific parser implementations. + """ + + def __init__(self) -> None: + """Initialize the parser and maps versions to parser classes.""" + self._parsers: dict[str, type[ParserBase]] = { + "v0.13.4": ManualInputUSAV0134Parser, + # "v0.13.5": ManualInputUSAV0135Parser, # Add new versions here + } + + def get_supported_versions(self) -> list[str]: + """Return a list of supported dataset versions.""" + return list(self._parsers.keys()) + + def parse( + self, + version: str, + input_path: pathlib.Path, + num_digits: int, + archive_source: bool, + filter_params: bool, + export_schema: bool, + ) -> None: + """ + Parse the specified version of the technology_data manual_input_usa.csv dataset. + + This method selects the appropriate parser for the given version and + delegates the parsing task to it. + + Parameters + ---------- + version : str + The version of the dataset to parse (e.g., 'v0.13.4'). + input_path : pathlib.Path + Path to the raw input data file. + num_digits : int, optional + Number of significant digits to round the values, by default 4. + archive_source : bool, optional + If True, archives the source object on the Wayback Machine, by default False. + filter_params : bool, optional + If True, filters the parameters stored in the output, by default False. + export_schema : bool, optional + If True, exports the Pydantic schema for the data models, by default False. + + Raises + ------ + ValueError + If the specified version is not supported. + + """ + if version not in self._parsers: + raise ValueError( + f"Unsupported version: {version}. " + f"Supported versions are: {', '.join(self.get_supported_versions())}" + ) + + parser_class = self._parsers[version] + parser_instance = parser_class() + + logging.info( + f"Parsing the technology-data manual_input_usa.csv. dataset version {version} using {parser_class.__name__}" + ) + return parser_instance.parse( + input_path=input_path, + num_digits=num_digits, + archive_source=archive_source, + filter_params=filter_params, + export_schema=export_schema, + ) + + +# Make the main parser class available for import from the module +__all__ = ["ManualInputUsaParser", "ManualInputUSAV0134Parser"] diff --git a/src/technologydata/parsers/manual_input_usa/manual_input_usa.py b/src/technologydata/parsers/manual_input_usa/manual_input_usa.py deleted file mode 100644 index 1212c95f..00000000 --- a/src/technologydata/parsers/manual_input_usa/manual_input_usa.py +++ /dev/null @@ -1,256 +0,0 @@ -# SPDX-FileCopyrightText: technologydata contributors -# -# SPDX-License-Identifier: MIT - -""" -Data parser for manually specified, USA-specific data from the technology-data repository (`manual_input_usa.csv`). - -How to run: - From the repository root, execute: - python src/technologydata/parsers/manual_input_usa/manual_input_usa.py - -This will regenerate the files `src/technologydata/parsers/manual_input_usa/{sources.json|technologies.json}` with the specified options. -Use the default options to reproduce the file provided with the package. - -Configuration options (command-line arguments): - --num_digits Number of significant digits to round the values. Default: 4 - --store_source Store the source object on the Wayback Machine. Default: False - -Example: - python src/technologydata/parsers/manual_input_usa/manual_input_usa.py --num_digits 3 --store_source - -""" - -import logging -import pathlib - -import pandas - -from technologydata import ( - Commons, - Parameter, - Source, - SourceCollection, - Technology, - TechnologyCollection, -) -from technologydata.parsers.commons import CommonsParser - -path_cwd = pathlib.Path.cwd() - -logger = logging.getLogger(__name__) - - -def extract_units_carriers_heating_value( - input_unit: str, -) -> tuple[str, str | None, str | None]: - """ - Extract standardized units and carriers from an input unit string. Add also heating_value. - - This function maps complex unit representations to simplified unit and carrier - combinations using a predefined dictionary of special patterns. - - Parameters - ---------- - input_unit : str - A specialized unit string to be converted. - - Returns - ------- - tuple[str, str | None, str | None] - A tuple containing two elements: - - The first element is the standardized unit - - The second element is the corresponding carrier (or None if not found) - - The third element is the corresponding heating value (or None if not found) - - """ - # Define conversion dictionary - special_patterns = { - "USD_2022/MW_FT": ("USD_2022/MW", "1/FT", "1/LHV"), - "MWh_H2/MWh_FT": ("MWh/MWh", "H2/FT", "LHV"), - "MWh_el/MWh_FT": ("MWh/MWh", "el/FT", "LHV"), - "t_CO2/MWh_FT": ("t/MWh", "CO2/FT", "LHV"), - "USD_2022/kWh_H2": ("USD_2022/kWh", "1/H2", "LHV"), - "MWh_el/MWh_H2": ("MWh/MWh", "el/H2", "LHV"), - "USD_2023/t_CO2/h": ("USD_2023/t/h", "1/CO2", None), - "MWh_el/t_CO2": ("MWh/t", "el/CO2", "LHV"), - "MWh_th/t_CO2": ("MWh/t", "thermal/CO2", "LHV"), - } - - if isinstance(input_unit, str) and input_unit in special_patterns.keys(): - return special_patterns[input_unit] - else: - return input_unit, None, None - - -def build_technology_collection( - dataframe: pandas.DataFrame, - sources_path: pathlib.Path, - store_source: bool = False, -) -> TechnologyCollection: - """ - Compute a collection of technologies from a grouped DataFrame. - - Processes input DataFrame by grouping technologies and extracting their parameters, - creating Technology instances for each unique group. - - Parameters - ---------- - dataframe : pandas.DataFrame - Input DataFrame containing technology parameters. - Expected columns include: - - 'scenario': Estimation or case identifier - - 'year': Year of the technology - - 'technology': Detailed technology name - - 'parameter': Parameter name - - 'value': Parameter value - - 'unit': Parameter units - - 'further_description': Extra information about the technology - - 'financial_case': Technology financial case - sources_path: pathlib.Path - Output path for storing the SourceCollection object - store_source: Optional[bool] - Flag to decide whether to store the source object on the Wayback Machine. Default False. - - Returns - ------- - TechnologyCollection - A collection of Technology instances, each representing a unique - technology group with its associated parameters. - - Notes - ----- - - The function groups the DataFrame by ["scenario", "year", "technology"] - - For each group, it creates a dictionary of Parameters - - Each Technology is instantiated with group-specific attributes - - """ - list_techs = [] - - if store_source: - source = Source( - title="Energy system technology data for the US", - authors="Contributors to technology-data. Data source: manual_input_usa.csv", - url="https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", - ) - source.ensure_in_wayback() - sources = SourceCollection(sources=[source]) - sources.to_json(sources_path) - else: - sources = SourceCollection.from_json(sources_path) - - for (scenario, year, technology), group in dataframe.groupby( - ["scenario", "year", "technology"] - ): - parameters = {} - financial_case_for_tech = None - for _, row in group.iterrows(): - unit, carrier, heating_value = extract_units_carriers_heating_value( - row["unit"] - ) - param_kwargs = { - "magnitude": row["value"], - "sources": sources, - } - if carrier is not None: - param_kwargs["carrier"] = carrier - if heating_value is not None: - param_kwargs["heating_value"] = heating_value - if unit is not None: - param_kwargs["units"] = unit - if row["further_description"] is not None and isinstance( - row["further_description"], str - ): - param_kwargs["note"] = row["further_description"] - if row["financial_case"] is not None and isinstance( - row["financial_case"], str - ): - financial_case_for_tech = str(row["financial_case"]) - parameters[row["parameter"]] = Parameter(**param_kwargs) - - # Combine scenario and financial_case for the case attribute - case_value = str(scenario) - if financial_case_for_tech is not None: - case_value = f"{scenario} - {financial_case_for_tech}" - - list_techs.append( - Technology( - name=technology, - region="USA", - year=year, - parameters=parameters, - case=case_value, - detailed_technology=technology, - ) - ) - - return TechnologyCollection(technologies=list_techs) - - -if __name__ == "__main__": - # Parse input arguments - input_args = CommonsParser.parse_input_arguments( - description="Parse the technology_data manual_input_usa.csv dataset" - ) - logger.info("Command line arguments parsed.") - - manual_input_usa_input_path = pathlib.Path( - path_cwd, - "src", - "technologydata", - "parsers", - "raw", - "manual_input_usa.csv", - ) - - manual_input_usa_df = pandas.read_csv( - manual_input_usa_input_path, dtype=str, na_values="None" - ) - manual_input_usa_df["value"] = manual_input_usa_df["value"].astype(float) - manual_input_usa_df["scenario"] = manual_input_usa_df["scenario"].fillna( - "not_available" - ) - - # Replace "per unit" with "%" and multiply val by 100 - mask_per_unit = manual_input_usa_df["unit"].str.contains("per unit") - manual_input_usa_df.loc[mask_per_unit, "unit"] = manual_input_usa_df.loc[ - mask_per_unit, "unit" - ].str.replace("per unit", "%") - manual_input_usa_df.loc[mask_per_unit, "value"] = ( - manual_input_usa_df.loc[mask_per_unit, "value"] * 100.0 - ).round(input_args.num_digits) - logger.info("`per unit` replaced by `%`. Corresponding value multiplied by 100.") - - # Include currency_year in unit if applicable - manual_input_usa_df["unit"] = manual_input_usa_df.apply( - lambda row: Commons.update_unit_with_currency_year( - row["unit"], row["currency_year"] - ), - axis=1, - ) - logger.info("`currency_year` included in `unit` column.") - - # Build TechnologyCollection - manual_input_usa_base_path = pathlib.Path( - path_cwd, - "src", - "technologydata", - "parsers", - "manual_input_usa", - ) - output_technologies_path = pathlib.Path( - manual_input_usa_base_path, - "v0.13.4/technologies.json", - ) - output_sources_path = pathlib.Path( - manual_input_usa_base_path, - "v0.13.4/sources.json", - ) - - tech_col = build_technology_collection( - manual_input_usa_df, output_sources_path, store_source=input_args.store_source - ) - - logger.info("TechnologyCollection object instantiated.") - tech_col.to_json(output_technologies_path) - logger.info("TechnologyCollection object exported to json.") diff --git a/src/technologydata/parsers/manual_input_usa/parser_v0134.py b/src/technologydata/parsers/manual_input_usa/parser_v0134.py new file mode 100644 index 00000000..fc88985d --- /dev/null +++ b/src/technologydata/parsers/manual_input_usa/parser_v0134.py @@ -0,0 +1,273 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Parser for version 0.13.4 of the manual_input_usa.csv dataset.""" + +import logging +import pathlib +from typing import Any + +import pandas + +from technologydata import ( + Commons, + Parameter, + Source, + SourceCollection, + Technology, + TechnologyCollection, +) +from technologydata.parsers.data_parser_base import ParserBase + +path_cwd = pathlib.Path.cwd() + +logger = logging.getLogger(__name__) + + +class ManualInputUSAV0134Parser(ParserBase): + """Parser for v0.13.4 of the manual_input_usa.csv dataset.""" + + @staticmethod + def _extract_units_carriers_heating_value( + input_unit: str, + ) -> tuple[str, str | None, str | None]: + """ + Extract standardized units and carriers from an input unit string. Add also heating_value. + + This function maps complex unit representations to simplified unit and carrier + combinations using a predefined dictionary of special patterns. + + Parameters + ---------- + input_unit : str + A specialized unit string to be converted. + + Returns + ------- + tuple[str, str | None, str | None] + A tuple containing two elements: + - The first element is the standardized unit + - The second element is the corresponding carrier (or None if not found) + - The third element is the corresponding heating value (or None if not found) + + """ + # Define conversion dictionary + special_patterns = { + "USD_2022/MW_FT": ("USD_2022/MW", "1/FT", "1/LHV"), + "MWh_H2/MWh_FT": ("MWh/MWh", "H2/FT", "LHV"), + "MWh_el/MWh_FT": ("MWh/MWh", "el/FT", "LHV"), + "t_CO2/MWh_FT": ("t/MWh", "CO2/FT", "LHV"), + "USD_2022/kWh_H2": ("USD_2022/kWh", "1/H2", "LHV"), + "MWh_el/MWh_H2": ("MWh/MWh", "el/H2", "LHV"), + "USD_2023/t_CO2/h": ("USD_2023/t/h", "1/CO2", None), + "MWh_el/t_CO2": ("MWh/t", "el/CO2", "LHV"), + "MWh_th/t_CO2": ("MWh/t", "thermal/CO2", "LHV"), + } + + if isinstance(input_unit, str) and input_unit in special_patterns.keys(): + return special_patterns[input_unit] + else: + return input_unit, None, None + + @staticmethod + def _build_technology_collection( + dataframe: pandas.DataFrame, + sources_path: pathlib.Path, + archive_source: bool = False, + output_schema: bool = False, + ) -> TechnologyCollection: + """ + Compute a collection of technologies from a grouped DataFrame. + + Processes input DataFrame by grouping technologies and extracting their parameters, + creating Technology instances for each unique group. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing technology parameters. + Expected columns include: + - 'scenario': Estimation or case identifier + - 'year': Year of the technology + - 'technology': Detailed technology name + - 'parameter': Parameter name + - 'value': Parameter value + - 'unit': Parameter units + - 'further_description': Extra information about the technology + - 'financial_case': Technology financial case + sources_path: pathlib.Path + Output path for storing the SourceCollection object + archive_source: Optional[bool] + Flag to decide whether to archive the source object on the Wayback Machine. Default False. + output_schema : Optional[bool] + Flag to decide whether to export the source collection schema. Default False. + + Returns + ------- + TechnologyCollection + A collection of Technology instances, each representing a unique + technology group with its associated parameters. + + Notes + ----- + - The function groups the DataFrame by ["scenario", "year", "technology"] + - For each group, it creates a dictionary of Parameters + - Each Technology is instantiated with group-specific attributes + + """ + list_techs = [] + + if archive_source: + source = Source( + title="Energy system technology data for the US", + authors="Contributors to technology-data. Data source: manual_input_usa.csv", + url="https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + ) + source.ensure_in_wayback() + sources = SourceCollection(sources=[source]) + sources.to_json(sources_path, output_schema=output_schema) + else: + sources = SourceCollection.from_json(sources_path) + + for (scenario, year, technology), group in dataframe.groupby( + ["scenario", "year", "technology"] + ): + parameters = {} + financial_case_for_tech = None + for _, row in group.iterrows(): + unit, carrier, heating_value = ( + ManualInputUSAV0134Parser._extract_units_carriers_heating_value( + row["unit"] + ) + ) + param_kwargs = { + "magnitude": row["value"], + "sources": sources, + } + if carrier is not None: + param_kwargs["carrier"] = carrier + if heating_value is not None: + param_kwargs["heating_value"] = heating_value + if unit is not None: + param_kwargs["units"] = unit + if row["further_description"] is not None and isinstance( + row["further_description"], str + ): + param_kwargs["note"] = row["further_description"] + if row["financial_case"] is not None and isinstance( + row["financial_case"], str + ): + financial_case_for_tech = str(row["financial_case"]) + parameters[row["parameter"]] = Parameter(**param_kwargs) + + # Combine scenario and financial_case for the case attribute + case_value = str(scenario) + if financial_case_for_tech is not None: + case_value = f"{scenario} - {financial_case_for_tech}" + + list_techs.append( + Technology( + name=technology, + region="USA", + year=year, + parameters=parameters, + case=case_value, + detailed_technology=technology, + ) + ) + + return TechnologyCollection(technologies=list_techs) + + def parse( + self, + input_path: pathlib.Path, + num_digits: int, + archive_source: bool, + **kwargs: Any, + ) -> None: + """ + Parse and process version 0.13.4 of the manual_input_usa.csv dataset. + + This method reads the raw data from an Excel file, cleans and transforms + it through a series of steps, and then builds a TechnologyCollection. + The processed data is saved to JSON files. + + Parameters + ---------- + input_path : pathlib.Path + Path to the raw input data file (Excel). + num_digits : int + Number of significant digits to round numerical values. + archive_source : bool + If True, archives the source object on the Wayback Machine. + **kwargs : bool + export_schema : bool + If True, exports the Pydantic schema for the data models. + + Returns + ------- + TechnologyCollection + A collection of parsed technology data. + + """ + export_schema = kwargs.get("export_schema", False) + + manual_input_usa_input_path = pathlib.Path(input_path) + + manual_input_usa_df = pandas.read_csv( + manual_input_usa_input_path, dtype=str, na_values="None" + ) + manual_input_usa_df["value"] = manual_input_usa_df["value"].astype(float) + manual_input_usa_df["scenario"] = manual_input_usa_df["scenario"].fillna( + "not_available" + ) + + # Replace "per unit" with "%" and multiply val by 100 + mask_per_unit = manual_input_usa_df["unit"].str.contains("per unit") + manual_input_usa_df.loc[mask_per_unit, "unit"] = manual_input_usa_df.loc[ + mask_per_unit, "unit" + ].str.replace("per unit", "%") + manual_input_usa_df.loc[mask_per_unit, "value"] = ( + manual_input_usa_df.loc[mask_per_unit, "value"] * 100.0 + ).round(num_digits) + logger.info( + "`per unit` replaced by `%`. Corresponding value multiplied by 100." + ) + + # Include currency_year in unit if applicable + manual_input_usa_df["unit"] = manual_input_usa_df.apply( + lambda row: Commons.update_unit_with_currency_year( + row["unit"], row["currency_year"] + ), + axis=1, + ) + logger.info("`currency_year` included in `unit` column.") + + # Build TechnologyCollection + manual_input_usa_base_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "parsers", + "manual_input_usa", + ) + output_technologies_path = pathlib.Path( + manual_input_usa_base_path, + "v0.13.4/technologies.json", + ) + output_sources_path = pathlib.Path( + manual_input_usa_base_path, + "v0.13.4/sources.json", + ) + + tech_col = ManualInputUSAV0134Parser._build_technology_collection( + manual_input_usa_df, + output_sources_path, + archive_source=archive_source, + output_schema=export_schema, + ) + + logger.info("TechnologyCollection object instantiated.") + tech_col.to_json(output_technologies_path, output_schema=export_schema) + logger.info("TechnologyCollection object exported to json.") diff --git a/test/test_datapackage.py b/test/test_datapackage.py index d6d24489..1dc0267d 100644 --- a/test/test_datapackage.py +++ b/test/test_datapackage.py @@ -28,8 +28,12 @@ def test_get_source_collection(self) -> None: input_file ) data_package = technologydata.DataPackage( + name="solar_photovoltaics_example", + version="v1.0", technologies=technologies_collection, ) data_package.get_source_collection() assert isinstance(data_package.sources, technologydata.SourceCollection) assert len(data_package.sources) == 2 + assert data_package.name == "solar_photovoltaics_example" + assert data_package.version == "v1.0" diff --git a/test/test_dea_energy_storage.py b/test/test_dea_energy_storage_v10.py similarity index 87% rename from test/test_dea_energy_storage.py rename to test/test_dea_energy_storage_v10.py index 1a5b02d1..4585b9b5 100644 --- a/test/test_dea_energy_storage.py +++ b/test/test_dea_energy_storage_v10.py @@ -10,17 +10,7 @@ import pandas import pytest -from technologydata.parsers.dea_energy_storage.dea_energy_storage import ( - build_technology_collection, - clean_est_string, - clean_parameter_string, - clean_technology_string, - drop_invalid_rows, - extract_year, - filter_parameters, - format_val_number, - standardize_units, -) +from technologydata.parsers.dea_energy_storage import DeaEnergyStorageV10Parser class TestDEAEnergyStorage: @@ -40,7 +30,10 @@ def test_clean_parameter_string( self, input_string: str, expected_string: str ) -> None: """Check if the clean_parameter_string works as expected.""" - assert clean_parameter_string(input_string) == expected_string + assert ( + DeaEnergyStorageV10Parser._clean_parameter_string(input_string) + == expected_string + ) def test_drop_invalid_rows(self) -> None: """Check if the drop_invalid_rows works as expected.""" @@ -68,7 +61,9 @@ def test_drop_invalid_rows(self) -> None: "year": ["nearly 2020", "2024"], } ) - output_dataframe = drop_invalid_rows(input_dataframe).reset_index(drop=True) + output_dataframe = DeaEnergyStorageV10Parser._drop_invalid_rows( + input_dataframe + ).reset_index(drop=True) comparison_df = output_dataframe.compare(expected_dataframe) assert comparison_df.empty @@ -86,7 +81,7 @@ def test_clean_technology_string( self, input_string: str, expected_string: str ) -> None: """Check if clean_technology_string works as expected.""" - result = clean_technology_string(input_string) + result = DeaEnergyStorageV10Parser._clean_technology_string(input_string) assert result == expected_string assert isinstance(result, str) @@ -100,7 +95,7 @@ def test_clean_technology_string( ) # type: ignore def test_extract_year(self, input_year: str, expected_year: int) -> None: """Check if extract_year works as expected.""" - result = extract_year(input_year) + result = DeaEnergyStorageV10Parser._extract_year(input_year) assert result == expected_year assert isinstance(result, int) @@ -116,7 +111,7 @@ def test_format_val_number( self, input_number: str, expected_number: int | None | typing.Any ) -> None: """Check if format_val_number works as expected, including exception handling.""" - result = format_val_number(input_number, 2) + result = DeaEnergyStorageV10Parser._format_val_number(input_number, 2) assert isinstance(result, float) assert result == expected_number @@ -130,7 +125,7 @@ def test_format_val_number( ) # type: ignore def test_clean_est_string(self, input_string: str, expected_string: str) -> None: """Check if clean_est_string works as expected.""" - result = clean_est_string(input_string) + result = DeaEnergyStorageV10Parser._clean_est_string(input_string) assert isinstance(result, str) assert result == expected_string @@ -194,7 +189,7 @@ def test_standardize_units(self) -> None: ) input_dataframe[["par", "unit"]] = ( input_dataframe[["par", "unit"]] - .apply(standardize_units, axis=1) + .apply(DeaEnergyStorageV10Parser._standardize_units, axis=1) .reset_index(drop=True) ) comparison_df = input_dataframe.compare(expected_dataframe) @@ -205,9 +200,9 @@ def test_filter_parameters_true_false(self) -> None: dataframe = pandas.DataFrame( {"par": ["technical lifetime", "other"], "Technology": ["A", "B"]} ) - filtered = filter_parameters(dataframe, True) + filtered = DeaEnergyStorageV10Parser._filter_parameters(dataframe, True) assert all(filtered["par"] == "technical lifetime") - filtered2 = filter_parameters(dataframe, False) + filtered2 = DeaEnergyStorageV10Parser._filter_parameters(dataframe, False) assert len(filtered2) == 2 @pytest.mark.webarchive # type: ignore @@ -225,6 +220,8 @@ def test_build_technology_collection(self, tmp_path: pathlib.Path) -> None: } ) sources_path = pathlib.Path(tmp_path, "sources.json") - tech_collection = build_technology_collection(dataframe, sources_path) + tech_collection = DeaEnergyStorageV10Parser._build_technology_collection( + dataframe, sources_path + ) assert len(tech_collection.technologies) == 1 assert "specific_investment" in tech_collection.technologies[0].parameters diff --git a/test/test_parser_commons.py b/test/test_parser_commons.py index 4790d84a..07b97644 100644 --- a/test/test_parser_commons.py +++ b/test/test_parser_commons.py @@ -14,15 +14,27 @@ class TestCommonsUtils: def test_defaults_and_flag(self, monkeypatch: typing.Any) -> None: """Check if parse_input_arguments works when both default arg and the store_true flag are provided.""" - monkeypatch.setattr("sys.argv", ["prog", "--num_digits", "2", "--store_source"]) + monkeypatch.setattr( + "sys.argv", + [ + "prog", + "--num_digits", + "2", + "--archive_source", + "--input_file_name", + "file_name", + ], + ) args = CommonsParser.parse_input_arguments() assert args.num_digits == 2 - assert args.store_source is True + assert args.archive_source is True + assert args.input_file_name == "file_name" def test_default_values_when_not_provided(self, monkeypatch: typing.Any) -> None: """Check if parse_input_arguments works when no args are provided (so defaults are used).""" # no args -> defaults apply - monkeypatch.setattr("sys.argv", ["prog"]) + monkeypatch.setattr("sys.argv", ["prog", "--input_file_name", "file_name"]) args = CommonsParser.parse_input_arguments() + assert args.input_file_name == "file_name" assert args.num_digits == 4 # default from the function - assert args.store_source is False + assert args.archive_source is False diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index f7b9cbec..eda5a677 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -48,25 +48,60 @@ def test_get_latest_version_string_raises_error( DataAccessor.get_latest_version_string(path_list) def test_access_data_dea_energy_storage(self) -> None: - """Test access_data.""" - data_accessor = DataAccessor( - data_source_name="dea_energy_storage", data_version="v10" - ) + """Test load data for dea_energy_storage.""" + data_accessor = DataAccessor(data_source="dea_energy_storage", version="v10") data_package = data_accessor.load() - assert data_accessor.data_source_name == DataSourceName.DEA_ENERGY_STORAGE - assert data_accessor.data_version == "v10" + assert data_accessor.data_source == DataSourceName.DEA_ENERGY_STORAGE + assert data_accessor.version == "v10" assert data_package is not None assert data_package.technologies is not None assert data_package.sources is not None + assert data_package.name == "dea_energy_storage" + assert data_package.version == "v10" assert len(data_package.technologies) == 136 + def test_access_data_dea_energy_storage_validation(self) -> None: + """Test load data for dea_energy_storage with a wrong data set name.""" + with pytest.raises(ValueError): + DataAccessor(data_source="dea_energy", version="v10") + + def test_parse_and_access_data_dea_energy_storage(self) -> None: + """Test parse and load data for dea_energy_storage.""" + data_accessor = DataAccessor(data_source="dea_energy_storage", version="v10") + file_name = "Technology_datasheet_for_energy_storage.xlsx" + data_accessor.parse(file_name, num_digits=3, filter_params=True) + data_package = data_accessor.load() + + assert data_accessor.data_source == DataSourceName.DEA_ENERGY_STORAGE + assert data_accessor.version == "v10" + assert data_package is not None + assert data_package.technologies is not None + assert data_package.sources is not None + assert data_package.name == "dea_energy_storage" + assert data_package.version == "v10" + assert len(data_package.technologies) == 136 + + def test_parse_and_access_data_manual_input_usa(self) -> None: + """Test parse and load data for manual_input_usa.csv.""" + data_accessor = DataAccessor(data_source="manual_input_usa", version="v0.13.4") + file_name = "manual_input_usa.csv" + data_accessor.parse(file_name, num_digits=3) + data_package = data_accessor.load() + + assert data_accessor.data_source == DataSourceName.MANUAL_INPUT_USA + assert data_accessor.version == "v0.13.4" + assert data_package is not None + assert data_package.technologies is not None + assert data_package.sources is not None + assert data_package.name == "manual_input_usa" + assert data_package.version == "v0.13.4" + assert len(data_package.technologies) == 85 + def test_load_raises_value_error_for_invalid_version(self) -> None: """Test if load raises ValueError for an invalid version.""" with pytest.raises( ValueError, match="Data source version 'v11' not found. The latest available version is v10.", ): - DataAccessor( - data_source_name="dea_energy_storage", data_version="v11" - ).load() + DataAccessor(data_source="dea_energy_storage", version="v11").load() From bae79b9f52ef7844df82e10744737953bfc0a8d5 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Thu, 25 Jun 2026 15:07:00 +0200 Subject: [PATCH 44/81] Issue 92: configure default folder (#96) * code: set default data path * code: set default data path * code: changes to data_accessor * code: add unit test for ensure_path_exists * code: update data_accessor.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: pre-commit * code: add missing data_path docstring * update pyupgrade * update pyupgrade * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/instructions/copilot-instructions.md | 6 ++ .pre-commit-config.yaml | 16 ++--- README.md | 2 +- docs/contributing/CODE_OF_CONDUCT.md | 2 +- docs/contributing/instructions.md | 14 ++--- docs/examples/dea_storage_v10.md | 1 + docs/examples/manual_input_usa_v0134.md | 1 + docs/home/release-notes.md | 2 +- docs/user_guide/data_accessor.md | 6 +- docs/user_guide/dea_energy_storage_parser.md | 6 +- docs/user_guide/design.md | 22 ++++++- docs/user_guide/manual_input_usa_parser.md | 6 +- src/technologydata/datapackage.py | 1 - src/technologydata/parsers/data_accessor.py | 64 ++++++++++++++------ test/test_parser_data_accessor.py | 7 +++ 15 files changed, 111 insertions(+), 45 deletions(-) diff --git a/.github/instructions/copilot-instructions.md b/.github/instructions/copilot-instructions.md index 169de61f..66d55c46 100644 --- a/.github/instructions/copilot-instructions.md +++ b/.github/instructions/copilot-instructions.md @@ -8,12 +8,14 @@ SPDX-License-Identifier: MIT --> ## Project Overview + - `technologydata` is a Python package for energy system modellers to screen, harmonize, and transform techno-economic input data for energy system models. - Major use cases: data validation, harmonization, transformation to model-ready formats, and provenance/audit tracing. - Core classes: `DataPackage`, `Technology`, `Parameter`, `Source`, and `SourceCollection` (see `technologydata/`). - Data flows: Input data (JSON or DataFrame) β†’ `DataPackage`/`Technology` objects β†’ validation/transformation β†’ output for modeling/analysis. ## Key Workflows + - **Install dependencies:** Use `uv` (see `pyproject.toml`, `uv.lock`). Example: `uv sync`. - **Activate virtual environment:** Use `source .venv/bin/activate` before running commands. - **Linting/formatting:** Use `ruff` (`ruff check .` and `ruff format .`). @@ -23,6 +25,7 @@ SPDX-License-Identifier: MIT - **Docs:** Built with `mkdocs` (see `docs/`). ## Project-Specific Patterns + - **Validation:** Instantiating `Technology` or `DataPackage` triggers schema validation. Use `.check_consistency()` and `.calculate_parameters()` for further checks and derivations. - **Parameter Derivation:** Use `.calculate_parameters()` to fill in missing values based on rules. - **Unit Handling:** Uses `pint` for units and `pydeflate` for currency/inflation adjustments. Custom `UnitRegistry` in `technologydata/utils/units.py`. @@ -30,15 +33,18 @@ SPDX-License-Identifier: MIT - **Data Input:** Prefer JSON conforming to the internal schema. See `test/test_data/` for examples. ## External Integrations + - `pydeflate` for currency/inflation - `pint` for units - `hdx.location.country` for country/currency codes - `savepagenow` for web archiving ## References + - Design: `docs/design.md` - Class diagram: `docs/class-diagram.puml` - Example data: `test/test_data/` --- + If any conventions or workflows are unclear, please ask for clarification or check `docs/design.md` for rationale and details. diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 71aa33bc..b57582aa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ ci: repos: # Basic pre-commit hooks for whitespace, merge conflicts, etc. - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: check-merge-conflict - id: check-added-large-files @@ -18,7 +18,7 @@ repos: # Ruff: Python linter and formatter - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.10 + rev: v0.15.19 hooks: - id: ruff args: [--fix] @@ -26,7 +26,7 @@ repos: # Codespell: Checks for common misspellings - repo: https://github.com/codespell-project/codespell - rev: v2.4.1 + rev: v2.4.2 hooks: - id: codespell args: ['--ignore-regex="(\b[A-Z]+\b)"', '--ignore-words=.codespell.ignore'] @@ -41,14 +41,14 @@ repos: # Pretty-format-yaml: YAML formatter - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - rev: v2.14.0 + rev: v2.16.0 hooks: - id: pretty-format-yaml args: [--autofix, --indent, '2', --preserve-quotes] # Mypy: Static type checker for Python - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.15.0' + rev: 'v2.1.0' hooks: - id: mypy args: [--strict, --ignore-missing-imports, --config-file=pyproject.toml] @@ -57,19 +57,19 @@ repos: # Pyupgrade: Automatically upgrades Python syntax - repo: https://github.com/asottile/pyupgrade - rev: v3.16.0 + rev: v3.21.2 hooks: - id: pyupgrade args: ["--py311-plus"] # REUSE: Checks for REUSE license compliance - repo: https://github.com/fsfe/reuse-tool - rev: v5.0.2 + rev: v6.2.0 hooks: - id: reuse - repo: https://github.com/rvben/rumdl-pre-commit - rev: v0.0.99 # Use the latest release tag + rev: v0.2.22 # Use the latest release tag hooks: - id: rumdl args: ["--fix", "--disable=MD006, MD013, MD024, MD030, MD033, MD041"] diff --git a/README.md b/README.md index 14c5e5df..ea32b1ba 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ A Python package to manage techno-economic assumptions for energy system models. It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. -The package currently includes a pre-parsed dataset from the DEA's Technology Catalogue focusing on energy storage technologies and a dedicated parser (see [here](docs/examples/dea_storage.md)). In the future it will include other common public data sources such NREL's ATB. +The package currently includes a pre-parsed dataset from the DEA's Technology Catalogue focusing on energy storage technologies and a dedicated parser (see [here](docs/examples/dea_storage.md)). In the future it will include other common public data sources such NREL's ATB. The goal of this package is to make energy system modelling easier and more efficient, automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. diff --git a/docs/contributing/CODE_OF_CONDUCT.md b/docs/contributing/CODE_OF_CONDUCT.md index fc9c0b6a..bce139f1 100644 --- a/docs/contributing/CODE_OF_CONDUCT.md +++ b/docs/contributing/CODE_OF_CONDUCT.md @@ -64,7 +64,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at - / / t.brown@tu-berlin.de. + / / . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the diff --git a/docs/contributing/instructions.md b/docs/contributing/instructions.md index f52d1150..918748ce 100644 --- a/docs/contributing/instructions.md +++ b/docs/contributing/instructions.md @@ -72,15 +72,15 @@ The virtual environment can be "activated" to make its packages available: === "macOS and Linux" - ```bash - source .venv/bin/activate - ``` +```bash +source .venv/bin/activate +``` === "Windows" - ```pwsh-session - PS> .venv\Scripts\activate - ``` +```pwsh-session +PS> .venv\Scripts\activate +``` To exit a virtual environment, use the `deactivate` command: @@ -175,7 +175,7 @@ The documentation is generated with [MkDocs](https://www.mkdocs.org/). The docum !!! note If you are not familiar with Markdown, consult the following [quick guide](https://www.markdownguide.org/basic-syntax/). -MkDocs offers the possibility to start a built-in development server to preview the documentation as you work on it. To start the development server run: +MkDocs offers the possibility to start a built-in development server to preview the documentation as you work on it. To start the development server run: ### Building the documentation locally diff --git a/docs/examples/dea_storage_v10.md b/docs/examples/dea_storage_v10.md index 818ff07c..53785f2b 100644 --- a/docs/examples/dea_storage_v10.md +++ b/docs/examples/dea_storage_v10.md @@ -95,6 +95,7 @@ parser_accessor.parse( ``` The `parse` method accepts the following arguments: + - `input_file_name` (str): The name of the raw data file located in `src/technologydata/parsers/raw/`. - `num_digits` (int, default 4): Number of decimals for rounding numeric values. - `archive_source` (bool, default False): Whether to store the source on the Wayback Machine. diff --git a/docs/examples/manual_input_usa_v0134.md b/docs/examples/manual_input_usa_v0134.md index abfa1351..22f95635 100644 --- a/docs/examples/manual_input_usa_v0134.md +++ b/docs/examples/manual_input_usa_v0134.md @@ -90,6 +90,7 @@ parser_accessor.parse( ``` The `parse` method accepts the following arguments: + - `input_file_name` (str): The name of the raw data file located in `src/technologydata/parsers/raw/`. - `num_digits` (int, default 4): Number of decimals for rounding numeric values. - `archive_source` (bool, default False): Whether to store the source on the Wayback Machine. diff --git a/docs/home/release-notes.md b/docs/home/release-notes.md index ffd159e9..5c98578c 100644 --- a/docs/home/release-notes.md +++ b/docs/home/release-notes.md @@ -11,6 +11,6 @@ ``pip install git+https://github.com/open-energy-transition/technology-data``. --> -### Release v0.1.0 +## Release v0.1.0 First version of the new `technologydata` prototype. diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 0af0d876..4b6d328d 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -21,12 +21,13 @@ It is designed to work with a specific directory structure where datasets are or - **Parsing Interface**: Provides a `parse()` method to run the appropriate parser for a given data source and version to generate the data files. - **Error Handling**: Raises `FileNotFoundError` if the specified data source or version directories cannot be found, and `ValueError` for unsupported sources or versions. - **Seamless Integration**: The `load()` method returns a `DataPackage` object, ready for use with other components of the `technologydata` library. +- **Path Safety Helper**: Provides `ensure_path_exists()` to create missing directories (including parents) safely. ## Usage Examples ### Creating a DataAccessor -To use the `DataAccessor`, you first create an instance, specifying the `data_source_name`. You can optionally provide a `data_version`. If no version is specified, the latest available version for this dataset is used. +To use `DataAccessor`, create an instance with `data_source`. You can also provide `version` and optionally override `data_path`. ```python from technologydata.parsers.data_accessor import DataAccessor @@ -87,6 +88,7 @@ Please refer to the [API documentation](../api/data_accessor.md) for detailed in ## Limitations & Notes -- **Directory Structure**: The `DataAccessor` expects a specific directory structure within the project: `src/technologydata/parsers///`. It will not find data located elsewhere. +- **Directory Structure**: The `DataAccessor` expects a specific directory structure within the project: `src/technologydata/parsers/// unless `data_path` is overridden. - **Version Naming**: Version directories must be prefixed with a `v` and follow a pattern that can be parsed by `packaging.version` (e.g., `v1`, `v2.0`, `v1.0.1-alpha`). Directories that do not match this pattern will be ignored when searching for the latest version. - **Target Data**: The `load()` method is designed to load a `DataPackage` from a folder. See the [DataPackage](./datapackage.md) documentation for more details on the expected contents of that folder (i.e.,`technologies.json`). +- **Input Location for Parse**: `parse()` expects `input_file_name` under `data_path/raw/`. diff --git a/docs/user_guide/dea_energy_storage_parser.md b/docs/user_guide/dea_energy_storage_parser.md index ff9482c3..7bff1f98 100644 --- a/docs/user_guide/dea_energy_storage_parser.md +++ b/docs/user_guide/dea_energy_storage_parser.md @@ -6,12 +6,12 @@ The `DeaEnergyStorageParser` is responsible for parsing data from the Danish Ene The main parser, `DeaEnergyStorageParser`, acts as a dispatcher that selects the appropriate version-specific parser based on the user's request. -### Key Features: +### Key Features - **Version Dispatching**: Dynamically selects the correct parser for a given dataset version (e.g., `v10`). - **Supported Versions**: Provides a method to get a list of all supported dataset versions. -### Usage: +### Usage While it is possible to use the parser directly, the recommended way to access the data is through the `DataAccessor` class, which provides a higher-level interface and handles the parsing process internally. See the [Data Accessor](./data_accessor.md) documentation for more details. @@ -47,7 +47,7 @@ dea_parser.parse( The `DeaEnergyStorageV10Parser` is a concrete implementation that handles version 10 of the DEA Energy Storage dataset. It inherits from `ParserBase` and contains the logic for reading, cleaning, and transforming the raw data. -### Key Responsibilities: +### Key Responsibilities - **Data Loading**: Reads data from the specified Excel file (`alldata_flat` sheet). - **Data Cleaning**: diff --git a/docs/user_guide/design.md b/docs/user_guide/design.md index b6e8fe7a..85156da4 100644 --- a/docs/user_guide/design.md +++ b/docs/user_guide/design.md @@ -61,6 +61,7 @@ Below follow central use cases that we want to serve with `technologydata`. ### 🧾 UC-001: Screen techno-economic inputs for validity and completeness #### πŸ§‘β€πŸ’» Actor(s) + - **Primary**: Energy System Modeller, Programmer - **Secondary**: Energy Analyst (if reviewing pre-screened data) @@ -69,6 +70,7 @@ Below follow central use cases that we want to serve with `technologydata`. Detect and correct inconsistencies or omissions in techno-economic input data, ensuring it adheres to the package's schema and parameter constraints. #### πŸ“š Pre-conditions + - Python environment with `technologydata` installed - Input data provided as: - JSON (conforming to data schema) @@ -77,6 +79,7 @@ Detect and correct inconsistencies or omissions in techno-economic input data, e - Users are familiar with the structure of `Technology`, `Parameter`, and `Source` classes #### 🚦 Trigger + - Instantiation of one or more `Technology` object with user-provided or pre-compiled data - Manual invocation of validation or consistency-check method @@ -108,6 +111,7 @@ Detect and correct inconsistencies or omissions in techno-economic input data, e - User is able to complete missing fields to the `Technology` object #### βœ… Post-conditions + - One or more `Technology` objects validated and completed with all parameters that can be derived, or - Errors on schema-violations and Warning about inconsistencies are logged. @@ -156,6 +160,7 @@ tech = Technology( ### 🧾 UC-002: Harmonize multiple input datasets #### πŸ§‘β€πŸ’» Actor(s) + - **Primary**: Energy System Modeller, Energy Analyst - **Secondary**: Data Engineer @@ -164,11 +169,13 @@ tech = Technology( Enable the user to bring multiple techno-economic datasets to a common basis (currency, year, units) using explicit, user-invoked transformation methods, so that they can be compared or combined. #### πŸ“š Pre-conditions + - Python environment with `technologydata` installed - One or more Technology objects loaded as `DataPackage` or `TechnologyCollection` objects - User is familiar with available transformation methods (e.g., `adjust_currency`, `adjust_scale`, `adjust_region`) #### 🚦 Trigger + - User loads multiple datasets and wishes to harmonize them for comparison or integration #### 🧡 Main Flow @@ -192,6 +199,7 @@ Enable the user to bring multiple techno-economic datasets to a common basis (cu - **Partial harmonization**: User can harmonize only a subset of parameters. #### βœ… Post-conditions + - All datasets are harmonized to the user-specified conventions, e.g. currency, currency year, units. #### πŸ§ͺ Sample Input/Output @@ -228,6 +236,7 @@ dp1.technologies = dp1.technologies.adjust_units(parameter="specific-investment" ### 🧾 UC-003: Transform assumptions into model-ready formats #### πŸ§‘β€πŸ’» Actor(s) + - **Primary**: Energy System Modeller, Programmer #### 🎯 Goal @@ -235,10 +244,12 @@ dp1.technologies = dp1.technologies.adjust_units(parameter="specific-investment" Allow the user to derive and access all model-relevant parameters (e.g., EAC, specific investment) from harmonized data, ready for direct use in energy system models such as PyPSA-Eur. #### πŸ“š Pre-conditions + - One `Technology` object or multiple in a `TechnologyCollection` or `DataPackage` available - User knows which parameters are required for the target model #### 🚦 Trigger + - User wants to prepare data for model input, e.g., for PyPSA-Eur #### 🧡 Main Flow @@ -258,6 +269,7 @@ Allow the user to derive and access all model-relevant parameters (e.g., EAC, sp - **Calculation error**: System logs the error and aborts the calculation. #### βœ… Post-conditions + - All required model parameters are present and accessible in the `Technology` objects, ready for export or direct use. #### πŸ§ͺ Sample Input/Output @@ -283,6 +295,7 @@ tech["EAC"].value # Access the calculated EAC parameter value ### 🧾 UC-004: Compare techno-economic indicators across datasets #### πŸ§‘β€πŸ’» Actor(s) + - **Primary**: Energy Analyst, Energy System Modeller #### 🎯 Goal @@ -290,10 +303,12 @@ tech["EAC"].value # Access the calculated EAC parameter value Enable the user to systematically compare key techno-economic parameters (e.g., CAPEX, OPEX, efficiency) across multiple harmonized datasets in a tabular format. #### πŸ“š Pre-conditions + - Two or more `Technology` objects available as `TechnologyCollection` or `DataPackage` objects - User knows which parameters and technologies to compare #### 🚦 Trigger + - User wants to compare indicators across datasets for quality control, reporting, or analysis #### 🧡 Main Flow @@ -308,6 +323,7 @@ Enable the user to systematically compare key techno-economic parameters (e.g., - **Manually created comparison**: User can manually create a comparison table by selecting specific parameters and technologies individually through their `.values` attributes. #### βœ… Post-conditions + - Tabular comparison of selected parameters across datasets is available for review and export. #### πŸ§ͺ Sample Input/Output @@ -338,6 +354,7 @@ techs["lifetime"].values # Access lifetime values across technologies ### 🧾 UC-005: Audit data provenance and transformation trace #### πŸ§‘β€πŸ’» Actor(s) + - **Primary**: Energy System Modeller - **Secondary**: Energy Analyst @@ -346,9 +363,11 @@ techs["lifetime"].values # Access lifetime values across technologies Allow the user to trace the origin and transformation history of each data point, enabling transparency and reproducibility. #### πŸ“š Pre-conditions + - Data loaded and/or transformed using `technologydata` #### 🚦 Trigger + - User requests provenance or transformation history for a specific parameter, object or Collection. #### 🧡 Main Flow @@ -364,10 +383,11 @@ Allow the user to trace the origin and transformation history of each data point #### πŸ” Alternate Flows -- **Manually changed information**: If the user made manual changes at some point, then the system only notifies and provides trace over what was done by the package; User changes are not tracked. +- **Manually changed information**: If the user made manual changes at some point, then the system only notifies and provides trace over what was done by the package; User changes are not tracked. - **Requesting provenance for a Technology or TechnologyCollection**: The user can access the provenance information for all parameters of a Technology or TechnologyCollection by exporting it to a DataFrame or JSON. #### βœ… Post-conditions + - User has access to a detailed provenance and transformation trace for any data point. - Reports or logs can be exported for documentation. diff --git a/docs/user_guide/manual_input_usa_parser.md b/docs/user_guide/manual_input_usa_parser.md index af924820..9fda8214 100644 --- a/docs/user_guide/manual_input_usa_parser.md +++ b/docs/user_guide/manual_input_usa_parser.md @@ -6,12 +6,12 @@ The `ManualInputUsaParser` is responsible for parsing data from the `manual_inpu The main parser, `ManualInputUsaParser`, acts as a dispatcher that selects the appropriate version-specific parser based on the user's request. -### Key Features: +### Key Features - **Version Dispatching**: Dynamically selects the correct parser for a given dataset version (e.g., `v0.13.4`). - **Supported Versions**: Provides a method to get a list of all supported dataset versions. -### Usage: +### Usage While it is possible to use the parser directly, the recommended way to access the data is through the `DataAccessor` class, which provides a higher-level interface and handles the parsing process internally. See the [Data Accessor](./data_accessor.md) documentation for more details. @@ -47,7 +47,7 @@ manual_input_parser.parse( The `ManualInputUSAV0134Parser` is a concrete implementation that handles version `v0.13.4` of the `manual_input_usa.csv` dataset. It inherits from `ParserBase` and contains the logic for reading, cleaning, and transforming the raw data. -### Key Responsibilities: +### Key Responsibilities - **Data Loading**: Reads data from the specified CSV file. - **Data Cleaning**: diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index 1f7a431e..71f6943d 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -115,7 +115,6 @@ def from_json( data_package = cls( name=name, version=version, - path=path_to_folder, technologies=technologies, ) diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/parsers/data_accessor.py index 7d651897..83123a39 100644 --- a/src/technologydata/parsers/data_accessor.py +++ b/src/technologydata/parsers/data_accessor.py @@ -13,7 +13,7 @@ import pydantic from packaging.version import parse -from pydantic import field_validator +from pydantic import Field, field_validator from technologydata import DataPackage from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser @@ -48,15 +48,49 @@ class DataAccessor(pydantic.BaseModel): The specific version string of the data to load (e.g., "v1.0.0"). If not provided, the latest version will be automatically determined and used. Default is None. + data_path : pathlib.Path, optional + The path to the data source directory. If not provided, the default + path will be used. """ - data_source: Annotated[ - str, pydantic.Field(description="The name of the data source.") - ] + data_source: Annotated[str, Field(description="The name of the data source.")] version: Annotated[ - str | None, pydantic.Field(description="The version of the data source.") + str | None, Field(description="The version of the data source.") ] = None + data_path: Annotated[ + pathlib.Path, + Field( + description="The base directory path where data sources are located.", + ), + ] = pathlib.Path(path_cwd, "src", "technologydata", "parsers") + + @staticmethod + def ensure_path_exists(input_data_path: pathlib.Path) -> None: + """ + Ensure the provided data directory exists, creating it if necessary. + + Creates the data directory and any parent directories as needed. If the + directory already exists, no action is taken. + + Parameters + ---------- + input_data_path : pathlib.Path + The base directory path where data sources are located. + + Returns + ------- + None + + Notes + ----- + This method uses `mkdir(parents=True, exist_ok=True)` to safely create + the directory structure without raising an error if the directory + already exists. + + """ + if not input_data_path.is_dir(): + input_data_path.mkdir(parents=True, exist_ok=True) @field_validator("data_source", mode="before") @classmethod @@ -116,11 +150,10 @@ def load(self) -> DataPackage: If the specified version is not found. The user is notified of the latest available version. """ - source_path = pathlib.Path( - path_cwd, "src", "technologydata", "parsers", self.data_source - ) - if not source_path.is_dir(): - raise FileNotFoundError(f"Data source directory not found: {source_path}") + # Ensure the data path exists before attempting to load data + DataAccessor.ensure_path_exists(self.data_path) + + source_path = pathlib.Path(self.data_path, self.data_source) source_path_list = [p.name for p in source_path.iterdir() if p.is_dir()] @@ -187,15 +220,12 @@ def parse( ) # Read the raw data - input_data_path = pathlib.Path( - path_cwd, - "src", - "technologydata", - "parsers", + input_path = pathlib.Path( + self.data_path, "raw", - input_file_name, ) - + DataAccessor.ensure_path_exists(input_path) + input_data_path = pathlib.Path(input_path, input_file_name) logger.info(f"Input data path set to: {input_data_path}") if self.version not in parser.get_supported_versions(): diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index eda5a677..fd6af51f 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -105,3 +105,10 @@ def test_load_raises_value_error_for_invalid_version(self) -> None: match="Data source version 'v11' not found. The latest available version is v10.", ): DataAccessor(data_source="dea_energy_storage", version="v11").load() + + def test_ensure_path_exists_is_idempotent(self, tmp_path: pathlib.Path) -> None: + """Test ensure_path_exists is idempotent.""" + target = pathlib.Path(tmp_path, "test_directory") + DataAccessor.ensure_path_exists(target) + assert target.exists() + assert target.is_dir() From bca5acfcfbbe88d1a2744f34fda246bce8719772 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Thu, 25 Jun 2026 16:07:39 +0200 Subject: [PATCH 45/81] Update pre commit (#100) * code: set default data path * code: set default data path * code: changes to data_accessor * code: add unit test for ensure_path_exists * code: update data_accessor.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: pre-commit * code: add missing data_path docstring * update pyupgrade * update pyupgrade * code: update pre-commit and solve new issues * update REUSE.toml --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- README.md | 4 ++-- docs/examples/dea_storage_v10.md | 4 ++-- docs/examples/manual_input_usa_v0134.md | 2 +- docs/user_guide/parameter.md | 2 +- src/technologydata/parsers/data_accessor.py | 4 ++-- src/technologydata/utils/commons.py | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b57582aa..56abdaeb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -72,4 +72,4 @@ repos: rev: v0.2.22 # Use the latest release tag hooks: - id: rumdl - args: ["--fix", "--disable=MD006, MD013, MD024, MD030, MD033, MD041"] + args: ["--fix", "--disable=MD013, MD024, MD030, MD033, MD041"] diff --git a/README.md b/README.md index ea32b1ba..c49ac5eb 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ A Python package to manage techno-economic assumptions for energy system models. It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. -The package currently includes a pre-parsed dataset from the DEA's Technology Catalogue focusing on energy storage technologies and a dedicated parser (see [here](docs/examples/dea_storage.md)). In the future it will include other common public data sources such NREL's ATB. +The package currently includes a pre-parsed dataset from the DEA's Technology Catalogue focusing on energy storage technologies and a dedicated parser (see [DEA parser documentation](docs/examples/dea_storage_v10.md)). In the future it will include other common public data sources such NREL's ATB. The goal of this package is to make energy system modelling easier and more efficient, automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. @@ -75,7 +75,7 @@ uv sync --group dev --group docs ## Usage -Detailed usage instructions and examples can be found in the available documentation. To build the documentation locally, follow the steps outlined [here](docs/contributing/instructions.md#building-the-documentation-locally). +Detailed usage instructions and examples can be found in the available documentation. To build the documentation locally, follow the [contributing instructions](docs/contributing/instructions.md#building-the-documentation-locally). ## Maintainers diff --git a/docs/examples/dea_storage_v10.md b/docs/examples/dea_storage_v10.md index 53785f2b..f9a00858 100644 --- a/docs/examples/dea_storage_v10.md +++ b/docs/examples/dea_storage_v10.md @@ -16,7 +16,7 @@ The Danish Energy Agency (DEA) data parser demonstrates a full data-cleaning and ## Dataset Description -The original dataset is available at this [link](https://ens.dk/media/6589/download). A full description of the dataset is available at this [link](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`. +The original dataset is available from the [Danish Energy Agency website](https://ens.dk/media/6589/download). A full description of the dataset is available in the [DEA documentation](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`. The dataset is in Excel format, and it includes, under the data sheet `alldata_flat`, a flat table of technology parameters for a range of energy storage technologies. Columns include `Technology`, `ws`, `par` (parameter name), `val` (value), `unit`, `year`, `est` (case/estimate), `priceyear`, plus metadata columns such as `cat`, `ref`, `note`. Rows are individual parameter records (parameter value + unit + context) for technologies and estimation cases. @@ -40,7 +40,7 @@ Function `_extract_year()` extracts the first sequence of digits from the `year` Function `_clean_parameter_string()` removes leading hyphens, removes text inside square brackets (units/notes), collapses extra spaces and lower-cases the parameter name. It is applied to the `par` column. -Function `_standardize_units()` is applied to columns `par` and `unit`. It completes missing units based on parameter name (e.g., `energy storage capacity for one unit` is mapped to the unit `MWh`) via a parameter-to-unit map. Moreover, it replaces known incorrect unit strings as `⁰C` -> `C` or `m2` to `meter**2`. The unit substitutions are driven by the `pint` documentation available at this [link](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt). +Function `_standardize_units()` is applied to columns `par` and `unit`. It completes missing units based on parameter name (e.g., `energy storage capacity for one unit` is mapped to the unit `MWh`) via a parameter-to-unit map. Moreover, it replaces known incorrect unit strings as `⁰C` -> `C` or `m2` to `meter**2`. The unit substitutions are driven by the [pint default units definition](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt). Function `Commons.update_unit_with_currency_year(unit, priceyear)`, if present, appends `priceyear` information to currency units. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `EUR_2021`. diff --git a/docs/examples/manual_input_usa_v0134.md b/docs/examples/manual_input_usa_v0134.md index 22f95635..bc938c5e 100644 --- a/docs/examples/manual_input_usa_v0134.md +++ b/docs/examples/manual_input_usa_v0134.md @@ -16,7 +16,7 @@ The Manual Input USA data parser demonstrates a data-cleaning and transformation ## Dataset Description -The original dataset is a manually curated CSV file containing USA-specific technology parameters available at this [link](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv). The raw source file is included in the repository at `src/technologydata/parsers/raw/manual_input_usa.csv`. +The original dataset is a manually curated CSV file containing USA-specific technology parameters available from the [PyPSA technology-data repository](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv). The raw source file is included in the repository at `src/technologydata/parsers/raw/manual_input_usa.csv`. The dataset is in CSV format and includes a flat table of technology parameters for various energy technologies relevant to the USA context. Columns include `technology`, `parameter`, `year`, `value`, `unit`, `currency_year`, `source`, `further_description`, `financial_case`, and `scenario`. Rows are individual parameter records (parameter value + unit + context) for technologies with different scenarios and financial cases. diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index 0354727d..682910b2 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -6,7 +6,7 @@ The `Parameter` class in `technologydata` encapsulates a value, its unit, proven ## Features -- **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). The default `pint` units definition file is available [here](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt) for reference. Be mindful of false unit-friends, e.g. `t = metric_ton = tonne != ton = US_ton` +- **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). The [pint default units definition](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt) file is available for reference. Be mindful of false unit-friends, e.g. `t = metric_ton = tonne != ton = US_ton` - **Currency Unit Convention**: Currency units must follow the pattern `XYZ_YYYY`, where `XYZ` is the 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code (e.g., `USD`, `EUR`, `CNY`) and `YYYY` is the 4-digit year (e.g., `USD_2020`). This allows for both currency and inflation adjustments. - **Carrier and Heating Value**: Optionally specify an energy carrier (e.g., `H2`) and a heating value type (`LHV` or `HHV`). - **Provenance and Notes**: Track the origin of the data and any additional notes. diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/parsers/data_accessor.py index 83123a39..fe71a5df 100644 --- a/src/technologydata/parsers/data_accessor.py +++ b/src/technologydata/parsers/data_accessor.py @@ -4,11 +4,11 @@ """Provide a class to access data from a data source.""" +import enum import logging import pathlib import re import sys -from enum import Enum from typing import Annotated import pydantic @@ -24,7 +24,7 @@ logger = logging.getLogger(__name__) -class DataSourceName(str, Enum): +class DataSourceName(enum.StrEnum): """An enumeration of available data sources.""" DEA_ENERGY_STORAGE = "dea_energy_storage" diff --git a/src/technologydata/utils/commons.py b/src/technologydata/utils/commons.py index a740a7e0..35c853e1 100644 --- a/src/technologydata/utils/commons.py +++ b/src/technologydata/utils/commons.py @@ -19,7 +19,7 @@ all_currency_codes = set(get_iso3_to_currency_codes().values()) -class DateFormatEnum(str, enum.Enum): +class DateFormatEnum(enum.StrEnum): """ Enum for date formats used in different sources. From 176ddb3f070fb56f3f330d8719679b558e5a2ed6 Mon Sep 17 00:00:00 2001 From: cdgaete Date: Mon, 24 Aug 2026 18:32:01 -0400 Subject: [PATCH 46/81] docs: use one consistent import style in the user guide The docs showed two import styles for the same classes: some pages used `from technologydata import Parameter`, most used the submodule form `from technologydata.parameter import Parameter`, and datapackage.md mixed both. Use the short top-level form for every class re-exported in the package's __init__.py (DataPackage, TechnologyCollection, SourceCollection, Parameter, Source, Technology), and keep the submodule form only for names that are not top-level exports: growth_models (LinearGrowth, ExponentialGrowth), DataAccessor, and the parser classes (DeaEnergyStorageParser, ManualInputUsaParser). Consecutive submodule imports are collapsed onto a single line, and where a block mixes both styles the top-level import now comes first. Docs-only change; no source or behaviour changes. --- docs/user_guide/datapackage.md | 3 +-- docs/user_guide/parameter.md | 14 ++++++-------- docs/user_guide/source.md | 8 ++++---- docs/user_guide/source_collection.md | 15 +++++---------- docs/user_guide/technology.md | 15 +++++---------- docs/user_guide/technology_collection.md | 21 +++++++-------------- 6 files changed, 28 insertions(+), 48 deletions(-) diff --git a/docs/user_guide/datapackage.md b/docs/user_guide/datapackage.md index 019c5616..e70a548d 100644 --- a/docs/user_guide/datapackage.md +++ b/docs/user_guide/datapackage.md @@ -97,8 +97,7 @@ The `sources` attribute of the `DataPackage` can be automatically populated by e In this context, `extracting` means scanning the `TechnologyCollection` for all `Source` references that appear in the technology parameters, and aggregating them into a single `SourceCollection`. The extraction process yields a collection of unique sources, by removing duplicates based on all source attributes. ```python -from technologydata.datapackage import DataPackage -from technologydata.technology_collection import TechnologyCollection +from technologydata import DataPackage, TechnologyCollection # Create a DataPackage with existing collections dp = DataPackage( diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index 682910b2..8943b5a2 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -20,9 +20,7 @@ The `Parameter` class in `technologydata` encapsulates a value, its unit, proven ### Creating a Parameter ```python -from technologydata.parameter import Parameter -from technologydata.source import Source -from technologydata.source_collection import SourceCollection +from technologydata import Parameter, Source, SourceCollection param = Parameter( magnitude=1000, @@ -61,7 +59,7 @@ Currency conversion and inflation adjustment are also available for `Technology` ```python # for a Technology -from technologydata.technology import Technology +from technologydata import Technology tech = Technology( name="Example Tech", detailed_technology="Detailed Example Tech", @@ -75,7 +73,7 @@ converted_tech = tech.to_currency("USD_2020", source="worldbank") USD_2020 / kilowatt # and for a TechnologyCollection -from technologydata.technology_collection import TechnologyCollection +from technologydata import TechnologyCollection tech_collection = TechnologyCollection(technologies=[tech]) converted_collection = tech_collection.to_currency("USD_2020", source="worldbank") >>> print(converted_collection.technologies[0].parameters["cost"].units) @@ -99,7 +97,7 @@ DEU ### Arithmetic Operations ```python -from technologydata.parameter import Parameter +from technologydata import Parameter param2 = Parameter(magnitude=500, units="USD_2020/kW", carrier="H2", heating_value="LHV") sum_param = param + param2 @@ -110,7 +108,7 @@ sum_param = param + param2 **Note:** If you try to add or subtract parameters with different carriers or heating values, a `ValueError` will be raised: ```python -from technologydata.parameter import Parameter +from technologydata import Parameter param_hhv = Parameter(magnitude=1, units="USD_2020/kW", carrier="H2", heating_value="HHV") param + param_hhv @@ -139,7 +137,7 @@ The heating value can be changed using the `change_heating_value` method, which ### Example: Converting Between LHV and HHV ```python -from technologydata.parameter import Parameter +from technologydata import Parameter # Create a parameter on LHV basis param_lhv = Parameter(magnitude=33.33, units="kWh/kg", carrier="hydrogen", heating_value="LHV") diff --git a/docs/user_guide/source.md b/docs/user_guide/source.md index 95502d97..a0f0691b 100644 --- a/docs/user_guide/source.md +++ b/docs/user_guide/source.md @@ -18,7 +18,7 @@ The `Source` class in `technologydata` represents bibliographic and web sources, ### Creating a Source ```python -from technologydata.source import Source +from technologydata import Source src = Source(title="Example Source", authors="The Authors", url="http://example.com") ``` @@ -27,7 +27,7 @@ A `Source` object can also be used to archive and retrieve PDFs or other files f ### Archiving a URL ```python -from technologydata.source import Source +from technologydata import Source src = Source(title="Example Source", authors="The Authors", url="http://example.com") src.ensure_in_wayback() @@ -39,7 +39,7 @@ print(src.url_date_archive) # Archive timestamp ```python import pathlib -from technologydata.source import Source +from technologydata import Source src = Source(title="Example Source", authors="The Authors", url="http://example.com") output_path = src.retrieve_from_wayback(pathlib.Path("downloads/")) @@ -51,7 +51,7 @@ print(output_path) # Path to downloaded file ```python import pathlib import pandas as pd -from technologydata.source import Source +from technologydata import Source # Create a Source for an Excel file excel_src = Source(title="Example Spreadsheet", authors="The Authors", url="http://example.com/data.xlsx") diff --git a/docs/user_guide/source_collection.md b/docs/user_guide/source_collection.md index 1ce9970d..f5ad5044 100644 --- a/docs/user_guide/source_collection.md +++ b/docs/user_guide/source_collection.md @@ -18,8 +18,7 @@ The `SourceCollection` class in `technologydata` represents a collection of `Sou ### Creating a SourceCollection ```python -from technologydata.source import Source -from technologydata.source_collection import SourceCollection +from technologydata import Source, SourceCollection src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") @@ -29,8 +28,7 @@ collection = SourceCollection(sources=[src1, src2]) ### Filtering Sources ```python -from technologydata.source import Source -from technologydata.source_collection import SourceCollection +from technologydata import Source, SourceCollection src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") @@ -43,8 +41,7 @@ print(filtered) # SourceCollection with sources matching the patterns ### Exporting to CSV ```python -from technologydata.source import Source -from technologydata.source_collection import SourceCollection +from technologydata import Source, SourceCollection src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") @@ -58,8 +55,7 @@ collection.to_csv(path_or_buf="sources.csv") ```python import pathlib -from technologydata.source import Source -from technologydata.source_collection import SourceCollection +from technologydata import Source, SourceCollection src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") @@ -73,8 +69,7 @@ collection.to_json(file_path=pathlib.Path("sources.json")) ```python import pathlib -from technologydata.source import Source -from technologydata.source_collection import SourceCollection +from technologydata import Source, SourceCollection src1 = Source(title="Source One", authors="Author A", url="http://example.com/1") src2 = Source(title="Source Two", authors="Author B", url="http://example.com/2") diff --git a/docs/user_guide/technology.md b/docs/user_guide/technology.md index 2adc6faa..74a176f0 100644 --- a/docs/user_guide/technology.md +++ b/docs/user_guide/technology.md @@ -19,8 +19,7 @@ The `Technology` class in `technologydata` represents a single technology, inclu ### Creating a Technology ```python -from technologydata.technology import Technology -from technologydata.parameter import Parameter +from technologydata import Technology, Parameter tech = Technology( name="Solar PV", @@ -38,8 +37,7 @@ tech = Technology( ### Accessing and Setting Parameters ```python -from technologydata.technology import Technology -from technologydata.parameter import Parameter +from technologydata import Technology, Parameter tech = Technology( name="Solar PV", @@ -63,8 +61,7 @@ tech["efficiency"] = Parameter(magnitude=0.18, units=None) ### Checking Consistency ```python -from technologydata.technology import Technology -from technologydata.parameter import Parameter +from technologydata import Technology, Parameter tech = Technology( name="Solar PV", @@ -85,8 +82,7 @@ print(is_consistent) # True if all required parameters are present ### Adjusting Currency ```python -from technologydata.technology import Technology -from technologydata.parameter import Parameter +from technologydata import Technology, Parameter tech = Technology( name="Solar PV", @@ -106,8 +102,7 @@ converted_tech = tech.to_currency("USD_2025", source="worldbank") ### Scaling Parameters ```python -from technologydata.technology import Technology -from technologydata.parameter import Parameter +from technologydata import Technology, Parameter tech = Technology( name="Solar PV", diff --git a/docs/user_guide/technology_collection.md b/docs/user_guide/technology_collection.md index 9b745481..20680726 100644 --- a/docs/user_guide/technology_collection.md +++ b/docs/user_guide/technology_collection.md @@ -19,8 +19,7 @@ The `TechnologyCollection` class in `technologydata` represents a collection of ### Creating a TechnologyCollection ```python -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection +from technologydata import Technology, TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) @@ -30,8 +29,7 @@ collection = TechnologyCollection(technologies=[tech1, tech2]) ### Filtering Technologies ```python -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection +from technologydata import Technology, TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) @@ -44,8 +42,7 @@ print(filtered) # TechnologyCollection with matching technologies ### Exporting to CSV ```python -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection +from technologydata import Technology, TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) @@ -58,8 +55,7 @@ collection.to_csv(path_or_buf="technologies.csv") ```python import pathlib -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection +from technologydata import Technology, TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) @@ -71,8 +67,7 @@ collection.to_json(file_path=pathlib.Path("technologies.json")) ### Currency Adjustment ```python -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection +from technologydata import Technology, TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) @@ -83,9 +78,8 @@ converted = collection.to_currency("USD_2025", source="worldbank") ### Fitting a Growth Model ```python +from technologydata import Technology, TechnologyCollection from technologydata.technologies.growth_models import LinearGrowth -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) @@ -97,9 +91,8 @@ fitted_model = collection.fit(parameter="installed capacity", model=LinearGrowth ### Projecting Parameters ```python +from technologydata import Technology, TechnologyCollection from technologydata.technologies.growth_models import LinearGrowth -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection tech1 = Technology(name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", parameters={}) tech2 = Technology(name="Tech2", region="DEU", year=2021, case="Base", detailed_technology="Wind", parameters={}) From 44a1992d5b8b73a793991d32c2ba2e7cc82769df Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 31 Aug 2026 13:42:19 +0200 Subject: [PATCH 47/81] code: update dependencies (#116) * code: update dependencies * code: remove further unused dependencies --- .gitignore | 3 + pyproject.toml | 14 +- test/conftest.py | 2 - uv.lock | 2966 ++++++++++++++++------------------------------ 4 files changed, 1039 insertions(+), 1946 deletions(-) diff --git a/.gitignore b/.gitignore index 1a7204e1..99f3d196 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,6 @@ dev/ # pydeflate cache pydeflate_data/ + +# site +site/ diff --git a/pyproject.toml b/pyproject.toml index e41f9a34..4b1e5d98 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,6 @@ requires-python = ">=3.12" dependencies = [ "frozendict>=2.4.6", "hdx-python-country>=3.9.6", - "mypy>=1.15.0", "pandas>=2.2.3", "pint>=0.24.4", "pydantic>=2.11.7", @@ -37,6 +36,7 @@ dependencies = [ "requests>=2.32.3", "savepagenow>=1.3.0", "scipy>=1.16.1", + "python-calamine>=0.4.0", ] [project.urls] @@ -49,36 +49,26 @@ Changelog = "https://github.com/open-energy-transition/technology-data/releases" # editable installation of package and non-packaged dependencies [dependency-groups] dev = [ - "ipykernel>=6.29.5", "pre-commit>=4.2.0", "pytest>=8.4.1", "pytest-cov>=6.2.1", "pytest-xdist>=3.8.0", "reuse>=5.0.2", + "mypy>=1.15.0", "technologydata", ] docs = [ "cairosvg>=2.8.2", - "gurobipy>=12.0.3", "mkdocs-argref-plugin>=0.5.0", "mkdocs-autolinks-plugin>=0.7.1", - "mkdocs-ezlinks-plugin>=0.1.14", - "mkdocs-git-committers-plugin>=0.2.3", "mkdocs-git-revision-date-localized-plugin>=1.4.7", - "mkdocs-jupyter>=0.25.1", "mkdocs-material>=9.6.14", - "mkdocs-minify-plugin>=0.8.0", - "mkdocs-open-in-new-tab>=1.0.8", - "mkdocs-redirects>=1.2.2", "mkdocs-table-reader-plugin>=3.1.0", "mkdocs-video>=1.5.0", "mkdocstrings>=0.29.1", "mkdocstrings-python>=1.16.11", - "openpyxl>=3.1.5", "pillow>=11.3.0", - "python-calamine>=0.4.0", - "tsam>=2.3.9", ] [tool.pytest.ini_options] diff --git a/test/conftest.py b/test/conftest.py index 07d6ba9f..bc9d943d 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -15,13 +15,11 @@ """ import pathlib -import sys import pytest import technologydata -sys.path.append("./technology-data") path_cwd = pathlib.Path.cwd() diff --git a/uv.lock b/uv.lock index 2a4a3923..5e0e26c0 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", @@ -11,59 +11,41 @@ resolution-markers = [ 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, upload_time = "2024-05-20T21:33:25.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, -] - -[[package]] -name = "appnope" -version = "0.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload_time = "2024-02-06T09:43:09.663Z" }, -] - -[[package]] -name = "asttokens" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload_time = "2024-11-30T04:30:10.946Z" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] [[package]] name = "backrefs" version = "5.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload_time = "2025-06-22T19:34:13.97Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload_time = "2025-06-22T19:34:05.252Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload_time = "2025-06-22T19:34:06.743Z" }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload_time = "2025-06-22T19:34:08.172Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload_time = "2025-06-22T19:34:09.68Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload_time = "2025-06-22T19:34:11.037Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload_time = "2025-06-22T19:34:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, ] [[package]] @@ -74,9 +56,9 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954, upload_time = "2025-08-24T14:06:13.168Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954, upload-time = "2025-08-24T14:06:13.168Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113, upload_time = "2025-08-24T14:06:14.884Z" }, + { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113, upload-time = "2025-08-24T14:06:14.884Z" }, ] [[package]] @@ -86,35 +68,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload_time = "2017-08-03T15:55:25.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload-time = "2017-08-03T15:55:25.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload_time = "2017-08-03T15:55:31.23Z" }, -] - -[[package]] -name = "bleach" -version = "6.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload_time = "2024-10-29T18:30:40.477Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload_time = "2024-10-29T18:30:38.186Z" }, -] - -[package.optional-dependencies] -css = [ - { name = "tinycss2" }, + { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload-time = "2017-08-03T15:55:31.23Z" }, ] [[package]] name = "boolean-py" version = "5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload-time = "2025-04-03T10:39:49.734Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload-time = "2025-04-03T10:39:48.449Z" }, ] [[package]] @@ -124,9 +89,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload_time = "2024-06-18T10:56:06.741Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload-time = "2024-06-18T10:56:06.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload_time = "2024-06-18T10:55:59.489Z" }, + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload-time = "2024-06-18T10:55:59.489Z" }, ] [[package]] @@ -140,9 +105,9 @@ dependencies = [ { name = "pillow" }, { name = "tinycss2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload_time = "2025-05-15T06:56:32.653Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload_time = "2025-05-15T06:56:28.552Z" }, + { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload-time = "2025-05-15T06:56:28.552Z" }, ] [[package]] @@ -153,18 +118,18 @@ dependencies = [ { name = "attrs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e3/42/988b3a667967e9d2d32346e7ed7edee540ef1cee829b53ef80aa8d4a0222/cattrs-25.2.0.tar.gz", hash = "sha256:f46c918e955db0177be6aa559068390f71988e877c603ae2e56c71827165cc06", size = 506531, upload_time = "2025-08-31T20:41:59.301Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/42/988b3a667967e9d2d32346e7ed7edee540ef1cee829b53ef80aa8d4a0222/cattrs-25.2.0.tar.gz", hash = "sha256:f46c918e955db0177be6aa559068390f71988e877c603ae2e56c71827165cc06", size = 506531, upload-time = "2025-08-31T20:41:59.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/a5/b3771ac30b590026b9d721187110194ade05bfbea3d98b423a9cafd80959/cattrs-25.2.0-py3-none-any.whl", hash = "sha256:539d7eedee7d2f0706e4e109182ad096d608ba84633c32c75ef3458f1d11e8f1", size = 70040, upload_time = "2025-08-31T20:41:57.543Z" }, + { url = "https://files.pythonhosted.org/packages/20/a5/b3771ac30b590026b9d721187110194ade05bfbea3d98b423a9cafd80959/cattrs-25.2.0-py3-none-any.whl", hash = "sha256:539d7eedee7d2f0706e4e109182ad096d608ba84633c32c75ef3458f1d11e8f1", size = 70040, upload-time = "2025-08-31T20:41:57.543Z" }, ] [[package]] name = "certifi" version = "2025.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload_time = "2025-08-03T03:07:47.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload_time = "2025-08-03T03:07:45.777Z" }, + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, ] [[package]] @@ -174,114 +139,114 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload_time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload_time = "2025-09-08T23:22:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload_time = "2025-09-08T23:22:45.938Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload_time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload_time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload_time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload_time = "2025-09-08T23:22:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload_time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload_time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload_time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload_time = "2025-09-08T23:22:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload_time = "2025-09-08T23:22:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload_time = "2025-09-08T23:22:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload_time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload_time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload_time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload_time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload_time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload_time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload_time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload_time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload_time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload_time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload_time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload_time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload_time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload_time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload_time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload_time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload_time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload_time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload_time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload_time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload_time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload_time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload_time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload_time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload_time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload_time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload_time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload_time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload_time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload_time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload_time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload_time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload_time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload_time = "2025-09-08T23:23:43.004Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[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, upload_time = "2023-08-12T20:38:17.776Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload-time = "2023-08-01T19:23:02.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload-time = "2023-08-01T19:23:00.661Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload_time = "2025-08-09T07:57:28.46Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload_time = "2025-08-09T07:56:08.475Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload_time = "2025-08-09T07:56:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload_time = "2025-08-09T07:56:11.326Z" }, - { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload_time = "2025-08-09T07:56:13.014Z" }, - { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload_time = "2025-08-09T07:56:14.428Z" }, - { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload_time = "2025-08-09T07:56:16.051Z" }, - { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload_time = "2025-08-09T07:56:17.314Z" }, - { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload_time = "2025-08-09T07:56:18.641Z" }, - { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload_time = "2025-08-09T07:56:20.289Z" }, - { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload_time = "2025-08-09T07:56:21.551Z" }, - { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload_time = "2025-08-09T07:56:23.115Z" }, - { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload_time = "2025-08-09T07:56:24.721Z" }, - { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload_time = "2025-08-09T07:56:26.004Z" }, - { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload_time = "2025-08-09T07:56:27.25Z" }, - { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload_time = "2025-08-09T07:56:28.515Z" }, - { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload_time = "2025-08-09T07:56:29.716Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload_time = "2025-08-09T07:56:30.984Z" }, - { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload_time = "2025-08-09T07:56:32.252Z" }, - { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload_time = "2025-08-09T07:56:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload_time = "2025-08-09T07:56:34.739Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload_time = "2025-08-09T07:56:35.981Z" }, - { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload_time = "2025-08-09T07:56:37.339Z" }, - { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload_time = "2025-08-09T07:56:38.687Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload_time = "2025-08-09T07:56:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload_time = "2025-08-09T07:56:41.311Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload_time = "2025-08-09T07:56:43.195Z" }, - { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload_time = "2025-08-09T07:56:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload_time = "2025-08-09T07:56:46.684Z" }, - { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload_time = "2025-08-09T07:56:47.941Z" }, - { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload_time = "2025-08-09T07:56:49.756Z" }, - { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload_time = "2025-08-09T07:56:51.369Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload_time = "2025-08-09T07:56:52.722Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload_time = "2025-08-09T07:56:55.172Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload_time = "2025-08-09T07:57:26.864Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] [[package]] @@ -291,164 +256,93 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload_time = "2025-05-20T23:19:49.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload_time = "2025-05-20T23:19:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "comm" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload_time = "2025-07-25T14:02:04.452Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload_time = "2025-07-25T14:02:02.896Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "coverage" version = "7.10.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload_time = "2025-09-21T20:03:56.815Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload_time = "2025-09-21T20:01:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload_time = "2025-09-21T20:01:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload_time = "2025-09-21T20:01:39.617Z" }, - { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload_time = "2025-09-21T20:01:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload_time = "2025-09-21T20:01:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload_time = "2025-09-21T20:01:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload_time = "2025-09-21T20:01:45.915Z" }, - { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload_time = "2025-09-21T20:01:47.296Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload_time = "2025-09-21T20:01:48.73Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload_time = "2025-09-21T20:01:50.529Z" }, - { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload_time = "2025-09-21T20:01:51.941Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload_time = "2025-09-21T20:01:53.481Z" }, - { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload_time = "2025-09-21T20:01:55.2Z" }, - { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload_time = "2025-09-21T20:01:56.629Z" }, - { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload_time = "2025-09-21T20:01:58.203Z" }, - { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload_time = "2025-09-21T20:01:59.748Z" }, - { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload_time = "2025-09-21T20:02:01.192Z" }, - { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload_time = "2025-09-21T20:02:02.701Z" }, - { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload_time = "2025-09-21T20:02:04.185Z" }, - { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload_time = "2025-09-21T20:02:06.034Z" }, - { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload_time = "2025-09-21T20:02:07.619Z" }, - { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload_time = "2025-09-21T20:02:10.34Z" }, - { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload_time = "2025-09-21T20:02:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload_time = "2025-09-21T20:02:13.919Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload_time = "2025-09-21T20:02:15.57Z" }, - { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload_time = "2025-09-21T20:02:17.395Z" }, - { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload_time = "2025-09-21T20:02:18.936Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload_time = "2025-09-21T20:02:20.44Z" }, - { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload_time = "2025-09-21T20:02:22.313Z" }, - { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload_time = "2025-09-21T20:02:24.287Z" }, - { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload_time = "2025-09-21T20:02:26.133Z" }, - { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload_time = "2025-09-21T20:02:27.716Z" }, - { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload_time = "2025-09-21T20:02:29.216Z" }, - { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload_time = "2025-09-21T20:02:31.226Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload_time = "2025-09-21T20:02:32.823Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload_time = "2025-09-21T20:02:34.86Z" }, - { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload_time = "2025-09-21T20:02:37.034Z" }, - { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload_time = "2025-09-21T20:02:39.011Z" }, - { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload_time = "2025-09-21T20:02:40.939Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload_time = "2025-09-21T20:02:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload_time = "2025-09-21T20:02:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload_time = "2025-09-21T20:02:46.503Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload_time = "2025-09-21T20:02:48.689Z" }, - { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload_time = "2025-09-21T20:02:50.31Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload_time = "2025-09-21T20:02:51.971Z" }, - { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload_time = "2025-09-21T20:02:53.858Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload_time = "2025-09-21T20:02:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload_time = "2025-09-21T20:02:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload_time = "2025-09-21T20:02:59.431Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload_time = "2025-09-21T20:03:01.324Z" }, - { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload_time = "2025-09-21T20:03:03.4Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload_time = "2025-09-21T20:03:05.111Z" }, - { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload_time = "2025-09-21T20:03:06.795Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload_time = "2025-09-21T20:03:08.495Z" }, - { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload_time = "2025-09-21T20:03:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload_time = "2025-09-21T20:03:11.861Z" }, - { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload_time = "2025-09-21T20:03:13.539Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload_time = "2025-09-21T20:03:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload_time = "2025-09-21T20:03:17.673Z" }, - { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload_time = "2025-09-21T20:03:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload_time = "2025-09-21T20:03:21.007Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload_time = "2025-09-21T20:03:23.12Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload_time = "2025-09-21T20:03:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload_time = "2025-09-21T20:03:26.93Z" }, - { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload_time = "2025-09-21T20:03:28.672Z" }, - { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload_time = "2025-09-21T20:03:53.918Z" }, -] - -[[package]] -name = "cryptography" -version = "46.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/62/e3664e6ffd7743e1694b244dde70b43a394f6f7fbcacf7014a8ff5197c73/cryptography-46.0.1.tar.gz", hash = "sha256:ed570874e88f213437f5cf758f9ef26cbfc3f336d889b1e592ee11283bb8d1c7", size = 749198, upload_time = "2025-09-17T00:10:35.797Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/8c/44ee01267ec01e26e43ebfdae3f120ec2312aa72fa4c0507ebe41a26739f/cryptography-46.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:1cd6d50c1a8b79af1a6f703709d8973845f677c8e97b1268f5ff323d38ce8475", size = 7285044, upload_time = "2025-09-17T00:08:36.807Z" }, - { url = "https://files.pythonhosted.org/packages/22/59/9ae689a25047e0601adfcb159ec4f83c0b4149fdb5c3030cc94cd218141d/cryptography-46.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ff483716be32690c14636e54a1f6e2e1b7bf8e22ca50b989f88fa1b2d287080", size = 4308182, upload_time = "2025-09-17T00:08:39.388Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/ca6cc9df7118f2fcd142c76b1da0f14340d77518c05b1ebfbbabca6b9e7d/cryptography-46.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9873bf7c1f2a6330bdfe8621e7ce64b725784f9f0c3a6a55c3047af5849f920e", size = 4572393, upload_time = "2025-09-17T00:08:41.663Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a3/0f5296f63815d8e985922b05c31f77ce44787b3127a67c0b7f70f115c45f/cryptography-46.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0dfb7c88d4462a0cfdd0d87a3c245a7bc3feb59de101f6ff88194f740f72eda6", size = 4308400, upload_time = "2025-09-17T00:08:43.559Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8c/74fcda3e4e01be1d32775d5b4dd841acaac3c1b8fa4d0774c7ac8d52463d/cryptography-46.0.1-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e22801b61613ebdebf7deb18b507919e107547a1d39a3b57f5f855032dd7cfb8", size = 4015786, upload_time = "2025-09-17T00:08:45.758Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b8/85d23287baeef273b0834481a3dd55bbed3a53587e3b8d9f0898235b8f91/cryptography-46.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:757af4f6341ce7a1e47c326ca2a81f41d236070217e5fbbad61bbfe299d55d28", size = 4982606, upload_time = "2025-09-17T00:08:47.602Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d3/de61ad5b52433b389afca0bc70f02a7a1f074651221f599ce368da0fe437/cryptography-46.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f7a24ea78de345cfa7f6a8d3bde8b242c7fac27f2bd78fa23474ca38dfaeeab9", size = 4604234, upload_time = "2025-09-17T00:08:49.879Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1f/dbd4d6570d84748439237a7478d124ee0134bf166ad129267b7ed8ea6d22/cryptography-46.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e8776dac9e660c22241b6587fae51a67b4b0147daa4d176b172c3ff768ad736", size = 4307669, upload_time = "2025-09-17T00:08:52.321Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fd/ca0a14ce7f0bfe92fa727aacaf2217eb25eb7e4ed513b14d8e03b26e63ed/cryptography-46.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9f40642a140c0c8649987027867242b801486865277cbabc8c6059ddef16dc8b", size = 4947579, upload_time = "2025-09-17T00:08:54.697Z" }, - { url = "https://files.pythonhosted.org/packages/89/6b/09c30543bb93401f6f88fce556b3bdbb21e55ae14912c04b7bf355f5f96c/cryptography-46.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:449ef2b321bec7d97ef2c944173275ebdab78f3abdd005400cc409e27cd159ab", size = 4603669, upload_time = "2025-09-17T00:08:57.16Z" }, - { url = "https://files.pythonhosted.org/packages/23/9a/38cb01cb09ce0adceda9fc627c9cf98eb890fc8d50cacbe79b011df20f8a/cryptography-46.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2dd339ba3345b908fa3141ddba4025568fa6fd398eabce3ef72a29ac2d73ad75", size = 4435828, upload_time = "2025-09-17T00:08:59.606Z" }, - { url = "https://files.pythonhosted.org/packages/0f/53/435b5c36a78d06ae0bef96d666209b0ecd8f8181bfe4dda46536705df59e/cryptography-46.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7411c910fb2a412053cf33cfad0153ee20d27e256c6c3f14d7d7d1d9fec59fd5", size = 4709553, upload_time = "2025-09-17T00:09:01.832Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c4/0da6e55595d9b9cd3b6eb5dc22f3a07ded7f116a3ea72629cab595abb804/cryptography-46.0.1-cp311-abi3-win32.whl", hash = "sha256:cbb8e769d4cac884bb28e3ff620ef1001b75588a5c83c9c9f1fdc9afbe7f29b0", size = 3058327, upload_time = "2025-09-17T00:09:03.726Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/cd29a35e0d6e78a0ee61793564c8cff0929c38391cb0de27627bdc7525aa/cryptography-46.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:92e8cfe8bd7dd86eac0a677499894862cd5cc2fd74de917daa881d00871ac8e7", size = 3523893, upload_time = "2025-09-17T00:09:06.272Z" }, - { url = "https://files.pythonhosted.org/packages/f2/dd/eea390f3e78432bc3d2f53952375f8b37cb4d37783e626faa6a51e751719/cryptography-46.0.1-cp311-abi3-win_arm64.whl", hash = "sha256:db5597a4c7353b2e5fb05a8e6cb74b56a4658a2b7bf3cb6b1821ae7e7fd6eaa0", size = 2932145, upload_time = "2025-09-17T00:09:08.568Z" }, - { url = "https://files.pythonhosted.org/packages/0a/fb/c73588561afcd5e24b089952bd210b14676c0c5bf1213376350ae111945c/cryptography-46.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:4c49eda9a23019e11d32a0eb51a27b3e7ddedde91e099c0ac6373e3aacc0d2ee", size = 7193928, upload_time = "2025-09-17T00:09:10.595Z" }, - { url = "https://files.pythonhosted.org/packages/26/34/0ff0bb2d2c79f25a2a63109f3b76b9108a906dd2a2eb5c1d460b9938adbb/cryptography-46.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9babb7818fdd71394e576cf26c5452df77a355eac1a27ddfa24096665a27f8fd", size = 4293515, upload_time = "2025-09-17T00:09:12.861Z" }, - { url = "https://files.pythonhosted.org/packages/df/b7/d4f848aee24ecd1be01db6c42c4a270069a4f02a105d9c57e143daf6cf0f/cryptography-46.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9f2c4cc63be3ef43c0221861177cee5d14b505cd4d4599a89e2cd273c4d3542a", size = 4545619, upload_time = "2025-09-17T00:09:15.397Z" }, - { url = "https://files.pythonhosted.org/packages/44/a5/42fedefc754fd1901e2d95a69815ea4ec8a9eed31f4c4361fcab80288661/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:41c281a74df173876da1dc9a9b6953d387f06e3d3ed9284e3baae3ab3f40883a", size = 4299160, upload_time = "2025-09-17T00:09:17.155Z" }, - { url = "https://files.pythonhosted.org/packages/86/a1/cd21174f56e769c831fbbd6399a1b7519b0ff6280acec1b826d7b072640c/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0a17377fa52563d730248ba1f68185461fff36e8bc75d8787a7dd2e20a802b7a", size = 3994491, upload_time = "2025-09-17T00:09:18.971Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/a8cbfa1c029987ddc746fd966711d4fa71efc891d37fbe9f030fe5ab4eec/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:0d1922d9280e08cde90b518a10cd66831f632960a8d08cb3418922d83fce6f12", size = 4960157, upload_time = "2025-09-17T00:09:20.923Z" }, - { url = "https://files.pythonhosted.org/packages/67/ae/63a84e6789e0d5a2502edf06b552bcb0fa9ff16147265d5c44a211942abe/cryptography-46.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:af84e8e99f1a82cea149e253014ea9dc89f75b82c87bb6c7242203186f465129", size = 4577263, upload_time = "2025-09-17T00:09:23.356Z" }, - { url = "https://files.pythonhosted.org/packages/ef/8f/1b9fa8e92bd9cbcb3b7e1e593a5232f2c1e6f9bd72b919c1a6b37d315f92/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ef648d2c690703501714588b2ba640facd50fd16548133b11b2859e8655a69da", size = 4298703, upload_time = "2025-09-17T00:09:25.566Z" }, - { url = "https://files.pythonhosted.org/packages/c3/af/bb95db070e73fea3fae31d8a69ac1463d89d1c084220f549b00dd01094a8/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:e94eb5fa32a8a9f9bf991f424f002913e3dd7c699ef552db9b14ba6a76a6313b", size = 4926363, upload_time = "2025-09-17T00:09:27.451Z" }, - { url = "https://files.pythonhosted.org/packages/f5/3b/d8fb17ffeb3a83157a1cc0aa5c60691d062aceecba09c2e5e77ebfc1870c/cryptography-46.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:534b96c0831855e29fc3b069b085fd185aa5353033631a585d5cd4dd5d40d657", size = 4576958, upload_time = "2025-09-17T00:09:29.924Z" }, - { url = "https://files.pythonhosted.org/packages/d9/46/86bc3a05c10c8aa88c8ae7e953a8b4e407c57823ed201dbcba55c4d655f4/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9b55038b5c6c47559aa33626d8ecd092f354e23de3c6975e4bb205df128a2a0", size = 4422507, upload_time = "2025-09-17T00:09:32.222Z" }, - { url = "https://files.pythonhosted.org/packages/a8/4e/387e5a21dfd2b4198e74968a541cfd6128f66f8ec94ed971776e15091ac3/cryptography-46.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ec13b7105117dbc9afd023300fb9954d72ca855c274fe563e72428ece10191c0", size = 4683964, upload_time = "2025-09-17T00:09:34.118Z" }, - { url = "https://files.pythonhosted.org/packages/25/a3/f9f5907b166adb8f26762071474b38bbfcf89858a5282f032899075a38a1/cryptography-46.0.1-cp314-cp314t-win32.whl", hash = "sha256:504e464944f2c003a0785b81668fe23c06f3b037e9cb9f68a7c672246319f277", size = 3029705, upload_time = "2025-09-17T00:09:36.381Z" }, - { url = "https://files.pythonhosted.org/packages/12/66/4d3a4f1850db2e71c2b1628d14b70b5e4c1684a1bd462f7fffb93c041c38/cryptography-46.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c52fded6383f7e20eaf70a60aeddd796b3677c3ad2922c801be330db62778e05", size = 3502175, upload_time = "2025-09-17T00:09:38.261Z" }, - { url = "https://files.pythonhosted.org/packages/52/c7/9f10ad91435ef7d0d99a0b93c4360bea3df18050ff5b9038c489c31ac2f5/cryptography-46.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:9495d78f52c804b5ec8878b5b8c7873aa8e63db9cd9ee387ff2db3fffe4df784", size = 2912354, upload_time = "2025-09-17T00:09:40.078Z" }, - { url = "https://files.pythonhosted.org/packages/98/e5/fbd632385542a3311915976f88e0dfcf09e62a3fc0aff86fb6762162a24d/cryptography-46.0.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:d84c40bdb8674c29fa192373498b6cb1e84f882889d21a471b45d1f868d8d44b", size = 7255677, upload_time = "2025-09-17T00:09:42.407Z" }, - { url = "https://files.pythonhosted.org/packages/56/3e/13ce6eab9ad6eba1b15a7bd476f005a4c1b3f299f4c2f32b22408b0edccf/cryptography-46.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ed64e5083fa806709e74fc5ea067dfef9090e5b7a2320a49be3c9df3583a2d8", size = 4301110, upload_time = "2025-09-17T00:09:45.614Z" }, - { url = "https://files.pythonhosted.org/packages/a2/67/65dc233c1ddd688073cf7b136b06ff4b84bf517ba5529607c9d79720fc67/cryptography-46.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:341fb7a26bc9d6093c1b124b9f13acc283d2d51da440b98b55ab3f79f2522ead", size = 4562369, upload_time = "2025-09-17T00:09:47.601Z" }, - { url = "https://files.pythonhosted.org/packages/17/db/d64ae4c6f4e98c3dac5bf35dd4d103f4c7c345703e43560113e5e8e31b2b/cryptography-46.0.1-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6ef1488967e729948d424d09c94753d0167ce59afba8d0f6c07a22b629c557b2", size = 4302126, upload_time = "2025-09-17T00:09:49.335Z" }, - { url = "https://files.pythonhosted.org/packages/3d/19/5f1eea17d4805ebdc2e685b7b02800c4f63f3dd46cfa8d4c18373fea46c8/cryptography-46.0.1-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7823bc7cdf0b747ecfb096d004cc41573c2f5c7e3a29861603a2871b43d3ef32", size = 4009431, upload_time = "2025-09-17T00:09:51.239Z" }, - { url = "https://files.pythonhosted.org/packages/81/b5/229ba6088fe7abccbfe4c5edb96c7a5ad547fac5fdd0d40aa6ea540b2985/cryptography-46.0.1-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:f736ab8036796f5a119ff8211deda416f8c15ce03776db704a7a4e17381cb2ef", size = 4980739, upload_time = "2025-09-17T00:09:54.181Z" }, - { url = "https://files.pythonhosted.org/packages/3a/9c/50aa38907b201e74bc43c572f9603fa82b58e831bd13c245613a23cff736/cryptography-46.0.1-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e46710a240a41d594953012213ea8ca398cd2448fbc5d0f1be8160b5511104a0", size = 4592289, upload_time = "2025-09-17T00:09:56.731Z" }, - { url = "https://files.pythonhosted.org/packages/5a/33/229858f8a5bb22f82468bb285e9f4c44a31978d5f5830bb4ea1cf8a4e454/cryptography-46.0.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:84ef1f145de5aee82ea2447224dc23f065ff4cc5791bb3b506615957a6ba8128", size = 4301815, upload_time = "2025-09-17T00:09:58.548Z" }, - { url = "https://files.pythonhosted.org/packages/52/cb/b76b2c87fbd6ed4a231884bea3ce073406ba8e2dae9defad910d33cbf408/cryptography-46.0.1-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9394c7d5a7565ac5f7d9ba38b2617448eba384d7b107b262d63890079fad77ca", size = 4943251, upload_time = "2025-09-17T00:10:00.475Z" }, - { url = "https://files.pythonhosted.org/packages/94/0f/f66125ecf88e4cb5b8017ff43f3a87ede2d064cb54a1c5893f9da9d65093/cryptography-46.0.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ed957044e368ed295257ae3d212b95456bd9756df490e1ac4538857f67531fcc", size = 4591247, upload_time = "2025-09-17T00:10:02.874Z" }, - { url = "https://files.pythonhosted.org/packages/f6/22/9f3134ae436b63b463cfdf0ff506a0570da6873adb4bf8c19b8a5b4bac64/cryptography-46.0.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7de12fa0eee6234de9a9ce0ffcfa6ce97361db7a50b09b65c63ac58e5f22fc7", size = 4428534, upload_time = "2025-09-17T00:10:04.994Z" }, - { url = "https://files.pythonhosted.org/packages/89/39/e6042bcb2638650b0005c752c38ea830cbfbcbb1830e4d64d530000aa8dc/cryptography-46.0.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7fab1187b6c6b2f11a326f33b036f7168f5b996aedd0c059f9738915e4e8f53a", size = 4699541, upload_time = "2025-09-17T00:10:06.925Z" }, - { url = "https://files.pythonhosted.org/packages/68/46/753d457492d15458c7b5a653fc9a84a1c9c7a83af6ebdc94c3fc373ca6e8/cryptography-46.0.1-cp38-abi3-win32.whl", hash = "sha256:45f790934ac1018adeba46a0f7289b2b8fe76ba774a88c7f1922213a56c98bc1", size = 3043779, upload_time = "2025-09-17T00:10:08.951Z" }, - { url = "https://files.pythonhosted.org/packages/2f/50/b6f3b540c2f6ee712feeb5fa780bb11fad76634e71334718568e7695cb55/cryptography-46.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:7176a5ab56fac98d706921f6416a05e5aff7df0e4b91516f450f8627cda22af3", size = 3517226, upload_time = "2025-09-17T00:10:10.769Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e8/77d17d00981cdd27cc493e81e1749a0b8bbfb843780dbd841e30d7f50743/cryptography-46.0.1-cp38-abi3-win_arm64.whl", hash = "sha256:efc9e51c3e595267ff84adf56e9b357db89ab2279d7e375ffcaf8f678606f3d9", size = 2923149, upload_time = "2025-09-17T00:10:13.236Z" }, -] - -[[package]] -name = "csscompressor" -version = "0.9.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload_time = "2017-11-26T21:13:08.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +] [[package]] name = "cssselect2" @@ -458,111 +352,63 @@ dependencies = [ { name = "tinycss2" }, { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload_time = "2025-03-05T14:46:07.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload_time = "2025-03-05T14:46:06.463Z" }, -] - -[[package]] -name = "debugpy" -version = "1.8.17" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129, upload_time = "2025-09-17T16:33:20.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522, upload_time = "2025-09-17T16:33:38.466Z" }, - { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417, upload_time = "2025-09-17T16:33:41.299Z" }, - { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130, upload_time = "2025-09-17T16:33:43.554Z" }, - { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053, upload_time = "2025-09-17T16:33:53.033Z" }, - { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386, upload_time = "2025-09-17T16:33:54.594Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100, upload_time = "2025-09-17T16:33:56.353Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002, upload_time = "2025-09-17T16:33:58.231Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047, upload_time = "2025-09-17T16:34:00.586Z" }, - { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899, upload_time = "2025-09-17T16:34:02.657Z" }, - { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254, upload_time = "2025-09-17T16:34:04.486Z" }, - { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203, upload_time = "2025-09-17T16:34:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493, upload_time = "2025-09-17T16:34:08.483Z" }, - { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210, upload_time = "2025-09-17T16:34:25.835Z" }, -] - -[[package]] -name = "decorator" -version = "5.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload_time = "2021-03-08T10:59:26.269Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload_time = "2021-03-08T10:59:24.45Z" }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] [[package]] name = "diskcache" version = "5.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload_time = "2023-08-31T06:12:00.316Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload-time = "2023-08-31T06:12:00.316Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload_time = "2023-08-31T06:11:58.822Z" }, + { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload-time = "2023-08-31T06:11:58.822Z" }, ] [[package]] name = "distlib" version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload_time = "2025-07-17T16:52:00.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload_time = "2025-07-17T16:51:58.613Z" }, + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] [[package]] name = "et-xmlfile" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload_time = "2024-10-25T17:25:40.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload_time = "2024-10-25T17:25:39.051Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload-time = "2024-04-08T09:04:19.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, -] - -[[package]] -name = "executing" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload_time = "2025-09-01T09:48:10.866Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload_time = "2025-09-01T09:48:08.5Z" }, -] - -[[package]] -name = "fastjsonschema" -version = "2.21.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload_time = "2025-08-14T18:49:36.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload_time = "2025-08-14T18:49:34.776Z" }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" }, ] [[package]] name = "filelock" version = "3.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload_time = "2025-08-14T16:56:03.016Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload_time = "2025-08-14T16:56:01.633Z" }, + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, ] [[package]] @@ -572,9 +418,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload_time = "2024-03-09T03:21:07.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload-time = "2024-03-09T03:21:07.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload_time = "2024-03-09T03:21:05.635Z" }, + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload-time = "2024-03-09T03:21:05.635Z" }, ] [[package]] @@ -584,9 +430,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload_time = "2024-11-07T02:00:56.249Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload-time = "2024-11-07T02:00:56.249Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload_time = "2024-11-07T02:00:54.523Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload-time = "2024-11-07T02:00:54.523Z" }, ] [[package]] @@ -614,20 +460,20 @@ dependencies = [ { name = "typing-extensions" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload_time = "2025-03-25T21:32:50.081Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload-time = "2025-03-25T21:32:50.081Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload_time = "2025-03-25T21:32:45.534Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload-time = "2025-03-25T21:32:45.534Z" }, ] [[package]] name = "frozendict" version = "2.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload_time = "2024-10-13T12:15:32.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload-time = "2024-10-13T12:15:32.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload_time = "2024-10-13T12:15:26.839Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload_time = "2024-10-13T12:15:28.16Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload_time = "2024-10-13T12:15:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload-time = "2024-10-13T12:15:26.839Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload-time = "2024-10-13T12:15:28.16Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload-time = "2024-10-13T12:15:29.495Z" }, ] [[package]] @@ -637,9 +483,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload_time = "2022-05-02T15:47:16.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload_time = "2022-05-02T15:47:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] [[package]] @@ -649,9 +495,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, ] [[package]] @@ -661,9 +507,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload_time = "2025-07-24T03:45:54.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload_time = "2025-07-24T03:45:52.517Z" }, + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, ] [[package]] @@ -673,24 +519,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload_time = "2025-09-05T15:02:29.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload-time = "2025-09-05T15:02:29.167Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload_time = "2025-09-05T15:02:27.511Z" }, -] - -[[package]] -name = "gurobipy" -version = "12.0.3" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/bb/b3784497115c64c2bd122cc9d411f167026d4ec42a26b1ff3c43a779275d/gurobipy-12.0.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:020f23277f630e079eac114385eabd1bd9fb4ac22f8796ed5ba6d915ce4f141b", size = 12222234, upload_time = "2025-07-15T07:19:24.64Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/c065984de5287c99fd30ee8d700fd78f83692e992471f9667ab5d36612b9/gurobipy-12.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:72bbf544bc05060bb93909b79715ace4c0f416198f7622a985cabb9e8e99aa1c", size = 62583866, upload_time = "2025-07-15T07:20:17.576Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8b/2b9f26e4e19a258229b8a8ffc377ca372cc2059a22a0a7c67572efe308d8/gurobipy-12.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3f971caf270f671b6ffcf5b937b3c0430a5264b0f01529dc8681d61c221f215", size = 14268480, upload_time = "2025-07-15T07:20:26.898Z" }, - { url = "https://files.pythonhosted.org/packages/26/0f/3544a323635f37cdfe1e011d2903b7ef94ba18e10224fa1419f64d0c1968/gurobipy-12.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:af18fd03d5dc3f6e5f590c372ad288b8430a6d88a5b5e66cfcd8432f86ee8650", size = 11121565, upload_time = "2025-07-15T07:20:34.576Z" }, - { url = "https://files.pythonhosted.org/packages/5e/95/f0e5b5cf85298f42482cf4e53d8114c45bb962f55195d531fe4e62b5afa1/gurobipy-12.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a8552e47673cb6f1fd351edf8fcad86b02f832cbfb57d90ef21e0397e96d138e", size = 12183439, upload_time = "2025-07-15T07:20:44.224Z" }, - { url = "https://files.pythonhosted.org/packages/61/6e/aea725b4143faa4eb6878414a91fa74e7871aba0ab9453803a9eeef781c2/gurobipy-12.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:be05c074141c8a126c8aaeccc41795ab091a666eabb39ca1ff98a74bde81e663", size = 62583451, upload_time = "2025-07-15T07:21:38.825Z" }, - { url = "https://files.pythonhosted.org/packages/75/47/7b9c63ce2cd85d796403b91a6d211d5c8baac7b694edd94e2151f365d6a9/gurobipy-12.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:79a333766e27fef7902ceeefbcf0279a1ca393a27a72ea62f8e301b21aa17d59", size = 14271076, upload_time = "2025-07-15T07:21:55.102Z" }, - { url = "https://files.pythonhosted.org/packages/2a/93/b10cd6112c05675fed5c817fd7933c9d4ba3a7039e42cba844a9ac09242a/gurobipy-12.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:e0f9ed55077e622021369bb9df2ca3b00c86b678792a3b1556cc59f67348fab0", size = 11111414, upload_time = "2025-07-15T07:22:05.079Z" }, + { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload-time = "2025-09-05T15:02:27.511Z" }, ] [[package]] @@ -702,9 +533,9 @@ dependencies = [ { name = "libhxl" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/5621c48b79a510a87288495f4bdde38a292f0f97dd14177e2cc77c8a79bb/hdx_python_country-3.9.8.tar.gz", hash = "sha256:de9d928e490490fe6fa2d743597464fa8bae317f808667a947e734c1ea26e4d9", size = 531031, upload_time = "2025-09-21T23:42:45.054Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/5621c48b79a510a87288495f4bdde38a292f0f97dd14177e2cc77c8a79bb/hdx_python_country-3.9.8.tar.gz", hash = "sha256:de9d928e490490fe6fa2d743597464fa8bae317f808667a947e734c1ea26e4d9", size = 531031, upload-time = "2025-09-21T23:42:45.054Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/8f/7d961e17372bb9df875e988432a2abb9ca4883b4a0592dfccefa50cb697f/hdx_python_country-3.9.8-py3-none-any.whl", hash = "sha256:602e495028e474e2f93094136007b2c0e765d88af55b2cae7e0ba778e178bcaf", size = 56383, upload_time = "2025-09-21T23:42:43.267Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8f/7d961e17372bb9df875e988432a2abb9ca4883b4a0592dfccefa50cb697f/hdx_python_country-3.9.8-py3-none-any.whl", hash = "sha256:602e495028e474e2f93094136007b2c0e765d88af55b2cae7e0ba778e178bcaf", size = 56383, upload-time = "2025-09-21T23:42:43.267Z" }, ] [[package]] @@ -727,116 +558,77 @@ dependencies = [ { name = "xlsx2csv" }, { name = "xlwt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/13/f22d36f9146beaefe27b1a888acd31ddd09c1a9730ed1d42df9af33f99e2/hdx_python_utilities-3.9.2.tar.gz", hash = "sha256:de39248afdca00ab636fdfa0c3259fa80e4b95dba026170a4efc5bee14eda3f3", size = 656826, upload_time = "2025-09-21T23:14:17.457Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/13/f22d36f9146beaefe27b1a888acd31ddd09c1a9730ed1d42df9af33f99e2/hdx_python_utilities-3.9.2.tar.gz", hash = "sha256:de39248afdca00ab636fdfa0c3259fa80e4b95dba026170a4efc5bee14eda3f3", size = 656826, upload-time = "2025-09-21T23:14:17.457Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/6d/06994f86c2cc172b5ea127dedbb19e809205e06b1ba7532e2f0aea5631cd/hdx_python_utilities-3.9.2-py3-none-any.whl", hash = "sha256:fae3cc241420ae7ebb0a7a53cc8034c6851886396b2f0880685aba9045973111", size = 61187, upload_time = "2025-09-21T23:14:15.588Z" }, -] - -[[package]] -name = "highspy" -version = "1.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/aa1325331c320598ce60cc31060087681cd05123b6fb2a8a571e882b7f05/highspy-1.11.0.tar.gz", hash = "sha256:771e58c076122d207ff1b19759c21d3227f0da5b80dfd89a4145681524969cef", size = 1285415, upload_time = "2025-06-06T00:47:22.562Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/ad/b54ad6740b950faab3b7f1465fbb5c740fc522928a8d9f01cac181f8f9a6/highspy-1.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28fffd3e733833a7b2569df6761088046e8aca868ab328828711dbe15b102ad4", size = 2232856, upload_time = "2025-06-06T00:46:11.161Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0c/3921a207f47d52abc81a9d00d8f4d579b05b85670e23bc7140e39268490d/highspy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20a3adf8820a5f7a9cee6fc76df625e651ecfd8b5898af2a77042e79269ce0bc", size = 1908641, upload_time = "2025-06-06T00:46:12.706Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/ea7ea6c4c3f781b007fe928b2aefa40c49287b4689985d04c3b20d383475/highspy-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d4bc0a84cf613bb8565f9b5f610eb0655384162f509b5d86f9c888570275fdc", size = 2119574, upload_time = "2025-06-06T00:46:14.261Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0c/94f1ccb6606e8445a7a0c68d983e47f64899582c64fcea651f488eaaaea0/highspy-1.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:543789b75c396a904cb550de34eb333f1a184e123dadc9903b5e6dbca18a007b", size = 2441487, upload_time = "2025-06-06T00:46:16.286Z" }, - { url = "https://files.pythonhosted.org/packages/ad/aa/e7c4ac05162187c484bb121f50d8e037c13bf894ed5cf4e781e1cff68762/highspy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23949e4f44b6df0ed8c387a7c733d683a0fa66e3ff15d65719979ce2099ee99", size = 2302302, upload_time = "2025-06-06T00:46:18.819Z" }, - { url = "https://files.pythonhosted.org/packages/04/ce/fd2473bed635eb06d116f987767d5c5fe3c62b317fb1a788c31966d7fa0a/highspy-1.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:50dacf300ebe7c4dca92891c0bf61b694f2ca744207cf7d0d24f2a30ffb5608c", size = 3101885, upload_time = "2025-06-06T00:46:20.774Z" }, - { url = "https://files.pythonhosted.org/packages/6e/e1/bf174389656de5d302ed53dd5cdeb5f7e9ad84156ad2fc95d5a63ba023f2/highspy-1.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a782c242b4b047f86110787b0dafce9d77cc10f079adab1fd51c5331e5760127", size = 3647952, upload_time = "2025-06-06T00:46:22.847Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f5/42f6f2ce99c5b9d7aa864ac3abeaf8a2b66da707821ab42b0a31ec2a0dc1/highspy-1.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15b804387089a389e5f01b056a4b3ad74c7d1cf00ab00a0faaf3b4a582bb664c", size = 3309616, upload_time = "2025-06-06T00:46:24.888Z" }, - { url = "https://files.pythonhosted.org/packages/47/f5/cf13640ed65ea934b45e0c3e786497f4696f286faf45e8e62579a0f15462/highspy-1.11.0-cp312-cp312-win32.whl", hash = "sha256:8c33f68df8ab9666d379b0d64d04775c0a9db31882d4f87b3ec8cece0003b47d", size = 1710641, upload_time = "2025-06-06T00:46:26.462Z" }, - { url = "https://files.pythonhosted.org/packages/b7/2f/7acfea5b8d32b86bdec018f858bc195236b804a22a7cd3349da711498692/highspy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0aed8c80d33e2fc2eb1def75dbd34c9fa463acb589d19a5ed5dcc0178ae7062", size = 1985767, upload_time = "2025-06-06T00:46:28.144Z" }, - { url = "https://files.pythonhosted.org/packages/96/84/3e899c5d95dc9d5400a308e0aaf4a5143f69016a4f46dd528ff7cd65d341/highspy-1.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f675cda73860c7c8a22546db3c80db985720baea84866b08a971cfa03cc7a156", size = 2232867, upload_time = "2025-06-06T00:46:29.651Z" }, - { url = "https://files.pythonhosted.org/packages/74/e2/2853095a74e9fc2c2081340647be8edba7122696534ebbaf159ceb53f9b4/highspy-1.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7babebfc01b7682c69c95e0520614ec9400e10cec1b84d3fb7cd48535c606244", size = 1908601, upload_time = "2025-06-06T00:46:31.232Z" }, - { url = "https://files.pythonhosted.org/packages/e6/36/3cabdd3ae8610912962bad96f4d4d6702255d6c01d050754e4050a9eaa4a/highspy-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39fb60d84d7a58e58f923ea6f0641e6978eb9049033b84de1a2add723e01cd3f", size = 2119726, upload_time = "2025-06-06T00:46:32.796Z" }, - { url = "https://files.pythonhosted.org/packages/a9/da/200d3f13ca9ad3f9fc11a1f3f76cc2734de42dae064510365d42caeb5ed4/highspy-1.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c2e7cf4d504287cd8910de322a726d58428af43bb985d6bae602bf84a7454b9", size = 2441449, upload_time = "2025-06-06T00:46:35.147Z" }, - { url = "https://files.pythonhosted.org/packages/6c/58/fc3775850dc668006039637a4f23f03a9c0eb533643c9d3a7370f9d63de2/highspy-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79682aa7855d94106ccbbb750082d156dcbb57dff9d489f167320ae0ce768867", size = 2302685, upload_time = "2025-06-06T00:46:36.791Z" }, - { url = "https://files.pythonhosted.org/packages/b5/16/e13326a9706c407d32e39ad14aa79a696c1eb49bb13d50fde5d96afb02b5/highspy-1.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:65232aa496fb27be56cc85b2c7c785fac866107c32ea00cc38ec474d6a9f6494", size = 3102306, upload_time = "2025-06-06T00:46:38.341Z" }, - { url = "https://files.pythonhosted.org/packages/0e/93/468e63b16d9bf123174e7f8f7b8bd5a2f96b18d7370a2cc35e6485871749/highspy-1.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f78f27e18275d3c7868dcd0314ea535ed361322e7f0817363872d75a4cc15abc", size = 3648234, upload_time = "2025-06-06T00:46:40.895Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c5/37b849a69c9cbccf533a9a51e309a49e83d704f06bf45370c2e78ceb15d4/highspy-1.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6156a7d643268456427b6fe310626ad9ee9d908ff812cc64ee8bad7b9872ea98", size = 3309724, upload_time = "2025-06-06T00:46:43.083Z" }, - { url = "https://files.pythonhosted.org/packages/90/0f/89c579b2f718dc419fd76067a03ecb3c96e6919b7cffee1b9f5a2dfe4f56/highspy-1.11.0-cp313-cp313-win32.whl", hash = "sha256:e61facebb0127eb3661db79a11c7665e47229ec63d2b425996d04aeede26d46b", size = 1710676, upload_time = "2025-06-06T00:46:45.132Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/ba2af91f2418bee0d0e99df71dcd171ca863675de6a5260bbf06c120f084/highspy-1.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ceac08be37f75dc0af95669a0cfb073e5db5f07ead05cdcc81fd4b4394708d53", size = 1985967, upload_time = "2025-06-06T00:46:46.767Z" }, -] - -[[package]] -name = "htmlmin2" -version = "0.1.13" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/31/a76f4bfa885f93b8167cb4c85cf32b54d1f64384d0b897d45bc6d19b7b45/htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2", size = 34486, upload_time = "2023-03-14T21:28:30.388Z" }, + { url = "https://files.pythonhosted.org/packages/95/6d/06994f86c2cc172b5ea127dedbb19e809205e06b1ba7532e2f0aea5631cd/hdx_python_utilities-3.9.2-py3-none-any.whl", hash = "sha256:fae3cc241420ae7ebb0a7a53cc8034c6851886396b2f0880685aba9045973111", size = 61187, upload-time = "2025-09-21T23:14:15.588Z" }, ] [[package]] name = "humanize" version = "4.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884, upload_time = "2025-08-25T09:39:20.04Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884, upload-time = "2025-08-25T09:39:20.04Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869, upload_time = "2025-08-25T09:39:18.54Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869, upload-time = "2025-08-25T09:39:18.54Z" }, ] [[package]] name = "identify" version = "2.6.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload_time = "2025-09-06T19:30:52.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload-time = "2025-09-06T19:30:52.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload_time = "2025-09-06T19:30:51.759Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload-time = "2025-09-06T19:30:51.759Z" }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "ijson" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload_time = "2025-05-08T02:37:20.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload_time = "2025-05-08T02:35:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload_time = "2025-05-08T02:35:52.988Z" }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload_time = "2025-05-08T02:35:54.394Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload_time = "2025-05-08T02:35:55.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload_time = "2025-05-08T02:35:56.814Z" }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload_time = "2025-05-08T02:35:58.595Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload_time = "2025-05-08T02:36:00.197Z" }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload_time = "2025-05-08T02:36:01.998Z" }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload_time = "2025-05-08T02:36:03.926Z" }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload_time = "2025-05-08T02:36:05.595Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload_time = "2025-05-08T02:36:07.099Z" }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload_time = "2025-05-08T02:36:08.414Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload_time = "2025-05-08T02:36:09.604Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload_time = "2025-05-08T02:36:10.696Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload_time = "2025-05-08T02:36:11.916Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload_time = "2025-05-08T02:36:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload_time = "2025-05-08T02:36:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload_time = "2025-05-08T02:36:16.476Z" }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload_time = "2025-05-08T02:36:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload_time = "2025-05-08T02:36:19.483Z" }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload_time = "2025-05-08T02:36:20.99Z" }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload_time = "2025-05-08T02:36:22.075Z" }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload_time = "2025-05-08T02:36:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload_time = "2025-05-08T02:36:24.42Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload_time = "2025-05-08T02:36:26.708Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload_time = "2025-05-08T02:36:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload_time = "2025-05-08T02:36:29.496Z" }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload_time = "2025-05-08T02:36:30.981Z" }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload_time = "2025-05-08T02:36:32.403Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload_time = "2025-05-08T02:36:33.861Z" }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload_time = "2025-05-08T02:36:35.348Z" }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload_time = "2025-05-08T02:36:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload_time = "2025-05-08T02:36:37.849Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload-time = "2025-05-08T02:37:20.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload-time = "2025-05-08T02:35:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload-time = "2025-05-08T02:35:52.988Z" }, + { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload-time = "2025-05-08T02:35:54.394Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload-time = "2025-05-08T02:35:55.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload-time = "2025-05-08T02:35:56.814Z" }, + { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload-time = "2025-05-08T02:35:58.595Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload-time = "2025-05-08T02:36:00.197Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload-time = "2025-05-08T02:36:01.998Z" }, + { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload-time = "2025-05-08T02:36:03.926Z" }, + { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload-time = "2025-05-08T02:36:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload-time = "2025-05-08T02:36:07.099Z" }, + { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload-time = "2025-05-08T02:36:08.414Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload-time = "2025-05-08T02:36:09.604Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload-time = "2025-05-08T02:36:10.696Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload-time = "2025-05-08T02:36:11.916Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload-time = "2025-05-08T02:36:13.532Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload-time = "2025-05-08T02:36:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload-time = "2025-05-08T02:36:16.476Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload-time = "2025-05-08T02:36:18.044Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload-time = "2025-05-08T02:36:19.483Z" }, + { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload-time = "2025-05-08T02:36:20.99Z" }, + { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload-time = "2025-05-08T02:36:22.075Z" }, + { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload-time = "2025-05-08T02:36:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload-time = "2025-05-08T02:36:24.42Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload-time = "2025-05-08T02:36:26.708Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload-time = "2025-05-08T02:36:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload-time = "2025-05-08T02:36:29.496Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload-time = "2025-05-08T02:36:30.981Z" }, + { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload-time = "2025-05-08T02:36:32.403Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload-time = "2025-05-08T02:36:33.861Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload-time = "2025-05-08T02:36:35.348Z" }, + { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload-time = "2025-05-08T02:36:36.608Z" }, + { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload-time = "2025-05-08T02:36:37.849Z" }, ] [[package]] @@ -850,96 +642,27 @@ dependencies = [ { name = "pandas" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/5a/c8bc268ae5b6dbab4db01d92f9d34713a7c487bc85f2522173cf24bc5c74/imf_reader-1.4.1.tar.gz", hash = "sha256:2584e45485b539cd2d15bf0a785e6ac5f29775c042d9d5f83c7af5d5f0947c0b", size = 13271, upload_time = "2025-12-05T11:41:01.049Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/5a/c8bc268ae5b6dbab4db01d92f9d34713a7c487bc85f2522173cf24bc5c74/imf_reader-1.4.1.tar.gz", hash = "sha256:2584e45485b539cd2d15bf0a785e6ac5f29775c042d9d5f83c7af5d5f0947c0b", size = 13271, upload-time = "2025-12-05T11:41:01.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/79/97bd7b6c3af609b33ba2d787ea9e06ad93b1deca38388a345b6c913825ea/imf_reader-1.4.1-py3-none-any.whl", hash = "sha256:16c0dafcbe0e6630e7d3adbccb81e828b3e971b79e3969b79fbd6772151165c5", size = 19285, upload_time = "2025-12-05T11:41:00.218Z" }, + { url = "https://files.pythonhosted.org/packages/c1/79/97bd7b6c3af609b33ba2d787ea9e06ad93b1deca38388a345b6c913825ea/imf_reader-1.4.1-py3-none-any.whl", hash = "sha256:16c0dafcbe0e6630e7d3adbccb81e828b3e971b79e3969b79fbd6772151165c5", size = 19285, upload-time = "2025-12-05T11:41:00.218Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, -] - -[[package]] -name = "ipykernel" -version = "6.30.1" -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/bb/76/11082e338e0daadc89c8ff866185de11daf67d181901038f9e139d109761/ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b", size = 166260, upload_time = "2025-08-04T15:47:35.018Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/c7/b445faca8deb954fe536abebff4ece5b097b923de482b26e78448c89d1dd/ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4", size = 117484, upload_time = "2025-08-04T15:47:32.622Z" }, -] - -[[package]] -name = "ipython" -version = "9.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "ipython-pygments-lexers" }, - { name = "jedi" }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137, upload_time = "2025-08-29T12:15:21.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2a/5628a99d04acb2d2f2e749cdf4ea571d2575e898df0528a090948018b726/ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72", size = 612426, upload_time = "2025-08-29T12:15:18.866Z" }, -] - -[[package]] -name = "ipython-pygments-lexers" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload_time = "2024-10-08T23:04:11.5Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload_time = "2024-10-08T23:04:09.501Z" }, -] - -[[package]] -name = "jedi" -version = "0.19.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "parso" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload_time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, ] [[package]] @@ -949,26 +672,20 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "joblib" version = "1.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload_time = "2025-08-27T12:15:46.575Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload_time = "2025-08-27T12:15:45.188Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, ] -[[package]] -name = "jsmin" -version = "3.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f4407a3f623ad4d87714909f50b17a06ed121034ff6e/jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc", size = 13925, upload_time = "2022-01-16T20:35:59.13Z" } - [[package]] name = "jsonlines" version = "4.0.0" @@ -976,9 +693,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload_time = "2023-09-01T12:34:44.187Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload-time = "2023-09-01T12:34:44.187Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload_time = "2023-09-01T12:34:42.563Z" }, + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload-time = "2023-09-01T12:34:42.563Z" }, ] [[package]] @@ -988,9 +705,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ply" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload_time = "2024-10-11T15:41:42.404Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload-time = "2024-10-11T15:41:42.404Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload_time = "2024-11-20T17:58:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload-time = "2024-11-20T17:58:30.418Z" }, ] [[package]] @@ -1003,9 +720,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload_time = "2025-08-18T17:03:50.038Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload_time = "2025-08-18T17:03:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, ] [[package]] @@ -1015,64 +732,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload_time = "2025-09-08T01:34:59.186Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload_time = "2025-09-08T01:34:57.871Z" }, -] - -[[package]] -name = "jupyter-client" -version = "8.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-core" }, - { name = "python-dateutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload_time = "2024-09-17T10:44:15.218Z" }, -] - -[[package]] -name = "jupyter-core" -version = "5.8.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "platformdirs" }, - { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload_time = "2025-05-27T07:38:16.655Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload_time = "2025-05-27T07:38:15.137Z" }, -] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload_time = "2023-11-23T09:26:37.44Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload_time = "2023-11-23T09:26:34.325Z" }, -] - -[[package]] -name = "jupytext" -version = "1.17.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "mdit-py-plugins" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/15/14/41faf71e168fcc6c48268f0fc67ba0d6acf6ee4e2c5c785c2bccb967c29d/jupytext-1.17.3.tar.gz", hash = "sha256:8b6dae76d63c95cad47b493c38f0d9c74491fb621dcd0980abfcac4c8f168679", size = 3753151, upload_time = "2025-08-28T18:30:51.117Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/86/751ec86adb66104d15e650b704f89dddd64ba29283178b9651b9bc84b624/jupytext-1.17.3-py3-none-any.whl", hash = "sha256:09b0a94cd904416e823a5ba9f41bd181031215b6fc682d2b5c18e68354feb17c", size = 166548, upload_time = "2025-08-28T18:30:47.733Z" }, + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] [[package]] @@ -1091,7 +753,7 @@ dependencies = [ { name = "wheel" }, { name = "xlrd3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload_time = "2024-10-25T09:19:11.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload-time = "2024-10-25T09:19:11.202Z" } [[package]] name = "license-expression" @@ -1100,9 +762,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload_time = "2025-07-22T11:13:32.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload-time = "2025-07-22T11:13:32.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload_time = "2025-07-22T11:13:31.217Z" }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload-time = "2025-07-22T11:13:31.217Z" }, ] [[package]] @@ -1113,98 +775,98 @@ dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload_time = "2024-12-06T11:20:56.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload_time = "2024-12-06T11:20:54.538Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, ] [[package]] name = "lxml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload_time = "2025-09-22T04:04:59.287Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload_time = "2025-09-22T04:01:17.265Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload_time = "2025-09-22T04:01:19.688Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload_time = "2025-09-22T04:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload_time = "2025-09-22T04:01:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload_time = "2025-09-22T04:01:25.118Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload_time = "2025-09-22T04:01:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload_time = "2025-09-22T04:01:29.629Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload_time = "2025-09-22T04:01:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload_time = "2025-09-22T04:01:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload_time = "2025-09-22T04:01:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload_time = "2025-09-22T04:01:37.448Z" }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload_time = "2025-09-22T04:01:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload_time = "2025-09-22T04:01:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload_time = "2025-09-22T04:01:43.363Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload_time = "2025-09-22T04:01:45.215Z" }, - { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload_time = "2025-09-22T04:01:48.243Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload_time = "2025-09-22T04:01:50.042Z" }, - { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload_time = "2025-09-22T04:01:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload_time = "2025-09-22T04:01:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload_time = "2025-09-22T04:01:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload_time = "2025-09-22T04:01:58.989Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload_time = "2025-09-22T04:02:00.812Z" }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload_time = "2025-09-22T04:02:02.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload_time = "2025-09-22T04:02:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload_time = "2025-09-22T04:02:06.689Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload_time = "2025-09-22T04:02:08.587Z" }, - { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload_time = "2025-09-22T04:02:10.783Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload_time = "2025-09-22T04:02:12.631Z" }, - { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload_time = "2025-09-22T04:02:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload_time = "2025-09-22T04:02:16.957Z" }, - { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload_time = "2025-09-22T04:02:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload_time = "2025-09-22T04:02:20.593Z" }, - { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload_time = "2025-09-22T04:02:22.489Z" }, - { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload_time = "2025-09-22T04:02:24.465Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload_time = "2025-09-22T04:02:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload_time = "2025-09-22T04:02:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload_time = "2025-09-22T04:02:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload_time = "2025-09-22T04:02:32.119Z" }, - { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload_time = "2025-09-22T04:02:34.155Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload_time = "2025-09-22T04:02:36.054Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload_time = "2025-09-22T04:02:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload_time = "2025-09-22T04:02:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload_time = "2025-09-22T04:02:42.288Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload_time = "2025-09-22T04:02:44.165Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload_time = "2025-09-22T04:02:46.524Z" }, - { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload_time = "2025-09-22T04:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload_time = "2025-09-22T04:02:50.746Z" }, - { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload_time = "2025-09-22T04:02:52.968Z" }, - { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload_time = "2025-09-22T04:02:54.798Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload_time = "2025-09-22T04:02:57.058Z" }, - { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload_time = "2025-09-22T04:02:58.966Z" }, - { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload_time = "2025-09-22T04:03:38.05Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload_time = "2025-09-22T04:03:39.835Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload_time = "2025-09-22T04:03:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload_time = "2025-09-22T04:03:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload_time = "2025-09-22T04:03:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload_time = "2025-09-22T04:03:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload_time = "2025-09-22T04:03:07.452Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload_time = "2025-09-22T04:03:09.297Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload_time = "2025-09-22T04:03:11.651Z" }, - { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload_time = "2025-09-22T04:03:13.592Z" }, - { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload_time = "2025-09-22T04:03:15.408Z" }, - { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload_time = "2025-09-22T04:03:17.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload_time = "2025-09-22T04:03:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload_time = "2025-09-22T04:03:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload_time = "2025-09-22T04:03:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload_time = "2025-09-22T04:03:25.767Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload_time = "2025-09-22T04:03:27.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload_time = "2025-09-22T04:03:30.056Z" }, - { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload_time = "2025-09-22T04:03:32.198Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload_time = "2025-09-22T04:03:34.027Z" }, - { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload_time = "2025-09-22T04:03:36.249Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, ] [[package]] name = "markdown" version = "3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload_time = "2025-09-04T20:25:22.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload_time = "2025-09-04T20:25:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, ] [[package]] @@ -1214,107 +876,74 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload_time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload_time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] name = "marko" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/6a/32545d2379822fb9a8843f01150011402888492541977a1193fe8d695df0/marko-2.2.0.tar.gz", hash = "sha256:213c146ba197c1d6bcb06ae3658b7d87e45f6def35c09905b86aa6bb1984eba6", size = 143406, upload_time = "2025-08-08T09:47:05.396Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/6a/32545d2379822fb9a8843f01150011402888492541977a1193fe8d695df0/marko-2.2.0.tar.gz", hash = "sha256:213c146ba197c1d6bcb06ae3658b7d87e45f6def35c09905b86aa6bb1984eba6", size = 143406, upload-time = "2025-08-08T09:47:05.396Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/b1/87f54d8842b2aafdbb162301ac730587e04f30ad0fe9aabb12fa29f7a6f7/marko-2.2.0-py3-none-any.whl", hash = "sha256:d84f867429142627e896322c8ef167664f3a6cd6ea5a2b70c6af055998041bb7", size = 42683, upload_time = "2025-08-08T09:47:04.175Z" }, + { url = "https://files.pythonhosted.org/packages/94/b1/87f54d8842b2aafdbb162301ac730587e04f30ad0fe9aabb12fa29f7a6f7/marko-2.2.0-py3-none-any.whl", hash = "sha256:d84f867429142627e896322c8ef167664f3a6cd6ea5a2b70c6af055998041bb7", size = 42683, upload-time = "2025-08-08T09:47:04.175Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, -] - -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, -] - -[[package]] -name = "mdit-py-plugins" -version = "0.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload_time = "2025-08-11T07:25:49.083Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload_time = "2025-08-11T07:25:47.597Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload_time = "2021-02-05T18:55:30.623Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload_time = "2021-02-05T18:55:29.583Z" }, -] - -[[package]] -name = "mistune" -version = "3.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload_time = "2025-08-29T07:20:43.594Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload_time = "2025-08-29T07:20:42.218Z" }, + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, ] [[package]] @@ -1336,9 +965,9 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload_time = "2024-08-30T12:24:06.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload_time = "2024-08-30T12:24:05.054Z" }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, ] [[package]] @@ -1348,9 +977,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012, upload_time = "2024-08-25T12:50:09.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/7c/fea9d842705ca8c9e7dd21da2d0b7b61dbdd8b6e58ca3c7c85b5604914e9/mkdocs_argref_plugin-0.5.0.tar.gz", hash = "sha256:b2982f9670419911f671ddff3f773b27fdc9184762ecd1e00c42aaab3e905e70", size = 7012, upload-time = "2024-08-25T12:50:09.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790, upload_time = "2024-08-25T12:50:08.151Z" }, + { url = "https://files.pythonhosted.org/packages/1e/eb/e7e7ea2f7e374e52fc8425d5cf67890be8278a6e620aa74775da2f1039f7/mkdocs_argref_plugin-0.5.0-py3-none-any.whl", hash = "sha256:6ec4be422bfb5654c38f96785b0093078c3ca3e16774162be607d6f8d483ceb9", size = 6790, upload-time = "2024-08-25T12:50:08.151Z" }, ] [[package]] @@ -1360,9 +989,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload_time = "2023-08-04T14:42:25.67Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/b7/efc75b7870a4fecbc9a05ba94ce622462a40b5a13670d00036c5b47bf82f/mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151", size = 4375, upload-time = "2023-08-04T14:42:25.67Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload_time = "2023-08-04T14:42:23.955Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9c/ee3d81a799b8b0b73a89625bcbf3c58cd369c8a26a1b415413edea9bf259/mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12", size = 4235, upload-time = "2023-08-04T14:42:23.955Z" }, ] [[package]] @@ -1374,21 +1003,11 @@ dependencies = [ { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload_time = "2025-08-26T14:23:17.223Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload_time = "2025-08-26T14:23:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" }, ] -[[package]] -name = "mkdocs-ezlinks-plugin" -version = "0.1.14" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mkdocs" }, - { name = "pygtrie" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9a/3b/490d1b51fba7da69394e5a17f2c081eb65a10fb73565dc6793d53e4e4206/mkdocs-ezlinks-plugin-0.1.14.tar.gz", hash = "sha256:3e2085c16a850e022393e80194c17612e7b55de87fb45b3ffb618b5dfdb10811", size = 13366, upload_time = "2022-01-24T20:10:30.91Z" } - [[package]] name = "mkdocs-get-deps" version = "0.2.0" @@ -1398,22 +1017,9 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload_time = "2023-11-20T17:51:09.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload_time = "2023-11-20T17:51:08.587Z" }, -] - -[[package]] -name = "mkdocs-git-committers-plugin" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mkdocs" }, - { name = "pygithub" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c6/88/e724563e9ff1b119869ef0704157caa8d7b9b9b4a8a8faf8120aa01620e2/mkdocs-git-committers-plugin-0.2.3.tar.gz", hash = "sha256:77188d8aacc11d5233d6949435670e3d6545ffb7a0e274d56f32ed3984353c61", size = 5379, upload_time = "2023-11-06T17:13:30.207Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/56/15fdbb6afa718a6c9de626bd11672040832ba547c03daf205e295be4e0d4/mkdocs_git_committers_plugin-0.2.3-py3-none-any.whl", hash = "sha256:4ca79efb7e61a72652d3512d61af5c40a4572e36667e1a00032aad524250780d", size = 4340, upload_time = "2023-11-06T17:13:28.979Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, ] [[package]] @@ -1426,26 +1032,9 @@ dependencies = [ { name = "mkdocs" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload_time = "2025-05-28T18:26:20.697Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload-time = "2025-05-28T18:26:20.697Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload_time = "2025-05-28T18:26:18.907Z" }, -] - -[[package]] -name = "mkdocs-jupyter" -version = "0.25.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "jupytext" }, - { name = "mkdocs" }, - { name = "mkdocs-material" }, - { name = "nbconvert" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747, upload_time = "2024-10-15T14:56:32.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197, upload_time = "2024-10-15T14:56:29.854Z" }, + { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload-time = "2025-05-28T18:26:18.907Z" }, ] [[package]] @@ -1466,57 +1055,18 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/ee/6ed7fc739bd7591485c8bec67d5984508d3f2733e708f32714c21593341a/mkdocs_material-9.6.20.tar.gz", hash = "sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790", size = 4037822, upload_time = "2025-09-15T08:48:01.816Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/ee/6ed7fc739bd7591485c8bec67d5984508d3f2733e708f32714c21593341a/mkdocs_material-9.6.20.tar.gz", hash = "sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790", size = 4037822, upload-time = "2025-09-15T08:48:01.816Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d8/a31dd52e657bf12b20574706d07df8d767e1ab4340f9bfb9ce73950e5e59/mkdocs_material-9.6.20-py3-none-any.whl", hash = "sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82", size = 9193367, upload_time = "2025-09-15T08:47:58.722Z" }, + { url = "https://files.pythonhosted.org/packages/67/d8/a31dd52e657bf12b20574706d07df8d767e1ab4340f9bfb9ce73950e5e59/mkdocs_material-9.6.20-py3-none-any.whl", hash = "sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82", size = 9193367, upload-time = "2025-09-15T08:47:58.722Z" }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload_time = "2023-11-22T19:09:45.208Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload_time = "2023-11-22T19:09:43.465Z" }, -] - -[[package]] -name = "mkdocs-minify-plugin" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "csscompressor" }, - { name = "htmlmin2" }, - { name = "jsmin" }, - { name = "mkdocs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/52/67/fe4b77e7a8ae7628392e28b14122588beaf6078b53eb91c7ed000fd158ac/mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d", size = 8366, upload_time = "2024-01-29T16:11:32.982Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/cd/2e8d0d92421916e2ea4ff97f10a544a9bd5588eb747556701c983581df13/mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6", size = 6723, upload_time = "2024-01-29T16:11:31.851Z" }, -] - -[[package]] -name = "mkdocs-open-in-new-tab" -version = "1.0.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mkdocs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/0e/f72a506a21bdb27b807124e00c688226848a388d1fd3980b80ae3cc27203/mkdocs_open_in_new_tab-1.0.8.tar.gz", hash = "sha256:3e0dad08cc9938b0b13097be8e0aa435919de1eeb2d1a648e66b5dee8d57e048", size = 5791, upload_time = "2024-11-18T13:15:13.977Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/94/44f3c868495481c868d08eea065c82803f1affd8553d3383b782f497613c/mkdocs_open_in_new_tab-1.0.8-py3-none-any.whl", hash = "sha256:051d767a4467b12d89827e1fea0ec660b05b027c726317fe4fceee5456e36ad2", size = 7717, upload_time = "2024-11-18T13:15:12.286Z" }, -] - -[[package]] -name = "mkdocs-redirects" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mkdocs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f1/a8/6d44a6cf07e969c7420cb36ab287b0669da636a2044de38a7d2208d5a758/mkdocs_redirects-1.2.2.tar.gz", hash = "sha256:3094981b42ffab29313c2c1b8ac3969861109f58b2dd58c45fc81cd44bfa0095", size = 7162, upload_time = "2024-11-07T14:57:21.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ec/38443b1f2a3821bbcb24e46cd8ba979154417794d54baf949fefde1c2146/mkdocs_redirects-1.2.2-py3-none-any.whl", hash = "sha256:7dbfa5647b79a3589da4401403d69494bd1f4ad03b9c15136720367e1f340ed5", size = 6142, upload_time = "2024-11-07T14:57:19.143Z" }, + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, ] [[package]] @@ -1529,9 +1079,9 @@ dependencies = [ { name = "pyyaml" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510, upload_time = "2024-08-29T14:08:09.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/ca35e4b51a1814924153f7c8afa5a9c2f961688a9c275fa9f4afe7f5083a/mkdocs_table_reader_plugin-3.1.0.tar.gz", hash = "sha256:eb15688ee8c0cd1a842f506f18973b87be22bd7baa5e2e551089de6b7f9ec25b", size = 12510, upload-time = "2024-08-29T14:08:09.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564, upload_time = "2024-08-29T14:08:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6f/dcc966874f74f8580b99d2ffecbdc85dfd00c4a5039fedbee4ddd7fc8c7f/mkdocs_table_reader_plugin-3.1.0-py3-none-any.whl", hash = "sha256:50a1302661c14d96b90ba0434ae96110441e0c653ce23559e3c6911fe79e7bd2", size = 10564, upload-time = "2024-08-29T14:08:07.367Z" }, ] [[package]] @@ -1542,9 +1092,9 @@ dependencies = [ { name = "lxml" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633, upload_time = "2023-03-17T17:36:43.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633, upload-time = "2023-03-17T17:36:43.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570, upload_time = "2023-03-17T17:36:40.776Z" }, + { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570, upload-time = "2023-03-17T17:36:40.776Z" }, ] [[package]] @@ -1559,9 +1109,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350, upload_time = "2025-09-19T10:49:26.446Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350, upload-time = "2025-09-19T10:49:26.446Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704, upload_time = "2025-09-19T10:49:24.805Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704, upload-time = "2025-09-19T10:49:24.805Z" }, ] [[package]] @@ -1573,9 +1123,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972, upload_time = "2025-08-28T16:11:19.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972, upload-time = "2025-08-28T16:11:19.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215, upload_time = "2025-08-28T16:11:18.176Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215, upload-time = "2025-08-28T16:11:18.176Z" }, ] [[package]] @@ -1587,181 +1137,108 @@ dependencies = [ { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload_time = "2025-09-19T00:11:10.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload_time = "2025-09-19T00:10:58.321Z" }, - { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload_time = "2025-09-19T00:10:20.043Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload_time = "2025-09-19T00:10:33.005Z" }, - { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload_time = "2025-09-19T00:10:11.51Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload_time = "2025-09-19T00:10:06.568Z" }, - { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload_time = "2025-09-19T00:10:28.203Z" }, - { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload_time = "2025-09-19T00:10:01.33Z" }, - { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload_time = "2025-09-19T00:10:42.607Z" }, - { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload_time = "2025-09-19T00:11:00.371Z" }, - { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload_time = "2025-09-19T00:11:03.358Z" }, - { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload_time = "2025-09-19T00:10:26.073Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload_time = "2025-09-19T00:10:40.035Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload_time = "2025-09-19T00:10:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload_time = "2025-09-19T00:10:51.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload_time = "2025-09-19T00:11:07.955Z" }, - { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload_time = "2025-09-19T00:09:55.572Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload_time = "2025-09-19T00:10:44.827Z" }, - { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload_time = "2025-09-19T00:10:37.344Z" }, - { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload_time = "2025-09-19T00:10:15.489Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" }, + { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" }, + { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" }, + { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" }, + { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" }, + { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" }, + { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" }, + { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, -] - -[[package]] -name = "nbclient" -version = "0.10.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "nbformat" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload_time = "2024-12-19T10:32:27.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload_time = "2024-12-19T10:32:24.139Z" }, -] - -[[package]] -name = "nbconvert" -version = "7.16.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "bleach", extra = ["css"] }, - { name = "defusedxml" }, - { name = "jinja2" }, - { name = "jupyter-core" }, - { name = "jupyterlab-pygments" }, - { name = "markupsafe" }, - { name = "mistune" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "pandocfilters" }, - { name = "pygments" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload_time = "2025-01-28T09:29:14.724Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload_time = "2025-01-28T09:29:12.551Z" }, -] - -[[package]] -name = "nbformat" -version = "5.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema" }, - { name = "jupyter-core" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload_time = "2024-04-04T11:20:37.371Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload_time = "2024-04-04T11:20:34.895Z" }, -] - -[[package]] -name = "nest-asyncio" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload_time = "2024-01-21T14:25:19.227Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload_time = "2024-01-21T14:25:17.223Z" }, -] - -[[package]] -name = "networkx" -version = "3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload_time = "2025-05-29T11:35:07.804Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload_time = "2025-05-29T11:35:04.961Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[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, upload_time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload_time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, ] [[package]] name = "numpy" version = "2.3.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload_time = "2025-09-09T16:54:12.543Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload_time = "2025-09-09T15:56:29.966Z" }, - { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload_time = "2025-09-09T15:56:32.175Z" }, - { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload_time = "2025-09-09T15:56:34.175Z" }, - { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload_time = "2025-09-09T15:56:36.149Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload_time = "2025-09-09T15:56:40.548Z" }, - { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload_time = "2025-09-09T15:56:43.343Z" }, - { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload_time = "2025-09-09T15:56:46.141Z" }, - { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload_time = "2025-09-09T15:56:49.844Z" }, - { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800, upload_time = "2025-09-09T15:56:52.499Z" }, - { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615, upload_time = "2025-09-09T15:56:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936, upload_time = "2025-09-09T15:56:56.541Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload_time = "2025-09-09T15:56:59.087Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload_time = "2025-09-09T15:57:01.73Z" }, - { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload_time = "2025-09-09T15:57:03.765Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload_time = "2025-09-09T15:57:07.921Z" }, - { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload_time = "2025-09-09T15:57:11.349Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload_time = "2025-09-09T15:57:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload_time = "2025-09-09T15:57:16.534Z" }, - { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload_time = "2025-09-09T15:57:18.883Z" }, - { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250, upload_time = "2025-09-09T15:57:21.296Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269, upload_time = "2025-09-09T15:57:23.034Z" }, - { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314, upload_time = "2025-09-09T15:57:25.045Z" }, - { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload_time = "2025-09-09T15:57:27.257Z" }, - { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload_time = "2025-09-09T15:57:30.077Z" }, - { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload_time = "2025-09-09T15:57:32.733Z" }, - { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload_time = "2025-09-09T15:57:34.328Z" }, - { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload_time = "2025-09-09T15:57:36.255Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload_time = "2025-09-09T15:57:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload_time = "2025-09-09T15:57:41.16Z" }, - { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload_time = "2025-09-09T15:57:43.459Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776, upload_time = "2025-09-09T15:57:45.793Z" }, - { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281, upload_time = "2025-09-09T15:57:47.492Z" }, - { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275, upload_time = "2025-09-09T15:57:49.647Z" }, - { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload_time = "2025-09-09T15:57:52.006Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload_time = "2025-09-09T15:57:54.407Z" }, - { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload_time = "2025-09-09T15:57:56.5Z" }, - { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload_time = "2025-09-09T15:57:58.206Z" }, - { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload_time = "2025-09-09T15:58:00.035Z" }, - { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload_time = "2025-09-09T15:58:02.738Z" }, - { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload_time = "2025-09-09T15:58:05.029Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload_time = "2025-09-09T15:58:07.745Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload_time = "2025-09-09T15:58:10.096Z" }, - { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload_time = "2025-09-09T15:58:12.138Z" }, - { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload_time = "2025-09-09T15:58:14.64Z" }, - { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload_time = "2025-09-09T15:58:16.889Z" }, - { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload_time = "2025-09-09T15:58:20.343Z" }, - { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload_time = "2025-09-09T15:58:22.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload_time = "2025-09-09T15:58:24.569Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload_time = "2025-09-09T15:58:26.416Z" }, - { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload_time = "2025-09-09T15:58:28.831Z" }, - { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload_time = "2025-09-09T15:58:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload_time = "2025-09-09T15:58:33.762Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload_time = "2025-09-09T15:58:36.04Z" }, - { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload_time = "2025-09-09T15:58:37.927Z" }, - { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload_time = "2025-09-09T15:58:40.576Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload-time = "2025-09-09T15:56:29.966Z" }, + { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload-time = "2025-09-09T15:56:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload-time = "2025-09-09T15:56:34.175Z" }, + { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload-time = "2025-09-09T15:56:36.149Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload-time = "2025-09-09T15:56:40.548Z" }, + { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload-time = "2025-09-09T15:56:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload-time = "2025-09-09T15:56:46.141Z" }, + { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload-time = "2025-09-09T15:56:49.844Z" }, + { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800, upload-time = "2025-09-09T15:56:52.499Z" }, + { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615, upload-time = "2025-09-09T15:56:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936, upload-time = "2025-09-09T15:56:56.541Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload-time = "2025-09-09T15:56:59.087Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload-time = "2025-09-09T15:57:01.73Z" }, + { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload-time = "2025-09-09T15:57:03.765Z" }, + { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload-time = "2025-09-09T15:57:07.921Z" }, + { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload-time = "2025-09-09T15:57:11.349Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload-time = "2025-09-09T15:57:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload-time = "2025-09-09T15:57:16.534Z" }, + { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload-time = "2025-09-09T15:57:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250, upload-time = "2025-09-09T15:57:21.296Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269, upload-time = "2025-09-09T15:57:23.034Z" }, + { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314, upload-time = "2025-09-09T15:57:25.045Z" }, + { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload-time = "2025-09-09T15:57:27.257Z" }, + { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload-time = "2025-09-09T15:57:30.077Z" }, + { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload-time = "2025-09-09T15:57:32.733Z" }, + { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload-time = "2025-09-09T15:57:34.328Z" }, + { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload-time = "2025-09-09T15:57:36.255Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload-time = "2025-09-09T15:57:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload-time = "2025-09-09T15:57:41.16Z" }, + { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload-time = "2025-09-09T15:57:43.459Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776, upload-time = "2025-09-09T15:57:45.793Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281, upload-time = "2025-09-09T15:57:47.492Z" }, + { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275, upload-time = "2025-09-09T15:57:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload-time = "2025-09-09T15:57:52.006Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload-time = "2025-09-09T15:57:54.407Z" }, + { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload-time = "2025-09-09T15:57:56.5Z" }, + { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload-time = "2025-09-09T15:57:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload-time = "2025-09-09T15:58:00.035Z" }, + { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload-time = "2025-09-09T15:58:02.738Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload-time = "2025-09-09T15:58:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload-time = "2025-09-09T15:58:07.745Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload-time = "2025-09-09T15:58:10.096Z" }, + { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload-time = "2025-09-09T15:58:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload-time = "2025-09-09T15:58:14.64Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload-time = "2025-09-09T15:58:16.889Z" }, + { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload-time = "2025-09-09T15:58:20.343Z" }, + { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload-time = "2025-09-09T15:58:22.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload-time = "2025-09-09T15:58:24.569Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload-time = "2025-09-09T15:58:26.416Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload-time = "2025-09-09T15:58:28.831Z" }, + { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload-time = "2025-09-09T15:58:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload-time = "2025-09-09T15:58:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload-time = "2025-09-09T15:58:36.04Z" }, + { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload-time = "2025-09-09T15:58:37.927Z" }, + { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload-time = "2025-09-09T15:58:40.576Z" }, ] [[package]] @@ -1778,9 +1255,9 @@ dependencies = [ { name = "requests" }, { name = "requests-cache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/b9/4ac1d7304001bf702d4835beeea0ef3a6fb60c8034ecb047c3141b2624ba/oda_reader-1.3.1.tar.gz", hash = "sha256:2201595bffbe72f7719e0f362db36a0a40968be252adefbe932f2fd284f5cf17", size = 43135, upload_time = "2025-10-27T14:10:45.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/32/b9/4ac1d7304001bf702d4835beeea0ef3a6fb60c8034ecb047c3141b2624ba/oda_reader-1.3.1.tar.gz", hash = "sha256:2201595bffbe72f7719e0f362db36a0a40968be252adefbe932f2fd284f5cf17", size = 43135, upload-time = "2025-10-27T14:10:45.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e8/abbd6b6fb8678adc0d83d0c537a55e84b1798fd3322d3e6edc9acc7a9dd8/oda_reader-1.3.1-py3-none-any.whl", hash = "sha256:57c8fbe5dda303689fb538f01fb0735e34f733547ccc24665f2632a67b93814d", size = 59216, upload_time = "2025-10-27T14:10:44.832Z" }, + { url = "https://files.pythonhosted.org/packages/55/e8/abbd6b6fb8678adc0d83d0c537a55e84b1798fd3322d3e6edc9acc7a9dd8/oda_reader-1.3.1-py3-none-any.whl", hash = "sha256:57c8fbe5dda303689fb538f01fb0735e34f733547ccc24665f2632a67b93814d", size = 59216, upload-time = "2025-10-27T14:10:44.832Z" }, ] [[package]] @@ -1790,27 +1267,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "et-xmlfile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload_time = "2024-06-28T14:03:44.161Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload_time = "2024-06-28T14:03:41.161Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "paginate" version = "0.5.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload_time = "2024-08-25T14:17:24.139Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload_time = "2024-08-25T14:17:22.55Z" }, + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, ] [[package]] @@ -1823,28 +1300,28 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684, upload_time = "2025-08-21T10:28:29.257Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652, upload_time = "2025-08-21T10:27:15.888Z" }, - { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686, upload_time = "2025-08-21T10:27:18.486Z" }, - { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722, upload_time = "2025-08-21T10:27:21.149Z" }, - { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803, upload_time = "2025-08-21T10:27:23.767Z" }, - { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345, upload_time = "2025-08-21T10:27:26.6Z" }, - { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314, upload_time = "2025-08-21T10:27:29.213Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326, upload_time = "2025-08-21T10:27:31.901Z" }, - { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061, upload_time = "2025-08-21T10:27:34.647Z" }, - { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666, upload_time = "2025-08-21T10:27:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835, upload_time = "2025-08-21T10:27:40.188Z" }, - { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211, upload_time = "2025-08-21T10:27:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277, upload_time = "2025-08-21T10:27:45.474Z" }, - { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256, upload_time = "2025-08-21T10:27:49.885Z" }, - { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579, upload_time = "2025-08-21T10:28:08.435Z" }, - { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163, upload_time = "2025-08-21T10:27:52.232Z" }, - { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860, upload_time = "2025-08-21T10:27:54.673Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830, upload_time = "2025-08-21T10:27:56.957Z" }, - { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216, upload_time = "2025-08-21T10:27:59.302Z" }, - { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743, upload_time = "2025-08-21T10:28:02.447Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload_time = "2025-08-21T10:28:05.377Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684, upload-time = "2025-08-21T10:28:29.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652, upload-time = "2025-08-21T10:27:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686, upload-time = "2025-08-21T10:27:18.486Z" }, + { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722, upload-time = "2025-08-21T10:27:21.149Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803, upload-time = "2025-08-21T10:27:23.767Z" }, + { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345, upload-time = "2025-08-21T10:27:26.6Z" }, + { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314, upload-time = "2025-08-21T10:27:29.213Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326, upload-time = "2025-08-21T10:27:31.901Z" }, + { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061, upload-time = "2025-08-21T10:27:34.647Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666, upload-time = "2025-08-21T10:27:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835, upload-time = "2025-08-21T10:27:40.188Z" }, + { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211, upload-time = "2025-08-21T10:27:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277, upload-time = "2025-08-21T10:27:45.474Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256, upload-time = "2025-08-21T10:27:49.885Z" }, + { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579, upload-time = "2025-08-21T10:28:08.435Z" }, + { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163, upload-time = "2025-08-21T10:27:52.232Z" }, + { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860, upload-time = "2025-08-21T10:27:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830, upload-time = "2025-08-21T10:27:56.957Z" }, + { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216, upload-time = "2025-08-21T10:27:59.302Z" }, + { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743, upload-time = "2025-08-21T10:28:02.447Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload-time = "2025-08-21T10:28:05.377Z" }, ] [[package]] @@ -1858,123 +1335,93 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspect" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/9d/36af210c7cef275d646b8dded8cc555078a271514e34f8f8d1c056462dc3/pandera-0.27.0.tar.gz", hash = "sha256:83c66d5896b97b3a91c810621038d2495f56c83864493819e7587d2059e641ad", size = 567135, upload_time = "2025-11-25T16:20:35.156Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/26/8e4a28ffbf3406c60d58eaa7f0529fb6197f5ae49f77b173dc84c057e1a2/pandera-0.27.0-py3-none-any.whl", hash = "sha256:e43b8062dfcde984300d798686815cc93feaae09645d3cddee3ab437f2d11ed5", size = 295880, upload_time = "2025-11-25T16:20:33.635Z" }, -] - -[[package]] -name = "pandocfilters" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload_time = "2024-01-18T20:08:13.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/9d/36af210c7cef275d646b8dded8cc555078a271514e34f8f8d1c056462dc3/pandera-0.27.0.tar.gz", hash = "sha256:83c66d5896b97b3a91c810621038d2495f56c83864493819e7587d2059e641ad", size = 567135, upload-time = "2025-11-25T16:20:35.156Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload_time = "2024-01-18T20:08:11.28Z" }, -] - -[[package]] -name = "parso" -version = "0.8.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload_time = "2025-08-23T15:15:28.028Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload_time = "2025-08-23T15:15:25.663Z" }, + { url = "https://files.pythonhosted.org/packages/d5/26/8e4a28ffbf3406c60d58eaa7f0529fb6197f5ae49f77b173dc84c057e1a2/pandera-0.27.0-py3-none-any.whl", hash = "sha256:e43b8062dfcde984300d798686815cc93feaae09645d3cddee3ab437f2d11ed5", size = 295880, upload-time = "2025-11-25T16:20:33.635Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] [[package]] name = "petl" version = "1.7.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/07/16a40e30700f7c6975e62cba01c2f94afbb347dd8ed224a5918c686a47fe/petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b", size = 424376, upload_time = "2025-07-10T20:47:13.523Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/07/16a40e30700f7c6975e62cba01c2f94afbb347dd8ed224a5918c686a47fe/petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b", size = 424376, upload-time = "2025-07-10T20:47:13.523Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/5c/ea831abc18dd3268046d7d9a0119f1f8ddc69642e0a5245f839602b8114d/petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1", size = 233093, upload_time = "2025-07-10T20:47:12.03Z" }, -] - -[[package]] -name = "pexpect" -version = "4.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, + { url = "https://files.pythonhosted.org/packages/9f/5c/ea831abc18dd3268046d7d9a0119f1f8ddc69642e0a5245f839602b8114d/petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1", size = 233093, upload-time = "2025-07-10T20:47:12.03Z" }, ] [[package]] name = "pillow" version = "11.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload_time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload_time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload_time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload_time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload_time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload_time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload_time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload_time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload_time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload_time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload_time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload_time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload_time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload_time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload_time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload_time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload_time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload_time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload_time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload_time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload_time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload_time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload_time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload_time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload_time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload_time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload_time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload_time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload_time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload_time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload_time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload_time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload_time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload_time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload_time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload_time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload_time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload_time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload_time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload_time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload_time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload_time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload_time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload_time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload_time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload_time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload_time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload_time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload_time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload_time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload_time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload_time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload_time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload_time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload_time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload_time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload_time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload_time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload_time = "2025-07-01T09:15:50.399Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, ] [[package]] @@ -1987,36 +1434,36 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/cb/e6ffaf3d019e8501b1264dac529bf829ac2f1fe1d488cfcf67f1fccadacf/pint-0.25.tar.gz", hash = "sha256:22911a30d682ee0540d656571c19a7b1806ce00b2be88a16f67218108b7b8cc2", size = 253010, upload_time = "2025-08-15T19:49:12.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/cb/e6ffaf3d019e8501b1264dac529bf829ac2f1fe1d488cfcf67f1fccadacf/pint-0.25.tar.gz", hash = "sha256:22911a30d682ee0540d656571c19a7b1806ce00b2be88a16f67218108b7b8cc2", size = 253010, upload-time = "2025-08-15T19:49:12.72Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/cc/c528311d798e22ec884b816e8aa2989e0f1f28cdc8e5969e2be5f10bce85/pint-0.25-py3-none-any.whl", hash = "sha256:cc20ae3dff010b9bbea41fb80c2de008f683cc83512cea73633d55aead80aa1e", size = 305462, upload_time = "2025-08-15T19:49:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/76/cc/c528311d798e22ec884b816e8aa2989e0f1f28cdc8e5969e2be5f10bce85/pint-0.25-py3-none-any.whl", hash = "sha256:cc20ae3dff010b9bbea41fb80c2de008f683cc83512cea73633d55aead80aa1e", size = 305462, upload-time = "2025-08-15T19:49:11.083Z" }, ] [[package]] name = "platformdirs" version = "4.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload_time = "2025-10-08T17:44:48.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload_time = "2025-10-08T17:44:47.223Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload_time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload_time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "ply" version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload_time = "2018-02-15T19:01:31.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload-time = "2018-02-15T19:01:31.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload-time = "2018-02-15T19:01:27.172Z" }, ] [[package]] @@ -2030,93 +1477,47 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload_time = "2025-08-09T18:56:14.651Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload_time = "2025-08-09T18:56:13.192Z" }, -] - -[[package]] -name = "prompt-toolkit" -version = "3.0.52" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload_time = "2025-08-27T15:24:02.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload_time = "2025-08-27T15:23:59.498Z" }, -] - -[[package]] -name = "psutil" -version = "7.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/31/4723d756b59344b643542936e37a31d1d3204bcdc42a7daa8ee9eb06fb50/psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2", size = 497660, upload_time = "2025-09-17T20:14:52.902Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/62/ce4051019ee20ce0ed74432dd73a5bb087a6704284a470bb8adff69a0932/psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13", size = 245242, upload_time = "2025-09-17T20:14:56.126Z" }, - { url = "https://files.pythonhosted.org/packages/38/61/f76959fba841bf5b61123fbf4b650886dc4094c6858008b5bf73d9057216/psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5", size = 246682, upload_time = "2025-09-17T20:14:58.25Z" }, - { url = "https://files.pythonhosted.org/packages/88/7a/37c99d2e77ec30d63398ffa6a660450b8a62517cabe44b3e9bae97696e8d/psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3", size = 287994, upload_time = "2025-09-17T20:14:59.901Z" }, - { url = "https://files.pythonhosted.org/packages/9d/de/04c8c61232f7244aa0a4b9a9fbd63a89d5aeaf94b2fc9d1d16e2faa5cbb0/psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3", size = 291163, upload_time = "2025-09-17T20:15:01.481Z" }, - { url = "https://files.pythonhosted.org/packages/f4/58/c4f976234bf6d4737bc8c02a81192f045c307b72cf39c9e5c5a2d78927f6/psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d", size = 293625, upload_time = "2025-09-17T20:15:04.492Z" }, - { url = "https://files.pythonhosted.org/packages/79/87/157c8e7959ec39ced1b11cc93c730c4fb7f9d408569a6c59dbd92ceb35db/psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca", size = 244812, upload_time = "2025-09-17T20:15:07.462Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e9/b44c4f697276a7a95b8e94d0e320a7bf7f3318521b23de69035540b39838/psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d", size = 247965, upload_time = "2025-09-17T20:15:09.673Z" }, - { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971, upload_time = "2025-09-17T20:15:12.262Z" }, -] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload_time = "2020-12-28T15:15:28.35Z" }, -] - -[[package]] -name = "pure-eval" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload_time = "2024-07-21T12:58:21.801Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, ] [[package]] name = "pyarrow" version = "21.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload_time = "2025-07-18T00:57:31.761Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload_time = "2025-07-18T00:55:35.373Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload_time = "2025-07-18T00:55:39.303Z" }, - { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload_time = "2025-07-18T00:55:42.889Z" }, - { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload_time = "2025-07-18T00:55:47.069Z" }, - { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload_time = "2025-07-18T00:55:53.069Z" }, - { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload_time = "2025-07-18T00:55:57.714Z" }, - { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload_time = "2025-07-18T00:56:01.364Z" }, - { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload_time = "2025-07-18T00:56:04.42Z" }, - { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload_time = "2025-07-18T00:56:07.505Z" }, - { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload_time = "2025-07-18T00:56:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload_time = "2025-07-18T00:56:15.569Z" }, - { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload_time = "2025-07-18T00:56:19.531Z" }, - { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload_time = "2025-07-18T00:56:23.347Z" }, - { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload_time = "2025-07-18T00:56:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload_time = "2025-07-18T00:56:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload_time = "2025-07-18T00:56:33.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload_time = "2025-07-18T00:56:37.528Z" }, - { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload_time = "2025-07-18T00:56:41.483Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload_time = "2025-07-18T00:56:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload_time = "2025-07-18T00:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload_time = "2025-07-18T00:56:56.379Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload-time = "2025-07-18T00:55:35.373Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload-time = "2025-07-18T00:55:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload-time = "2025-07-18T00:55:42.889Z" }, + { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload-time = "2025-07-18T00:55:47.069Z" }, + { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload-time = "2025-07-18T00:55:53.069Z" }, + { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload-time = "2025-07-18T00:55:57.714Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload-time = "2025-07-18T00:56:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" }, + { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" }, + { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" }, + { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" }, + { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" }, ] [[package]] name = "pycparser" version = "2.23" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload_time = "2025-09-09T13:23:47.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload_time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, ] [[package]] @@ -2129,9 +1530,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload_time = "2025-09-13T11:26:39.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload-time = "2025-09-13T11:26:39.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855, upload_time = "2025-09-13T11:26:36.909Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855, upload-time = "2025-09-13T11:26:36.909Z" }, ] [[package]] @@ -2141,39 +1542,39 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload_time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload_time = "2025-04-23T18:31:25.863Z" }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload_time = "2025-04-23T18:31:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload_time = "2025-04-23T18:31:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload_time = "2025-04-23T18:31:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload_time = "2025-04-23T18:31:32.514Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload_time = "2025-04-23T18:31:33.958Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload_time = "2025-04-23T18:31:39.095Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload_time = "2025-04-23T18:31:41.034Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload_time = "2025-04-23T18:31:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload_time = "2025-04-23T18:31:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload_time = "2025-04-23T18:31:45.891Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload_time = "2025-04-23T18:31:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload_time = "2025-04-23T18:31:49.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload_time = "2025-04-23T18:31:51.609Z" }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload_time = "2025-04-23T18:31:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload_time = "2025-04-23T18:31:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload_time = "2025-04-23T18:31:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload_time = "2025-04-23T18:31:59.065Z" }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload_time = "2025-04-23T18:32:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload_time = "2025-04-23T18:32:02.418Z" }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload_time = "2025-04-23T18:32:04.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload_time = "2025-04-23T18:32:06.129Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload_time = "2025-04-23T18:32:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload_time = "2025-04-23T18:32:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload_time = "2025-04-23T18:32:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload_time = "2025-04-23T18:32:14.034Z" }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload_time = "2025-04-23T18:32:15.783Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload_time = "2025-04-23T18:32:18.473Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload_time = "2025-04-23T18:32:20.188Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload_time = "2025-04-23T18:32:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload_time = "2025-04-23T18:32:25.088Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, ] [[package]] @@ -2192,57 +1593,18 @@ dependencies = [ { name = "requests" }, { name = "wbgapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/cc/1661ca602d899247552cf851b3d48e95e152ce7ffd706f6c15afc918619c/pydeflate-2.3.3.tar.gz", hash = "sha256:298607a894cff9fb9786ba85924ff122fd72258b6802a6debf5ef66af1f33bf3", size = 39487, upload_time = "2025-12-07T09:41:36.937Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/fc/52a47b29d97d22fec1289602fe65346dedfffbc797fe3df953f484641a31/pydeflate-2.3.3-py3-none-any.whl", hash = "sha256:a19448158bd5cc17848336391d8461f860421dbf75c984b4685e14b93e8b88f3", size = 54114, upload_time = "2025-12-07T09:41:37.803Z" }, -] - -[[package]] -name = "pygithub" -version = "2.8.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyjwt", extra = ["crypto"] }, - { name = "pynacl" }, - { name = "requests" }, - { name = "typing-extensions" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c1/74/e560bdeffea72ecb26cff27f0fad548bbff5ecc51d6a155311ea7f9e4c4c/pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9", size = 2246994, upload_time = "2025-09-02T17:41:54.674Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/cc/1661ca602d899247552cf851b3d48e95e152ce7ffd706f6c15afc918619c/pydeflate-2.3.3.tar.gz", hash = "sha256:298607a894cff9fb9786ba85924ff122fd72258b6802a6debf5ef66af1f33bf3", size = 39487, upload-time = "2025-12-07T09:41:36.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/ba/7049ce39f653f6140aac4beb53a5aaf08b4407b6a3019aae394c1c5244ff/pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0", size = 432709, upload_time = "2025-09-02T17:41:52.947Z" }, + { url = "https://files.pythonhosted.org/packages/15/fc/52a47b29d97d22fec1289602fe65346dedfffbc797fe3df953f484641a31/pydeflate-2.3.3-py3-none-any.whl", hash = "sha256:a19448158bd5cc17848336391d8461f860421dbf75c984b4685e14b93e8b88f3", size = 54114, upload-time = "2025-12-07T09:41:37.803Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload_time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload_time = "2025-06-21T13:39:07.939Z" }, -] - -[[package]] -name = "pygtrie" -version = "2.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/13/55deec25bf09383216fa7f1dfcdbfca40a04aa00b6d15a5cbf25af8fce5f/pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2", size = 39266, upload_time = "2022-07-16T14:29:47.459Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/cd/bd196b2cf014afb1009de8b0f05ecd54011d881944e62763f3c1b1e8ef37/pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16", size = 25099, upload_time = "2022-09-23T20:30:05.12Z" }, -] - -[[package]] -name = "pyjwt" -version = "2.10.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, -] - -[package.optional-dependencies] -crypto = [ - { name = "cryptography" }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] [[package]] @@ -2253,66 +1615,9 @@ dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload_time = "2025-07-28T16:19:34.167Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload_time = "2025-07-28T16:19:31.401Z" }, -] - -[[package]] -name = "pynacl" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/c6/a3124dee667a423f2c637cfd262a54d67d8ccf3e160f3c50f622a85b7723/pynacl-1.6.0.tar.gz", hash = "sha256:cb36deafe6e2bce3b286e5d1f3e1c246e0ccdb8808ddb4550bb2792f2df298f2", size = 3505641, upload_time = "2025-09-10T23:39:22.308Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/24/1b639176401255605ba7c2b93a7b1eb1e379e0710eca62613633eb204201/pynacl-1.6.0-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:f46386c24a65383a9081d68e9c2de909b1834ec74ff3013271f1bca9c2d233eb", size = 384141, upload_time = "2025-09-10T23:38:28.675Z" }, - { url = "https://files.pythonhosted.org/packages/5e/7b/874efdf57d6bf172db0df111b479a553c3d9e8bb4f1f69eb3ffff772d6e8/pynacl-1.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dea103a1afcbc333bc0e992e64233d360d393d1e63d0bc88554f572365664348", size = 808132, upload_time = "2025-09-10T23:38:38.995Z" }, - { url = "https://files.pythonhosted.org/packages/f3/61/9b53f5913f3b75ac3d53170cdb897101b2b98afc76f4d9d3c8de5aa3ac05/pynacl-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:04f20784083014e265ad58c1b2dd562c3e35864b5394a14ab54f5d150ee9e53e", size = 1407253, upload_time = "2025-09-10T23:38:40.492Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0a/b138916b22bbf03a1bdbafecec37d714e7489dd7bcaf80cd17852f8b67be/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbcc4452a1eb10cd5217318c822fde4be279c9de8567f78bad24c773c21254f8", size = 843719, upload_time = "2025-09-10T23:38:30.87Z" }, - { url = "https://files.pythonhosted.org/packages/01/3b/17c368197dfb2c817ce033f94605a47d0cc27901542109e640cef263f0af/pynacl-1.6.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fed9fe1bec9e7ff9af31cd0abba179d0e984a2960c77e8e5292c7e9b7f7b5d", size = 1445441, upload_time = "2025-09-10T23:38:33.078Z" }, - { url = "https://files.pythonhosted.org/packages/35/3c/f79b185365ab9be80cd3cd01dacf30bf5895f9b7b001e683b369e0bb6d3d/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:10d755cf2a455d8c0f8c767a43d68f24d163b8fe93ccfaabfa7bafd26be58d73", size = 825691, upload_time = "2025-09-10T23:38:34.832Z" }, - { url = "https://files.pythonhosted.org/packages/f7/1f/8b37d25e95b8f2a434a19499a601d4d272b9839ab8c32f6b0fc1e40c383f/pynacl-1.6.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:536703b8f90e911294831a7fbcd0c062b837f3ccaa923d92a6254e11178aaf42", size = 1410726, upload_time = "2025-09-10T23:38:36.893Z" }, - { url = "https://files.pythonhosted.org/packages/bd/93/5a4a4cf9913014f83d615ad6a2df9187330f764f606246b3a744c0788c03/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6b08eab48c9669d515a344fb0ef27e2cbde847721e34bba94a343baa0f33f1f4", size = 801035, upload_time = "2025-09-10T23:38:42.109Z" }, - { url = "https://files.pythonhosted.org/packages/bf/60/40da6b0fe6a4d5fd88f608389eb1df06492ba2edca93fca0b3bebff9b948/pynacl-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5789f016e08e5606803161ba24de01b5a345d24590a80323379fc4408832d290", size = 1371854, upload_time = "2025-09-10T23:38:44.16Z" }, - { url = "https://files.pythonhosted.org/packages/44/b2/37ac1d65008f824cba6b5bf68d18b76d97d0f62d7a032367ea69d4a187c8/pynacl-1.6.0-cp314-cp314t-win32.whl", hash = "sha256:4853c154dc16ea12f8f3ee4b7e763331876316cc3a9f06aeedf39bcdca8f9995", size = 230345, upload_time = "2025-09-10T23:38:48.276Z" }, - { url = "https://files.pythonhosted.org/packages/f4/5a/9234b7b45af890d02ebee9aae41859b9b5f15fb4a5a56d88e3b4d1659834/pynacl-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:347dcddce0b4d83ed3f32fd00379c83c425abee5a9d2cd0a2c84871334eaff64", size = 243103, upload_time = "2025-09-10T23:38:45.503Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2c/c1a0f19d720ab0af3bc4241af2bdf4d813c3ecdcb96392b5e1ddf2d8f24f/pynacl-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2d6cd56ce4998cb66a6c112fda7b1fdce5266c9f05044fa72972613bef376d15", size = 187778, upload_time = "2025-09-10T23:38:46.731Z" }, - { url = "https://files.pythonhosted.org/packages/63/37/87c72df19857c5b3b47ace6f211a26eb862ada495cc96daa372d96048fca/pynacl-1.6.0-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e", size = 382610, upload_time = "2025-09-10T23:38:49.459Z" }, - { url = "https://files.pythonhosted.org/packages/0c/64/3ce958a5817fd3cc6df4ec14441c43fd9854405668d73babccf77f9597a3/pynacl-1.6.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16dd347cdc8ae0b0f6187a2608c0af1c8b7ecbbe6b4a06bff8253c192f696990", size = 798744, upload_time = "2025-09-10T23:38:58.531Z" }, - { url = "https://files.pythonhosted.org/packages/e4/8a/3f0dd297a0a33fa3739c255feebd0206bb1df0b44c52fbe2caf8e8bc4425/pynacl-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16c60daceee88d04f8d41d0a4004a7ed8d9a5126b997efd2933e08e93a3bd850", size = 1397879, upload_time = "2025-09-10T23:39:00.44Z" }, - { url = "https://files.pythonhosted.org/packages/41/94/028ff0434a69448f61348d50d2c147dda51aabdd4fbc93ec61343332174d/pynacl-1.6.0-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25720bad35dfac34a2bcdd61d9e08d6bfc6041bebc7751d9c9f2446cf1e77d64", size = 833907, upload_time = "2025-09-10T23:38:50.936Z" }, - { url = "https://files.pythonhosted.org/packages/52/bc/a5cff7f8c30d5f4c26a07dfb0bcda1176ab8b2de86dda3106c00a02ad787/pynacl-1.6.0-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bfaa0a28a1ab718bad6239979a5a57a8d1506d0caf2fba17e524dbb409441cf", size = 1436649, upload_time = "2025-09-10T23:38:52.783Z" }, - { url = "https://files.pythonhosted.org/packages/7a/20/c397be374fd5d84295046e398de4ba5f0722dc14450f65db76a43c121471/pynacl-1.6.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ef214b90556bb46a485b7da8258e59204c244b1b5b576fb71848819b468c44a7", size = 817142, upload_time = "2025-09-10T23:38:54.4Z" }, - { url = "https://files.pythonhosted.org/packages/12/30/5efcef3406940cda75296c6d884090b8a9aad2dcc0c304daebb5ae99fb4a/pynacl-1.6.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:49c336dd80ea54780bcff6a03ee1a476be1612423010472e60af83452aa0f442", size = 1401794, upload_time = "2025-09-10T23:38:56.614Z" }, - { url = "https://files.pythonhosted.org/packages/be/e1/a8fe1248cc17ccb03b676d80fa90763760a6d1247da434844ea388d0816c/pynacl-1.6.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f3482abf0f9815e7246d461fab597aa179b7524628a4bc36f86a7dc418d2608d", size = 772161, upload_time = "2025-09-10T23:39:01.93Z" }, - { url = "https://files.pythonhosted.org/packages/a3/76/8a62702fb657d6d9104ce13449db221a345665d05e6a3fdefb5a7cafd2ad/pynacl-1.6.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:140373378e34a1f6977e573033d1dd1de88d2a5d90ec6958c9485b2fd9f3eb90", size = 1370720, upload_time = "2025-09-10T23:39:03.531Z" }, - { url = "https://files.pythonhosted.org/packages/6d/38/9e9e9b777a1c4c8204053733e1a0269672c0bd40852908c9ad6b6eaba82c/pynacl-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6b393bc5e5a0eb86bb85b533deb2d2c815666665f840a09e0aa3362bb6088736", size = 791252, upload_time = "2025-09-10T23:39:05.058Z" }, - { url = "https://files.pythonhosted.org/packages/63/ef/d972ce3d92ae05c9091363cf185e8646933f91c376e97b8be79ea6e96c22/pynacl-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a25cfede801f01e54179b8ff9514bd7b5944da560b7040939732d1804d25419", size = 1362910, upload_time = "2025-09-10T23:39:06.924Z" }, - { url = "https://files.pythonhosted.org/packages/35/2c/ee0b373a1861f66a7ca8bdb999331525615061320dd628527a50ba8e8a60/pynacl-1.6.0-cp38-abi3-win32.whl", hash = "sha256:dcdeb41c22ff3c66eef5e63049abf7639e0db4edee57ba70531fc1b6b133185d", size = 226461, upload_time = "2025-09-10T23:39:11.894Z" }, - { url = "https://files.pythonhosted.org/packages/75/f7/41b6c0b9dd9970173b6acc026bab7b4c187e4e5beef2756d419ad65482da/pynacl-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:cf831615cc16ba324240de79d925eacae8265b7691412ac6b24221db157f6bd1", size = 238802, upload_time = "2025-09-10T23:39:08.966Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0f/462326910c6172fa2c6ed07922b22ffc8e77432b3affffd9e18f444dbfbb/pynacl-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:84709cea8f888e618c21ed9a0efdb1a59cc63141c403db8bf56c469b71ad56f2", size = 183846, upload_time = "2025-09-10T23:39:10.552Z" }, -] - -[[package]] -name = "pyomo" -version = "6.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ply" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/91/d4/bbb4ab79bb3015e3bdd488435ef71f7806144cc6ae4146ee6c5f64ac53f2/pyomo-6.9.4.tar.gz", hash = "sha256:34ad22cd6bf9956de9c0d3842d01c1f92dee0515b25aa3e8f113b326549b1231", size = 3033231, upload_time = "2025-08-28T02:11:24.976Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/6b/80f40b4b72a3c6a207130ce431765f897c76133a15e7e38e66f9f40d36f3/pyomo-6.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc3cd52c143991071821bbb9943d2a59512481b5d15adb7add32f92def4172ce", size = 4266926, upload_time = "2025-08-28T02:09:44.833Z" }, - { url = "https://files.pythonhosted.org/packages/48/30/f7ef1be3deb445694b63800de6a36dff31670014d5aa67d42e1716c04970/pyomo-6.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a5e1dc79e1a2ec1f6247f0df59ac3572781e40218093a624f9213dd3ae6913f", size = 4255513, upload_time = "2025-08-28T02:09:49.197Z" }, - { url = "https://files.pythonhosted.org/packages/76/f4/9493daae82595d7d776ba6cd0d5d167951700670e363dec443415e753808/pyomo-6.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abea6ca55295b179c1c91184db4eece7589cfd6099869eff8e3e6aa8a06463d1", size = 4311852, upload_time = "2025-08-28T02:09:53.415Z" }, - { url = "https://files.pythonhosted.org/packages/83/d7/e39e605ab33c2729afb043bed94ce7ee382bd5b4bc708f6c90a1d2600456/pyomo-6.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddd48dec34b270ca2621863a216c4f3a6fcc409db86a7dc34c31eb788a44b8c6", size = 4343130, upload_time = "2025-08-28T02:09:57.397Z" }, - { url = "https://files.pythonhosted.org/packages/65/04/dc4d3d9369c4cb1b6e68ce18bbba066ea83284942322836e791dbf693bb2/pyomo-6.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1a768a178ae3f0391c66e2334da3d1618c9c85c9d879bc86de441efd143f491", size = 4267029, upload_time = "2025-08-28T02:10:02.066Z" }, - { url = "https://files.pythonhosted.org/packages/6b/52/824e9cea51ed0a25636b66e8c122dce5fcd22a197bf4646dd6c5f138fe36/pyomo-6.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09cde10e5fe8414f453d1ed3bccef1b42fc048fc2da0a9c936e40b2f877201bf", size = 4255606, upload_time = "2025-08-28T02:10:06.383Z" }, - { url = "https://files.pythonhosted.org/packages/a2/dc/97005d683ca57e231a8f613921adaf480d3a82f40d280c6d0185855a92c6/pyomo-6.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df3e173d330666f881258deefa79f37373b941d4a5b00edc6aa5b10680720dc1", size = 4312670, upload_time = "2025-08-28T02:10:11.563Z" }, - { url = "https://files.pythonhosted.org/packages/64/73/47525078660eced084abb9a79e1e4c74098c992316c93ab6ead2dc7f8bda/pyomo-6.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a13baebcdb05deadeb0ec4b04ecedffa65f1e86179418fa67e603a4f8f1bf17", size = 4344540, upload_time = "2025-08-28T02:10:15.731Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e3/56c20c3358e58206e7270a42ff666a267a6c01492213c8c47aad8676b487/pyomo-6.9.4-py3-none-any.whl", hash = "sha256:a274d74616c0b793279931f3b2175a31f9c63213f2d7b86c14d168c6c264f782", size = 3892640, upload_time = "2025-08-28T02:11:13.845Z" }, + { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, ] [[package]] @@ -2322,9 +1627,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload_time = "2020-02-25T12:08:31.049Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/7c/7c45a9e9bf6ddb57b67e66cf4e8076a7baf3a790a3411daac1a7a2df0c5b/pyphonetics-0.5.3.tar.gz", hash = "sha256:2d3c2e359fde91a3c57914f0b5468bba7a5daf38e7927fd999992ea68990fbe4", size = 10314, upload-time = "2020-02-25T12:08:31.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload_time = "2020-02-25T12:08:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload-time = "2020-02-25T12:08:25.368Z" }, ] [[package]] @@ -2338,9 +1643,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload_time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload_time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, ] [[package]] @@ -2352,9 +1657,9 @@ dependencies = [ { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload_time = "2025-09-09T10:57:02.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload_time = "2025-09-09T10:57:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, ] [[package]] @@ -2365,76 +1670,76 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload_time = "2025-07-01T13:30:59.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload_time = "2025-07-01T13:30:56.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, ] [[package]] name = "python-calamine" version = "0.5.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ca/295b37a97275d53f072c7307c9d0c4bfec565d3d74157e7fe336ea18de0a/python_calamine-0.5.3.tar.gz", hash = "sha256:b4529c955fa64444184630d5bc8c82c472d1cf6bfe631f0a7bfc5e4802d4e996", size = 130874, upload_time = "2025-09-08T05:41:27.18Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/24/f6e3369be221baa6a50476b8a02f5100980ae487a630d80d4983b4c73879/python_calamine-0.5.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9a78e471bc02d3f76c294bf996562a9d0fbf2ad0a49d628330ba247865190f1", size = 844280, upload_time = "2025-09-08T05:39:19.991Z" }, - { url = "https://files.pythonhosted.org/packages/e7/32/f9b689fe40616376457d1a6fd5ab84834066db31fa5ffd10a5b02f996a44/python_calamine-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcbd277a4d0a0108aa2f5126a89ca3f2bb18d0bec7ba7d614da02a4556d18ef2", size = 814054, upload_time = "2025-09-08T05:39:21.888Z" }, - { url = "https://files.pythonhosted.org/packages/f7/26/a07bb6993ae0a524251060397edc710af413dbb175d56f1e1bbc7a2c39c9/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e6b68b26346f559a086bb84c960d4e9ddc79be8c3499752c1ba96051fea98f", size = 889447, upload_time = "2025-09-08T05:39:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/d8/79/5902d00658e2dd4efe3a4062b710a7eaa6082001c199717468fbcd8cef69/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e60ebeafebf66889753bfad0055edaa38068663961bb9a18e9f89aef2c9cec50", size = 883540, upload_time = "2025-09-08T05:39:25.15Z" }, - { url = "https://files.pythonhosted.org/packages/d0/85/6299c909fcbba0663b527b82c87d204372e6f469b4ed5602f7bc1f7f1103/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d9da11edb40e9d2fb214fcf575be8004b44b1b407930eceb2458f1a84be634f", size = 1034891, upload_time = "2025-09-08T05:39:26.666Z" }, - { url = "https://files.pythonhosted.org/packages/65/2c/d0cfd9161b3404528bfba9fe000093be19f2c83ede42c255da4ebfd4da17/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44d22bc52fe26b72a6dc07ab8a167d5d97aeb28282957f52b930e92106a35e3c", size = 935055, upload_time = "2025-09-08T05:39:28.727Z" }, - { url = "https://files.pythonhosted.org/packages/b8/69/420c382535d1aca9af6bc929c78ad6b9f8416312aa4955b7977f5f864082/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b9ace667e04ea6631a0ada0e43dbc796c56e0d021f04bd64cdacb44de4504da", size = 904143, upload_time = "2025-09-08T05:39:30.23Z" }, - { url = "https://files.pythonhosted.org/packages/d8/2b/19cc87654f9c85fbb6265a7ebe92cf0f649c308f0cf8f262b5c3de754d19/python_calamine-0.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ec0da29de7366258de2eb765a90b9e9fbe9f9865772f3609dacff302b894393", size = 948890, upload_time = "2025-09-08T05:39:31.779Z" }, - { url = "https://files.pythonhosted.org/packages/18/e8/3547cb72d3a0f67c173ca07d9137046f2a6c87fdc31316b10e2d7d851f2a/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bba5adf123200503e6c07c667a8ce82c3b62ba02f9b3e99205be24fc73abc49", size = 1067802, upload_time = "2025-09-08T05:39:33.264Z" }, - { url = "https://files.pythonhosted.org/packages/cb/69/31ab3e8010cbed814b5fcdb2ace43e5b76d6464f8abb1dfab9191416ca3d/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4c49bc58f3cfd1e9595a05cab7e71aa94f6cff5bf3916de2b87cdaa9b4ce9a3", size = 1074607, upload_time = "2025-09-08T05:39:34.803Z" }, - { url = "https://files.pythonhosted.org/packages/c4/40/112d113d974bee5fff564e355b01df5bd524dbd5820c913c9dae574fe80a/python_calamine-0.5.3-cp312-cp312-win32.whl", hash = "sha256:42315463e139f5e44f4dedb9444fa0971c51e82573e872428050914f0dec4194", size = 669578, upload_time = "2025-09-08T05:39:36.305Z" }, - { url = "https://files.pythonhosted.org/packages/3e/87/0af1cf4ad01a2df273cfd3abb7efaba4fba50395b98f5e871cee016d4f09/python_calamine-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8a24bd4c72bd984311f5ebf2e17a8aa3ce4e5ae87eda517c61c3507db8c045de", size = 713021, upload_time = "2025-09-08T05:39:37.942Z" }, - { url = "https://files.pythonhosted.org/packages/5d/4e/6ed2ed3bb4c4c479e85d3444742f101f7b3099db1819e422bf861cf9923b/python_calamine-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:e4a713e56d3cca752d1a7d6a00dca81b224e2e1a0567d370bc0db537e042d6b0", size = 679615, upload_time = "2025-09-08T05:39:39.487Z" }, - { url = "https://files.pythonhosted.org/packages/33/e7/14f2bec7b4bead0e71e78fa2549e22192c498a3204d931bd0e6522ec955d/python_calamine-0.5.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:90389cc459500644bbc1a1170b5e50a95160f34cedc8de7fe9a4bd1c08764039", size = 843906, upload_time = "2025-09-08T05:39:40.972Z" }, - { url = "https://files.pythonhosted.org/packages/c2/6c/8c6e7a8c9b421e99ad1a637c3b96d94fef25abad6bf790a7ce35bfc5a48d/python_calamine-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:221b64c0e126a1263a14d575c61a60177cad852829dca61dfb4f5a8fb9603251", size = 813859, upload_time = "2025-09-08T05:39:42.853Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/f6745016a431f10620b4e803f306d95c57e828dea064e32fb944c0260559/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49f3aa50d532c6639be851a644875d5c9cd63892cf545ee614a5c0593dc50c3b", size = 889212, upload_time = "2025-09-08T05:39:44.356Z" }, - { url = "https://files.pythonhosted.org/packages/b9/72/8de0af1823d587b2683eb25c6feef14c7ea917cfb975d094ad09f46245d0/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d8bf3b3542c771795cfcfa8a77d1373273311735517cca599aa7f89c34f38ae", size = 883584, upload_time = "2025-09-08T05:39:45.97Z" }, - { url = "https://files.pythonhosted.org/packages/5a/90/47b91cf573b6bd4e6dbaeef4f993caf26dc0d2b8117261bc965bd70b38ce/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8e452fc1335ab1f7738c3d4d5144f11719b9c5585f3cb5102d47293355067a", size = 1034378, upload_time = "2025-09-08T05:39:47.57Z" }, - { url = "https://files.pythonhosted.org/packages/48/f7/c75e5f0b0918f0f60b45fad4c313d159633615aa1c96a5170e3fe940862d/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4fc75ac97be47539465191a00de305c0e150465da8632c14fc1107a0b304f97", size = 934310, upload_time = "2025-09-08T05:39:49.059Z" }, - { url = "https://files.pythonhosted.org/packages/cd/04/8b5806bdbfabdb51fd2816deac6870d031560f0bbd90d9729ac86b903579/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1258368551e0b235d5b46c105137294cbb5ca683b2c13f5851f3ebec7f2d42b", size = 903602, upload_time = "2025-09-08T05:39:50.91Z" }, - { url = "https://files.pythonhosted.org/packages/75/4e/ec27837d5023b8db775db7798b3340eeb6bcb7f61ad64e892d4e1b14853e/python_calamine-0.5.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a7c51270e5ea518cb02cb531d84a2eb2de68da3cf48b26adae622f031dc5284", size = 948410, upload_time = "2025-09-08T05:39:53.286Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ba/8b5193637bfa0f363284974ae998f96fa1c8561a0a4d90378b0f202ac317/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e1d0df3d69b32da05e3e7648bb5802559d44979be721983f0d669b4128f920fa", size = 1067274, upload_time = "2025-09-08T05:39:55.469Z" }, - { url = "https://files.pythonhosted.org/packages/da/1c/506791e4c7078f2fed1ee2d69703d62c0acfd5b671db157bb755f47cff42/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6d674ae194744b6080f20a0b5a253a9976d632ee91dc00e13e539e968167cd35", size = 1073351, upload_time = "2025-09-08T05:39:57.685Z" }, - { url = "https://files.pythonhosted.org/packages/dc/83/e30e21484b1ed55668f67a63578d8a6ba70597a4d7ee8da23d759d3e1b3f/python_calamine-0.5.3-cp313-cp313-win32.whl", hash = "sha256:7a42ff0dae44457a4a3e65ea49357ffdf92e44f8b022ef1fb32c6498097d6d57", size = 669416, upload_time = "2025-09-08T05:39:59.901Z" }, - { url = "https://files.pythonhosted.org/packages/1d/8f/29c617e9548ed2704657ebaa7d79067cad06cbbf7dd432a6cacd4cc19d16/python_calamine-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:054aee805c2cd5ab9848c2b8459822f2581cf22af45ff60251c9f45585cc06e0", size = 712760, upload_time = "2025-09-08T05:40:01.799Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/d8117f99037100a28d17d9fbde121511c19d54ff4e5968d6aed693caeb87/python_calamine-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0e870f57651e2f76e7c1f009492aa342a7b1819f8b1131bf501240872777f944", size = 679372, upload_time = "2025-09-08T05:40:03.676Z" }, - { url = "https://files.pythonhosted.org/packages/d9/0a/61949009a354af9ff5dc19e6816ae68a56281c0765520c9db4ff0ed20054/python_calamine-0.5.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e98c819cd43a7f0048f6d97c9d4ec23d72889cd722de1d6b68e0de24b1f8f037", size = 843418, upload_time = "2025-09-08T05:40:05.601Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/4cb7fa988d17c98a0be6e9f74561d8a2381f28a2b88adb89f16abe345d2f/python_calamine-0.5.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cf90ce46420545f922cde95004ea8d5efaf3864b5a380a5d1defc7abd219421a", size = 813611, upload_time = "2025-09-08T05:40:07.47Z" }, - { url = "https://files.pythonhosted.org/packages/01/34/4c2a6827da90f366be3fb9c7788f672f5e7d60808f9dbd01da5acc6f11ca/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e89caa6a1a55215be742cd44f6d94611fb6ab222a30325e772abc40566693e5", size = 888097, upload_time = "2025-09-08T05:40:09.256Z" }, - { url = "https://files.pythonhosted.org/packages/17/bc/ecf5f6ac95195dfd3e9d63ab8c60b78d6466009751dfb1cdacf71d5f5e19/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b13177e42dac8de57870995699b237ce5a7886d9bd7fb745a36f867e5d3d3e62", size = 880861, upload_time = "2025-09-08T05:40:11.637Z" }, - { url = "https://files.pythonhosted.org/packages/6e/55/8b60f99221a408f08db280b553aa4321c4cd9365e5c3101638249002d5a4/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:948e28b5f3246177440c70550661e0a27b414cb15535111fca7dbac2a63721b1", size = 1033023, upload_time = "2025-09-08T05:40:13.864Z" }, - { url = "https://files.pythonhosted.org/packages/05/c5/8c378d3c2c56d12606e20b59eee3538d3b1177fe00b103bb98ef15176610/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37fef2b67bcd66b5dfc65b0779da9522c82f1ef9f97fc6034848072ff60b3f7", size = 933097, upload_time = "2025-09-08T05:40:16.372Z" }, - { url = "https://files.pythonhosted.org/packages/26/04/cf14e91ac5c2d6d9795e1c39f3f53e0f173fcbaed4b00198e22a58265fdd/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddcef4e0e9d0479e027c90d9e1537bcf05de9bdd137cd7dfdbfc0034b1850973", size = 901917, upload_time = "2025-09-08T05:40:18.444Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2f/5b2065b9360bda792504fe3ac1cef6d9da51ceba6230ee7634886b44cce9/python_calamine-0.5.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6732b47f923102357bde348021a2892a41c2fb173958268c0a1ff8d5abb6b7e8", size = 943328, upload_time = "2025-09-08T05:40:20.302Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5a/45e4bd8473264b918d83297d15f160471029390cd06ed0056fc57e8f29eb/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:543db1b886cf994aaf7da0752022b37c42c05acb7605b56d09047023c8387610", size = 1065993, upload_time = "2025-09-08T05:40:22.528Z" }, - { url = "https://files.pythonhosted.org/packages/35/6b/2afd47608495f23408bdf2f1ff57a144700aed8b5bbe50285ac4864edf53/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b79135dd96129253dc0e547778c700e1e3782e7671e7047c8b106b5501e33706", size = 1071801, upload_time = "2025-09-08T05:40:24.481Z" }, - { url = "https://files.pythonhosted.org/packages/f7/db/b06a15f25e63290c2efc5433fa8b395bfe870aacbf4ea6c930764d53eca6/python_calamine-0.5.3-cp313-cp313t-win32.whl", hash = "sha256:d84dc3b78adf038a2b452fc784523dcc90477f1631d33aabc0872812db5beb26", size = 669485, upload_time = "2025-09-08T05:40:26.818Z" }, - { url = "https://files.pythonhosted.org/packages/2d/40/e51adf1dae2002f189c83ae527aad017372d1a1b97a22172dc2e51ce502d/python_calamine-0.5.3-cp313-cp313t-win_amd64.whl", hash = "sha256:8a3fd541576fdf2708e40064ebaaf561a0a2afcab01de91c83ec212193bede34", size = 712636, upload_time = "2025-09-08T05:40:28.502Z" }, - { url = "https://files.pythonhosted.org/packages/56/fa/db4dc8d27a5daa14a153aebc0cb98bad6fd700befd9e67440a8017f0e108/python_calamine-0.5.3-cp313-cp313t-win_arm64.whl", hash = "sha256:b28a9c9318a5e7dabcead1803bfd48be5bf7c9f339d6e505a5989650a6102487", size = 678307, upload_time = "2025-09-08T05:40:30.797Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7f/a098680c9d6ad36fe850f2c2c28627ee3bc95aaa052f375806f69c075475/python_calamine-0.5.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b5cdcd85cc08a1805d267fc66aa100940712de6b4524951ab91ba47fa60d481f", size = 843921, upload_time = "2025-09-08T05:40:32.418Z" }, - { url = "https://files.pythonhosted.org/packages/09/ce/3de5d714779fac6e3333e7ea98ce4eae3b2479eb8a3d2f7d9e4487e16681/python_calamine-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:828cd5d49fe9eb9c1fc9219fe484b07f2ba9a1e5e3b8475d7f1415e0fa316df8", size = 814173, upload_time = "2025-09-08T05:40:33.982Z" }, - { url = "https://files.pythonhosted.org/packages/cb/14/ef98575838091b6b24274160d53607e78df94f0176af360bcb063512e643/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d3f4d0532ab4de422fc4b707cdbb93d57ca7ccf9be8bc4742fb9376dc68f861", size = 888958, upload_time = "2025-09-08T05:40:35.576Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b1/c999dd1f89f415ff06f88f37bce643ece3c4d51ae051e0a143ff16f44c1c/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a9ba0a16e4335b676232ddbbea0fd09bfb94757ca6e4cf90ce1348aa843f3f", size = 880988, upload_time = "2025-09-08T05:40:37.264Z" }, - { url = "https://files.pythonhosted.org/packages/74/16/4984532280e4b2c81aa26ae57b37fc3eaeda414e46e2d9c6a9cfdb27cd56/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0928d0eb1cdea229464de280d0f7cd99314ba28cffd2c4d6c9ce6902f9d6d448", size = 1035685, upload_time = "2025-09-08T05:40:38.992Z" }, - { url = "https://files.pythonhosted.org/packages/cd/dc/91776b34ab09f36ea41449951148bef731f9b355a2d2b25d398eec774926/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f9519dd3b8814ef6e801b9797f918fe7a59937fac4784cb280c8350fb1a2cf", size = 933865, upload_time = "2025-09-08T05:40:41.089Z" }, - { url = "https://files.pythonhosted.org/packages/01/97/12deaff5e608207398a9f0eaa06447ed69e8c4873ee953be553f9440881a/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954cd764c6b24735c749a447523b4ccf4b9d2b7c231ddd304ed42c15afca9516", size = 902310, upload_time = "2025-09-08T05:40:43.222Z" }, - { url = "https://files.pythonhosted.org/packages/45/da/45063eee203f6c9d9436d29dfc0f01db85c9264c86d1e438c3b452d7e97f/python_calamine-0.5.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3f0e9c59fece6bbf1a916947fba33e9b635327eb165784d05efed40027164d1", size = 948143, upload_time = "2025-09-08T05:40:44.874Z" }, - { url = "https://files.pythonhosted.org/packages/33/07/0b661166dd58367bd5d6cc2bf8441f61004dd5ef2555ab224da97b1ac5d3/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:63bb47cc080d8eb9bc654f0961ada385b58a57d4628b0a33d1003c8f62e6ae3d", size = 1067181, upload_time = "2025-09-08T05:40:46.598Z" }, - { url = "https://files.pythonhosted.org/packages/5d/80/58b107dc2c2e6bad581f58f54b3ccb07705094ff23734c8dd30bd8aef4e8/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:adb62aab9b9298b2fc378b2aec6dd5802f7ee199c3431abae29368ef046f8005", size = 1072683, upload_time = "2025-09-08T05:40:48.629Z" }, - { url = "https://files.pythonhosted.org/packages/4c/b4/667e40dbe7d4f19a2e69f9cd186e069cd3af0411a177aa2a90231e3e0b06/python_calamine-0.5.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1de68d2586df7a7a05a7779031dabd4c3d95d4738314ba82e943c8d3f36b5a67", size = 843526, upload_time = "2025-09-08T05:40:50.334Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f7/fb86da5920198a616583f07d1a395cb1241eafb930d5c33f597ae6664711/python_calamine-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c70033bbd59f05491743befec5e2a90784f4c8220e7379ce03e956bd1f475be", size = 811074, upload_time = "2025-09-08T05:40:52.168Z" }, - { url = "https://files.pythonhosted.org/packages/76/2e/5a5a618b351b75155fbb40ad88e166f17ccf202401dd4b830db05b2565a6/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f396a0e57b1a5462668fc247377714b5b4c061718c1863c00ddc64e770b0f1e", size = 887735, upload_time = "2025-09-08T05:40:53.86Z" }, - { url = "https://files.pythonhosted.org/packages/97/cf/3cfaa550eb1c9c5501728886c5e787c3ddeb34d8bf3e7e9fcaf9fc6fbd86/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce737cb19d3077cabe0acaecd6b55d5df75021a520c20b47e0c75b65b4bfa919", size = 882356, upload_time = "2025-09-08T05:40:55.624Z" }, - { url = "https://files.pythonhosted.org/packages/88/b8/97f56e337149d0ce53399be9bd583f735dc1ea9abb2745ac902a09e8c401/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e54b30802fe089cc0c67c67407203412ec7144e84e0960e69c529c7170c37dae", size = 1033195, upload_time = "2025-09-08T05:40:57.819Z" }, - { url = "https://files.pythonhosted.org/packages/94/45/59a21a18c8e073d2f930a4a9c0c038207b82c5c996b67146fb76f3da2748/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5efc94c2e4119dc0da1e84d036f7e840fb0dd0850f4c10d3d166d725af0751af", size = 931846, upload_time = "2025-09-08T05:40:59.93Z" }, - { url = "https://files.pythonhosted.org/packages/36/47/715e0c0bc37ccce035ef4be1aa8eafa1e5abb6687af725cb47d81a18def7/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e33191a01d52f66dd6b029e99b6eda0245771c4f116c87ff0d5edf922dbbca", size = 902871, upload_time = "2025-09-08T05:41:02.021Z" }, - { url = "https://files.pythonhosted.org/packages/ca/07/ac0cf8623765106794e297235d6dde3a728f18e61a536792189fca06f2ba/python_calamine-0.5.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85ceec02cb367cf87a72ba559db3279f3b4774edba9330eb77670587d4de95f4", size = 944438, upload_time = "2025-09-08T05:41:03.748Z" }, - { url = "https://files.pythonhosted.org/packages/88/98/c48c0b8be7fbae5f68b7c55a1ed4068d2c3dab64093e39733d43c23a7459/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:882400368f976ea489e47af04fde936b603c3efcf9ade1cd73e623c88fc4aa5c", size = 1066276, upload_time = "2025-09-08T05:41:05.408Z" }, - { url = "https://files.pythonhosted.org/packages/73/3a/bbf99531fec43bca2ab28948ab94d851db96c0364c76139dd746cab2f4f9/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ce2fe421d5564e5341f7a06b9c52b84603b48aa670426d44fffce705609a859b", size = 1073059, upload_time = "2025-09-08T05:41:07.75Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/ca/295b37a97275d53f072c7307c9d0c4bfec565d3d74157e7fe336ea18de0a/python_calamine-0.5.3.tar.gz", hash = "sha256:b4529c955fa64444184630d5bc8c82c472d1cf6bfe631f0a7bfc5e4802d4e996", size = 130874, upload-time = "2025-09-08T05:41:27.18Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/24/f6e3369be221baa6a50476b8a02f5100980ae487a630d80d4983b4c73879/python_calamine-0.5.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9a78e471bc02d3f76c294bf996562a9d0fbf2ad0a49d628330ba247865190f1", size = 844280, upload-time = "2025-09-08T05:39:19.991Z" }, + { url = "https://files.pythonhosted.org/packages/e7/32/f9b689fe40616376457d1a6fd5ab84834066db31fa5ffd10a5b02f996a44/python_calamine-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcbd277a4d0a0108aa2f5126a89ca3f2bb18d0bec7ba7d614da02a4556d18ef2", size = 814054, upload-time = "2025-09-08T05:39:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/f7/26/a07bb6993ae0a524251060397edc710af413dbb175d56f1e1bbc7a2c39c9/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e6b68b26346f559a086bb84c960d4e9ddc79be8c3499752c1ba96051fea98f", size = 889447, upload-time = "2025-09-08T05:39:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/d8/79/5902d00658e2dd4efe3a4062b710a7eaa6082001c199717468fbcd8cef69/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e60ebeafebf66889753bfad0055edaa38068663961bb9a18e9f89aef2c9cec50", size = 883540, upload-time = "2025-09-08T05:39:25.15Z" }, + { url = "https://files.pythonhosted.org/packages/d0/85/6299c909fcbba0663b527b82c87d204372e6f469b4ed5602f7bc1f7f1103/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d9da11edb40e9d2fb214fcf575be8004b44b1b407930eceb2458f1a84be634f", size = 1034891, upload-time = "2025-09-08T05:39:26.666Z" }, + { url = "https://files.pythonhosted.org/packages/65/2c/d0cfd9161b3404528bfba9fe000093be19f2c83ede42c255da4ebfd4da17/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44d22bc52fe26b72a6dc07ab8a167d5d97aeb28282957f52b930e92106a35e3c", size = 935055, upload-time = "2025-09-08T05:39:28.727Z" }, + { url = "https://files.pythonhosted.org/packages/b8/69/420c382535d1aca9af6bc929c78ad6b9f8416312aa4955b7977f5f864082/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b9ace667e04ea6631a0ada0e43dbc796c56e0d021f04bd64cdacb44de4504da", size = 904143, upload-time = "2025-09-08T05:39:30.23Z" }, + { url = "https://files.pythonhosted.org/packages/d8/2b/19cc87654f9c85fbb6265a7ebe92cf0f649c308f0cf8f262b5c3de754d19/python_calamine-0.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ec0da29de7366258de2eb765a90b9e9fbe9f9865772f3609dacff302b894393", size = 948890, upload-time = "2025-09-08T05:39:31.779Z" }, + { url = "https://files.pythonhosted.org/packages/18/e8/3547cb72d3a0f67c173ca07d9137046f2a6c87fdc31316b10e2d7d851f2a/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bba5adf123200503e6c07c667a8ce82c3b62ba02f9b3e99205be24fc73abc49", size = 1067802, upload-time = "2025-09-08T05:39:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/cb/69/31ab3e8010cbed814b5fcdb2ace43e5b76d6464f8abb1dfab9191416ca3d/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4c49bc58f3cfd1e9595a05cab7e71aa94f6cff5bf3916de2b87cdaa9b4ce9a3", size = 1074607, upload-time = "2025-09-08T05:39:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/c4/40/112d113d974bee5fff564e355b01df5bd524dbd5820c913c9dae574fe80a/python_calamine-0.5.3-cp312-cp312-win32.whl", hash = "sha256:42315463e139f5e44f4dedb9444fa0971c51e82573e872428050914f0dec4194", size = 669578, upload-time = "2025-09-08T05:39:36.305Z" }, + { url = "https://files.pythonhosted.org/packages/3e/87/0af1cf4ad01a2df273cfd3abb7efaba4fba50395b98f5e871cee016d4f09/python_calamine-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8a24bd4c72bd984311f5ebf2e17a8aa3ce4e5ae87eda517c61c3507db8c045de", size = 713021, upload-time = "2025-09-08T05:39:37.942Z" }, + { url = "https://files.pythonhosted.org/packages/5d/4e/6ed2ed3bb4c4c479e85d3444742f101f7b3099db1819e422bf861cf9923b/python_calamine-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:e4a713e56d3cca752d1a7d6a00dca81b224e2e1a0567d370bc0db537e042d6b0", size = 679615, upload-time = "2025-09-08T05:39:39.487Z" }, + { url = "https://files.pythonhosted.org/packages/33/e7/14f2bec7b4bead0e71e78fa2549e22192c498a3204d931bd0e6522ec955d/python_calamine-0.5.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:90389cc459500644bbc1a1170b5e50a95160f34cedc8de7fe9a4bd1c08764039", size = 843906, upload-time = "2025-09-08T05:39:40.972Z" }, + { url = "https://files.pythonhosted.org/packages/c2/6c/8c6e7a8c9b421e99ad1a637c3b96d94fef25abad6bf790a7ce35bfc5a48d/python_calamine-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:221b64c0e126a1263a14d575c61a60177cad852829dca61dfb4f5a8fb9603251", size = 813859, upload-time = "2025-09-08T05:39:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/f6745016a431f10620b4e803f306d95c57e828dea064e32fb944c0260559/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49f3aa50d532c6639be851a644875d5c9cd63892cf545ee614a5c0593dc50c3b", size = 889212, upload-time = "2025-09-08T05:39:44.356Z" }, + { url = "https://files.pythonhosted.org/packages/b9/72/8de0af1823d587b2683eb25c6feef14c7ea917cfb975d094ad09f46245d0/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d8bf3b3542c771795cfcfa8a77d1373273311735517cca599aa7f89c34f38ae", size = 883584, upload-time = "2025-09-08T05:39:45.97Z" }, + { url = "https://files.pythonhosted.org/packages/5a/90/47b91cf573b6bd4e6dbaeef4f993caf26dc0d2b8117261bc965bd70b38ce/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8e452fc1335ab1f7738c3d4d5144f11719b9c5585f3cb5102d47293355067a", size = 1034378, upload-time = "2025-09-08T05:39:47.57Z" }, + { url = "https://files.pythonhosted.org/packages/48/f7/c75e5f0b0918f0f60b45fad4c313d159633615aa1c96a5170e3fe940862d/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4fc75ac97be47539465191a00de305c0e150465da8632c14fc1107a0b304f97", size = 934310, upload-time = "2025-09-08T05:39:49.059Z" }, + { url = "https://files.pythonhosted.org/packages/cd/04/8b5806bdbfabdb51fd2816deac6870d031560f0bbd90d9729ac86b903579/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1258368551e0b235d5b46c105137294cbb5ca683b2c13f5851f3ebec7f2d42b", size = 903602, upload-time = "2025-09-08T05:39:50.91Z" }, + { url = "https://files.pythonhosted.org/packages/75/4e/ec27837d5023b8db775db7798b3340eeb6bcb7f61ad64e892d4e1b14853e/python_calamine-0.5.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a7c51270e5ea518cb02cb531d84a2eb2de68da3cf48b26adae622f031dc5284", size = 948410, upload-time = "2025-09-08T05:39:53.286Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ba/8b5193637bfa0f363284974ae998f96fa1c8561a0a4d90378b0f202ac317/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e1d0df3d69b32da05e3e7648bb5802559d44979be721983f0d669b4128f920fa", size = 1067274, upload-time = "2025-09-08T05:39:55.469Z" }, + { url = "https://files.pythonhosted.org/packages/da/1c/506791e4c7078f2fed1ee2d69703d62c0acfd5b671db157bb755f47cff42/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6d674ae194744b6080f20a0b5a253a9976d632ee91dc00e13e539e968167cd35", size = 1073351, upload-time = "2025-09-08T05:39:57.685Z" }, + { url = "https://files.pythonhosted.org/packages/dc/83/e30e21484b1ed55668f67a63578d8a6ba70597a4d7ee8da23d759d3e1b3f/python_calamine-0.5.3-cp313-cp313-win32.whl", hash = "sha256:7a42ff0dae44457a4a3e65ea49357ffdf92e44f8b022ef1fb32c6498097d6d57", size = 669416, upload-time = "2025-09-08T05:39:59.901Z" }, + { url = "https://files.pythonhosted.org/packages/1d/8f/29c617e9548ed2704657ebaa7d79067cad06cbbf7dd432a6cacd4cc19d16/python_calamine-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:054aee805c2cd5ab9848c2b8459822f2581cf22af45ff60251c9f45585cc06e0", size = 712760, upload-time = "2025-09-08T05:40:01.799Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/d8117f99037100a28d17d9fbde121511c19d54ff4e5968d6aed693caeb87/python_calamine-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0e870f57651e2f76e7c1f009492aa342a7b1819f8b1131bf501240872777f944", size = 679372, upload-time = "2025-09-08T05:40:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/d9/0a/61949009a354af9ff5dc19e6816ae68a56281c0765520c9db4ff0ed20054/python_calamine-0.5.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e98c819cd43a7f0048f6d97c9d4ec23d72889cd722de1d6b68e0de24b1f8f037", size = 843418, upload-time = "2025-09-08T05:40:05.601Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/4cb7fa988d17c98a0be6e9f74561d8a2381f28a2b88adb89f16abe345d2f/python_calamine-0.5.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cf90ce46420545f922cde95004ea8d5efaf3864b5a380a5d1defc7abd219421a", size = 813611, upload-time = "2025-09-08T05:40:07.47Z" }, + { url = "https://files.pythonhosted.org/packages/01/34/4c2a6827da90f366be3fb9c7788f672f5e7d60808f9dbd01da5acc6f11ca/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e89caa6a1a55215be742cd44f6d94611fb6ab222a30325e772abc40566693e5", size = 888097, upload-time = "2025-09-08T05:40:09.256Z" }, + { url = "https://files.pythonhosted.org/packages/17/bc/ecf5f6ac95195dfd3e9d63ab8c60b78d6466009751dfb1cdacf71d5f5e19/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b13177e42dac8de57870995699b237ce5a7886d9bd7fb745a36f867e5d3d3e62", size = 880861, upload-time = "2025-09-08T05:40:11.637Z" }, + { url = "https://files.pythonhosted.org/packages/6e/55/8b60f99221a408f08db280b553aa4321c4cd9365e5c3101638249002d5a4/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:948e28b5f3246177440c70550661e0a27b414cb15535111fca7dbac2a63721b1", size = 1033023, upload-time = "2025-09-08T05:40:13.864Z" }, + { url = "https://files.pythonhosted.org/packages/05/c5/8c378d3c2c56d12606e20b59eee3538d3b1177fe00b103bb98ef15176610/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37fef2b67bcd66b5dfc65b0779da9522c82f1ef9f97fc6034848072ff60b3f7", size = 933097, upload-time = "2025-09-08T05:40:16.372Z" }, + { url = "https://files.pythonhosted.org/packages/26/04/cf14e91ac5c2d6d9795e1c39f3f53e0f173fcbaed4b00198e22a58265fdd/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddcef4e0e9d0479e027c90d9e1537bcf05de9bdd137cd7dfdbfc0034b1850973", size = 901917, upload-time = "2025-09-08T05:40:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2f/5b2065b9360bda792504fe3ac1cef6d9da51ceba6230ee7634886b44cce9/python_calamine-0.5.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6732b47f923102357bde348021a2892a41c2fb173958268c0a1ff8d5abb6b7e8", size = 943328, upload-time = "2025-09-08T05:40:20.302Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5a/45e4bd8473264b918d83297d15f160471029390cd06ed0056fc57e8f29eb/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:543db1b886cf994aaf7da0752022b37c42c05acb7605b56d09047023c8387610", size = 1065993, upload-time = "2025-09-08T05:40:22.528Z" }, + { url = "https://files.pythonhosted.org/packages/35/6b/2afd47608495f23408bdf2f1ff57a144700aed8b5bbe50285ac4864edf53/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b79135dd96129253dc0e547778c700e1e3782e7671e7047c8b106b5501e33706", size = 1071801, upload-time = "2025-09-08T05:40:24.481Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/b06a15f25e63290c2efc5433fa8b395bfe870aacbf4ea6c930764d53eca6/python_calamine-0.5.3-cp313-cp313t-win32.whl", hash = "sha256:d84dc3b78adf038a2b452fc784523dcc90477f1631d33aabc0872812db5beb26", size = 669485, upload-time = "2025-09-08T05:40:26.818Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/e51adf1dae2002f189c83ae527aad017372d1a1b97a22172dc2e51ce502d/python_calamine-0.5.3-cp313-cp313t-win_amd64.whl", hash = "sha256:8a3fd541576fdf2708e40064ebaaf561a0a2afcab01de91c83ec212193bede34", size = 712636, upload-time = "2025-09-08T05:40:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/56/fa/db4dc8d27a5daa14a153aebc0cb98bad6fd700befd9e67440a8017f0e108/python_calamine-0.5.3-cp313-cp313t-win_arm64.whl", hash = "sha256:b28a9c9318a5e7dabcead1803bfd48be5bf7c9f339d6e505a5989650a6102487", size = 678307, upload-time = "2025-09-08T05:40:30.797Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7f/a098680c9d6ad36fe850f2c2c28627ee3bc95aaa052f375806f69c075475/python_calamine-0.5.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b5cdcd85cc08a1805d267fc66aa100940712de6b4524951ab91ba47fa60d481f", size = 843921, upload-time = "2025-09-08T05:40:32.418Z" }, + { url = "https://files.pythonhosted.org/packages/09/ce/3de5d714779fac6e3333e7ea98ce4eae3b2479eb8a3d2f7d9e4487e16681/python_calamine-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:828cd5d49fe9eb9c1fc9219fe484b07f2ba9a1e5e3b8475d7f1415e0fa316df8", size = 814173, upload-time = "2025-09-08T05:40:33.982Z" }, + { url = "https://files.pythonhosted.org/packages/cb/14/ef98575838091b6b24274160d53607e78df94f0176af360bcb063512e643/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d3f4d0532ab4de422fc4b707cdbb93d57ca7ccf9be8bc4742fb9376dc68f861", size = 888958, upload-time = "2025-09-08T05:40:35.576Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b1/c999dd1f89f415ff06f88f37bce643ece3c4d51ae051e0a143ff16f44c1c/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a9ba0a16e4335b676232ddbbea0fd09bfb94757ca6e4cf90ce1348aa843f3f", size = 880988, upload-time = "2025-09-08T05:40:37.264Z" }, + { url = "https://files.pythonhosted.org/packages/74/16/4984532280e4b2c81aa26ae57b37fc3eaeda414e46e2d9c6a9cfdb27cd56/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0928d0eb1cdea229464de280d0f7cd99314ba28cffd2c4d6c9ce6902f9d6d448", size = 1035685, upload-time = "2025-09-08T05:40:38.992Z" }, + { url = "https://files.pythonhosted.org/packages/cd/dc/91776b34ab09f36ea41449951148bef731f9b355a2d2b25d398eec774926/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f9519dd3b8814ef6e801b9797f918fe7a59937fac4784cb280c8350fb1a2cf", size = 933865, upload-time = "2025-09-08T05:40:41.089Z" }, + { url = "https://files.pythonhosted.org/packages/01/97/12deaff5e608207398a9f0eaa06447ed69e8c4873ee953be553f9440881a/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954cd764c6b24735c749a447523b4ccf4b9d2b7c231ddd304ed42c15afca9516", size = 902310, upload-time = "2025-09-08T05:40:43.222Z" }, + { url = "https://files.pythonhosted.org/packages/45/da/45063eee203f6c9d9436d29dfc0f01db85c9264c86d1e438c3b452d7e97f/python_calamine-0.5.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3f0e9c59fece6bbf1a916947fba33e9b635327eb165784d05efed40027164d1", size = 948143, upload-time = "2025-09-08T05:40:44.874Z" }, + { url = "https://files.pythonhosted.org/packages/33/07/0b661166dd58367bd5d6cc2bf8441f61004dd5ef2555ab224da97b1ac5d3/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:63bb47cc080d8eb9bc654f0961ada385b58a57d4628b0a33d1003c8f62e6ae3d", size = 1067181, upload-time = "2025-09-08T05:40:46.598Z" }, + { url = "https://files.pythonhosted.org/packages/5d/80/58b107dc2c2e6bad581f58f54b3ccb07705094ff23734c8dd30bd8aef4e8/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:adb62aab9b9298b2fc378b2aec6dd5802f7ee199c3431abae29368ef046f8005", size = 1072683, upload-time = "2025-09-08T05:40:48.629Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b4/667e40dbe7d4f19a2e69f9cd186e069cd3af0411a177aa2a90231e3e0b06/python_calamine-0.5.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1de68d2586df7a7a05a7779031dabd4c3d95d4738314ba82e943c8d3f36b5a67", size = 843526, upload-time = "2025-09-08T05:40:50.334Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f7/fb86da5920198a616583f07d1a395cb1241eafb930d5c33f597ae6664711/python_calamine-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c70033bbd59f05491743befec5e2a90784f4c8220e7379ce03e956bd1f475be", size = 811074, upload-time = "2025-09-08T05:40:52.168Z" }, + { url = "https://files.pythonhosted.org/packages/76/2e/5a5a618b351b75155fbb40ad88e166f17ccf202401dd4b830db05b2565a6/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f396a0e57b1a5462668fc247377714b5b4c061718c1863c00ddc64e770b0f1e", size = 887735, upload-time = "2025-09-08T05:40:53.86Z" }, + { url = "https://files.pythonhosted.org/packages/97/cf/3cfaa550eb1c9c5501728886c5e787c3ddeb34d8bf3e7e9fcaf9fc6fbd86/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce737cb19d3077cabe0acaecd6b55d5df75021a520c20b47e0c75b65b4bfa919", size = 882356, upload-time = "2025-09-08T05:40:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/88/b8/97f56e337149d0ce53399be9bd583f735dc1ea9abb2745ac902a09e8c401/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e54b30802fe089cc0c67c67407203412ec7144e84e0960e69c529c7170c37dae", size = 1033195, upload-time = "2025-09-08T05:40:57.819Z" }, + { url = "https://files.pythonhosted.org/packages/94/45/59a21a18c8e073d2f930a4a9c0c038207b82c5c996b67146fb76f3da2748/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5efc94c2e4119dc0da1e84d036f7e840fb0dd0850f4c10d3d166d725af0751af", size = 931846, upload-time = "2025-09-08T05:40:59.93Z" }, + { url = "https://files.pythonhosted.org/packages/36/47/715e0c0bc37ccce035ef4be1aa8eafa1e5abb6687af725cb47d81a18def7/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e33191a01d52f66dd6b029e99b6eda0245771c4f116c87ff0d5edf922dbbca", size = 902871, upload-time = "2025-09-08T05:41:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/ca/07/ac0cf8623765106794e297235d6dde3a728f18e61a536792189fca06f2ba/python_calamine-0.5.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85ceec02cb367cf87a72ba559db3279f3b4774edba9330eb77670587d4de95f4", size = 944438, upload-time = "2025-09-08T05:41:03.748Z" }, + { url = "https://files.pythonhosted.org/packages/88/98/c48c0b8be7fbae5f68b7c55a1ed4068d2c3dab64093e39733d43c23a7459/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:882400368f976ea489e47af04fde936b603c3efcf9ade1cd73e623c88fc4aa5c", size = 1066276, upload-time = "2025-09-08T05:41:05.408Z" }, + { url = "https://files.pythonhosted.org/packages/73/3a/bbf99531fec43bca2ab28948ab94d851db96c0364c76139dd746cab2f4f9/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ce2fe421d5564e5341f7a06b9c52b84603b48aa670426d44fffce705609a859b", size = 1073059, upload-time = "2025-09-08T05:41:07.75Z" }, ] [[package]] @@ -2444,9 +1749,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] @@ -2456,16 +1761,16 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload_time = "2025-03-11T12:27:27.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload-time = "2025-03-11T12:27:27.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload_time = "2025-03-11T12:27:25.014Z" }, + { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload-time = "2025-03-11T12:27:25.014Z" }, ] [[package]] name = "python-io-wrapper" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload_time = "2022-11-14T15:00:10.932Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload-time = "2022-11-14T15:00:10.932Z" } [[package]] name = "python-slugify" @@ -2474,60 +1779,44 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload_time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload_time = "2024-02-08T18:32:43.911Z" }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, -] - -[[package]] -name = "pywin32" -version = "311" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload_time = "2025-07-14T20:13:20.765Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload_time = "2025-07-14T20:13:22.543Z" }, - { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload_time = "2025-07-14T20:13:24.682Z" }, - { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload_time = "2025-07-14T20:13:26.471Z" }, - { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload_time = "2025-07-14T20:13:28.243Z" }, - { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload_time = "2025-07-14T20:13:30.348Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload_time = "2025-07-14T20:13:32.449Z" }, - { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload_time = "2025-07-14T20:13:34.312Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload_time = "2025-07-14T20:13:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -2537,59 +1826,16 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload_time = "2025-05-13T15:24:01.64Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload_time = "2025-05-13T15:23:59.629Z" }, -] - -[[package]] -name = "pyzmq" -version = "27.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload_time = "2025-09-08T23:10:18.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload_time = "2025-09-08T23:08:03.807Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload_time = "2025-09-08T23:08:05.301Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload_time = "2025-09-08T23:08:06.828Z" }, - { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload_time = "2025-09-08T23:08:08.396Z" }, - { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload_time = "2025-09-08T23:08:09.989Z" }, - { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload_time = "2025-09-08T23:08:11.907Z" }, - { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload_time = "2025-09-08T23:08:13.513Z" }, - { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload_time = "2025-09-08T23:08:15.163Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload_time = "2025-09-08T23:08:17.192Z" }, - { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload_time = "2025-09-08T23:08:18.926Z" }, - { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload_time = "2025-09-08T23:08:20.801Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload_time = "2025-09-08T23:08:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload_time = "2025-09-08T23:08:24.286Z" }, - { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload_time = "2025-09-08T23:08:26.063Z" }, - { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload_time = "2025-09-08T23:08:27.623Z" }, - { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload_time = "2025-09-08T23:08:29.672Z" }, - { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload_time = "2025-09-08T23:08:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload_time = "2025-09-08T23:08:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload_time = "2025-09-08T23:08:35.51Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload_time = "2025-09-08T23:08:37.178Z" }, - { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload_time = "2025-09-08T23:08:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload_time = "2025-09-08T23:08:42.668Z" }, - { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload_time = "2025-09-08T23:08:44.973Z" }, - { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload_time = "2025-09-08T23:08:46.601Z" }, - { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload_time = "2025-09-08T23:08:48.187Z" }, - { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload_time = "2025-09-08T23:08:49.76Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload_time = "2025-09-08T23:08:51.7Z" }, - { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload_time = "2025-09-08T23:08:53.393Z" }, - { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload_time = "2025-09-08T23:08:55.702Z" }, - { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload_time = "2025-09-08T23:08:58.18Z" }, - { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload_time = "2025-09-08T23:08:59.802Z" }, - { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload_time = "2025-09-08T23:09:01.418Z" }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] [[package]] name = "ratelimit" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload_time = "2018-12-17T18:55:49.675Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload-time = "2018-12-17T18:55:49.675Z" } [[package]] name = "referencing" @@ -2600,9 +1846,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -2615,9 +1861,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload_time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload_time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] [[package]] @@ -2632,9 +1878,9 @@ dependencies = [ { name = "url-normalize" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1", size = 3018209, upload_time = "2024-06-18T17:18:03.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1", size = 3018209, upload-time = "2024-06-18T17:18:03.774Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603", size = 61425, upload_time = "2024-06-18T17:17:45Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603", size = 61425, upload-time = "2024-06-18T17:17:45Z" }, ] [[package]] @@ -2644,9 +1890,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload_time = "2024-05-21T16:28:00.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload-time = "2024-05-21T16:28:00.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload_time = "2024-05-21T16:27:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload-time = "2024-05-21T16:27:57.733Z" }, ] [[package]] @@ -2663,18 +1909,18 @@ dependencies = [ { name = "python-debian" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/f7/b59fe851b856d0932aedbf311a3d719f30783e27af6d05bb76d77072ab8f/reuse-5.1.1.tar.gz", hash = "sha256:a13914ed8b66b8e5956e96c63203c63d72b55280d348849ccc0eb314c73248cb", size = 419022, upload_time = "2025-09-05T14:50:01.049Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/f7/b59fe851b856d0932aedbf311a3d719f30783e27af6d05bb76d77072ab8f/reuse-5.1.1.tar.gz", hash = "sha256:a13914ed8b66b8e5956e96c63203c63d72b55280d348849ccc0eb314c73248cb", size = 419022, upload-time = "2025-09-05T14:50:01.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/95/12451ff8bc2c3e8a5755bc810a538de85444015d44353fc6f7ee8800c0bb/reuse-5.1.1-cp313-cp313-manylinux_2_41_x86_64.whl", hash = "sha256:15a68341949b7ddb3630d8d3a49d9537bbc143ee235dca77cc3f4047237c8299", size = 255386, upload_time = "2025-09-05T14:49:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/c9/95/12451ff8bc2c3e8a5755bc810a538de85444015d44353fc6f7ee8800c0bb/reuse-5.1.1-cp313-cp313-manylinux_2_41_x86_64.whl", hash = "sha256:15a68341949b7ddb3630d8d3a49d9537bbc143ee235dca77cc3f4047237c8299", size = 255386, upload-time = "2025-09-05T14:49:58.576Z" }, ] [[package]] name = "rfc3986" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload_time = "2022-01-10T00:52:30.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload_time = "2022-01-10T00:52:29.594Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, ] [[package]] @@ -2685,90 +1931,90 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload_time = "2025-07-25T07:32:58.125Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload_time = "2025-07-25T07:32:56.73Z" }, + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, ] [[package]] name = "rpds-py" version = "0.27.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload_time = "2025-08-27T12:16:36.024Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload_time = "2025-08-27T12:13:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload_time = "2025-08-27T12:13:11.65Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload_time = "2025-08-27T12:13:13.008Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload_time = "2025-08-27T12:13:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload_time = "2025-08-27T12:13:15.774Z" }, - { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload_time = "2025-08-27T12:13:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload_time = "2025-08-27T12:13:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload_time = "2025-08-27T12:13:20.089Z" }, - { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload_time = "2025-08-27T12:13:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload_time = "2025-08-27T12:13:22.789Z" }, - { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload_time = "2025-08-27T12:13:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload_time = "2025-08-27T12:13:25.557Z" }, - { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload_time = "2025-08-27T12:13:26.967Z" }, - { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload_time = "2025-08-27T12:13:28.326Z" }, - { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload_time = "2025-08-27T12:13:29.71Z" }, - { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload_time = "2025-08-27T12:13:31.039Z" }, - { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload_time = "2025-08-27T12:13:32.902Z" }, - { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload_time = "2025-08-27T12:13:34.228Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload_time = "2025-08-27T12:13:36.132Z" }, - { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload_time = "2025-08-27T12:13:37.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload_time = "2025-08-27T12:13:38.94Z" }, - { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload_time = "2025-08-27T12:13:40.192Z" }, - { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload_time = "2025-08-27T12:13:41.496Z" }, - { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload_time = "2025-08-27T12:13:42.802Z" }, - { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload_time = "2025-08-27T12:13:44.472Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload_time = "2025-08-27T12:13:45.898Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload_time = "2025-08-27T12:13:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload_time = "2025-08-27T12:13:48.742Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload_time = "2025-08-27T12:13:50.11Z" }, - { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload_time = "2025-08-27T12:13:52.587Z" }, - { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload_time = "2025-08-27T12:13:54.012Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload_time = "2025-08-27T12:13:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload_time = "2025-08-27T12:13:57.683Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload_time = "2025-08-27T12:13:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload_time = "2025-08-27T12:14:00.583Z" }, - { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload_time = "2025-08-27T12:14:02.034Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload_time = "2025-08-27T12:14:03.437Z" }, - { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload_time = "2025-08-27T12:14:05.443Z" }, - { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload_time = "2025-08-27T12:14:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload_time = "2025-08-27T12:14:08.37Z" }, - { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload_time = "2025-08-27T12:14:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload_time = "2025-08-27T12:14:11.783Z" }, - { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload_time = "2025-08-27T12:14:13.629Z" }, - { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload_time = "2025-08-27T12:14:14.937Z" }, - { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload_time = "2025-08-27T12:14:16.333Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload_time = "2025-08-27T12:14:17.764Z" }, - { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload_time = "2025-08-27T12:14:19.829Z" }, - { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload_time = "2025-08-27T12:14:21.531Z" }, - { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload_time = "2025-08-27T12:14:23.485Z" }, - { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload_time = "2025-08-27T12:14:24.924Z" }, - { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload_time = "2025-08-27T12:14:27.537Z" }, - { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload_time = "2025-08-27T12:14:28.981Z" }, - { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload_time = "2025-08-27T12:14:30.469Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload_time = "2025-08-27T12:14:31.987Z" }, - { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload_time = "2025-08-27T12:14:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload_time = "2025-08-27T12:14:35.436Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload_time = "2025-08-27T12:14:36.898Z" }, - { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload_time = "2025-08-27T12:14:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload_time = "2025-08-27T12:14:39.82Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload_time = "2025-08-27T12:14:41.199Z" }, - { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload_time = "2025-08-27T12:14:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload_time = "2025-08-27T12:14:44.157Z" }, - { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload_time = "2025-08-27T12:14:45.845Z" }, - { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload_time = "2025-08-27T12:14:47.364Z" }, - { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload_time = "2025-08-27T12:14:49.991Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload_time = "2025-08-27T12:14:52.159Z" }, - { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload_time = "2025-08-27T12:14:53.859Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload_time = "2025-08-27T12:14:55.673Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload_time = "2025-08-27T12:14:57.245Z" }, - { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload_time = "2025-08-27T12:14:58.728Z" }, - { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload_time = "2025-08-27T12:15:00.334Z" }, - { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload_time = "2025-08-27T12:15:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload_time = "2025-08-27T12:15:03.961Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, ] [[package]] @@ -2778,35 +2024,35 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload_time = "2025-08-19T11:15:10.694Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload-time = "2025-08-19T11:15:10.694Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload_time = "2025-08-19T11:15:07.696Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload-time = "2025-08-19T11:15:07.696Z" }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" }, ] [[package]] @@ -2817,43 +2063,9 @@ dependencies = [ { name = "click" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload_time = "2023-07-01T13:31:49.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload-time = "2023-07-01T13:31:49.607Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload_time = "2023-07-01T13:31:48.005Z" }, -] - -[[package]] -name = "scikit-learn" -version = "1.7.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "numpy" }, - { name = "scipy" }, - { name = "threadpoolctl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload_time = "2025-09-09T08:21:29.075Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload_time = "2025-09-09T08:20:43.19Z" }, - { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload_time = "2025-09-09T08:20:45.468Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload_time = "2025-09-09T08:20:47.982Z" }, - { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload_time = "2025-09-09T08:20:50.366Z" }, - { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload_time = "2025-09-09T08:20:52.627Z" }, - { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload_time = "2025-09-09T08:20:54.731Z" }, - { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload_time = "2025-09-09T08:20:57.313Z" }, - { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload_time = "2025-09-09T08:20:59.671Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload_time = "2025-09-09T08:21:01.71Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload_time = "2025-09-09T08:21:04.234Z" }, - { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload_time = "2025-09-09T08:21:06.381Z" }, - { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload_time = "2025-09-09T08:21:08.628Z" }, - { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload_time = "2025-09-09T08:21:11.486Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload_time = "2025-09-09T08:21:13.602Z" }, - { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload_time = "2025-09-09T08:21:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload_time = "2025-09-09T08:21:18.557Z" }, - { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload_time = "2025-09-09T08:21:20.695Z" }, - { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload_time = "2025-09-09T08:21:22.645Z" }, - { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload_time = "2025-09-09T08:21:24.65Z" }, - { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload_time = "2025-09-09T08:21:26.713Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload-time = "2023-07-01T13:31:48.005Z" }, ] [[package]] @@ -2863,126 +2075,112 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599, upload_time = "2025-09-11T17:48:08.271Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259, upload_time = "2025-09-11T17:40:39.329Z" }, - { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976, upload_time = "2025-09-11T17:40:46.82Z" }, - { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905, upload_time = "2025-09-11T17:40:52.545Z" }, - { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066, upload_time = "2025-09-11T17:40:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407, upload_time = "2025-09-11T17:41:06.796Z" }, - { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281, upload_time = "2025-09-11T17:41:15.055Z" }, - { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222, upload_time = "2025-09-11T17:41:23.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586, upload_time = "2025-09-11T17:41:31.021Z" }, - { url = "https://files.pythonhosted.org/packages/34/95/20e02ca66fb495a95fba0642fd48e0c390d0ece9b9b14c6e931a60a12dea/scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e", size = 38550641, upload_time = "2025-09-11T17:41:36.61Z" }, - { url = "https://files.pythonhosted.org/packages/92/ad/13646b9beb0a95528ca46d52b7babafbe115017814a611f2065ee4e61d20/scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851", size = 25456070, upload_time = "2025-09-11T17:41:41.3Z" }, - { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856, upload_time = "2025-09-11T17:41:47.695Z" }, - { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626, upload_time = "2025-09-11T17:41:52.642Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689, upload_time = "2025-09-11T17:41:57.886Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151, upload_time = "2025-09-11T17:42:02.303Z" }, - { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824, upload_time = "2025-09-11T17:42:07.549Z" }, - { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881, upload_time = "2025-09-11T17:42:13.255Z" }, - { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219, upload_time = "2025-09-11T17:42:18.765Z" }, - { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147, upload_time = "2025-09-11T17:42:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766, upload_time = "2025-09-11T17:43:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169, upload_time = "2025-09-11T17:43:30.198Z" }, - { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682, upload_time = "2025-09-11T17:42:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926, upload_time = "2025-09-11T17:42:35.845Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152, upload_time = "2025-09-11T17:42:40.07Z" }, - { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410, upload_time = "2025-09-11T17:42:44.313Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880, upload_time = "2025-09-11T17:42:49.325Z" }, - { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425, upload_time = "2025-09-11T17:42:54.711Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622, upload_time = "2025-09-11T17:43:00.375Z" }, - { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985, upload_time = "2025-09-11T17:43:06.661Z" }, - { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367, upload_time = "2025-09-11T17:43:14.44Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992, upload_time = "2025-09-11T17:43:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109, upload_time = "2025-09-11T17:43:35.713Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110, upload_time = "2025-09-11T17:43:40.814Z" }, - { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110, upload_time = "2025-09-11T17:43:44.981Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014, upload_time = "2025-09-11T17:43:49.074Z" }, - { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155, upload_time = "2025-09-11T17:43:54.661Z" }, - { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174, upload_time = "2025-09-11T17:44:00.101Z" }, - { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752, upload_time = "2025-09-11T17:44:05.619Z" }, - { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010, upload_time = "2025-09-11T17:44:11.322Z" }, - { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061, upload_time = "2025-09-11T17:45:09.814Z" }, - { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914, upload_time = "2025-09-11T17:45:14.73Z" }, - { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193, upload_time = "2025-09-11T17:44:16.757Z" }, - { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172, upload_time = "2025-09-11T17:44:21.783Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326, upload_time = "2025-09-11T17:44:25.982Z" }, - { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036, upload_time = "2025-09-11T17:44:30.527Z" }, - { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341, upload_time = "2025-09-11T17:44:35.981Z" }, - { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840, upload_time = "2025-09-11T17:44:41.76Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716, upload_time = "2025-09-11T17:44:47.316Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088, upload_time = "2025-09-11T17:44:53.011Z" }, - { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455, upload_time = "2025-09-11T17:44:58.899Z" }, - { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374, upload_time = "2025-09-11T17:45:03.45Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599, upload-time = "2025-09-11T17:48:08.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259, upload-time = "2025-09-11T17:40:39.329Z" }, + { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976, upload-time = "2025-09-11T17:40:46.82Z" }, + { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905, upload-time = "2025-09-11T17:40:52.545Z" }, + { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066, upload-time = "2025-09-11T17:40:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407, upload-time = "2025-09-11T17:41:06.796Z" }, + { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281, upload-time = "2025-09-11T17:41:15.055Z" }, + { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222, upload-time = "2025-09-11T17:41:23.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586, upload-time = "2025-09-11T17:41:31.021Z" }, + { url = "https://files.pythonhosted.org/packages/34/95/20e02ca66fb495a95fba0642fd48e0c390d0ece9b9b14c6e931a60a12dea/scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e", size = 38550641, upload-time = "2025-09-11T17:41:36.61Z" }, + { url = "https://files.pythonhosted.org/packages/92/ad/13646b9beb0a95528ca46d52b7babafbe115017814a611f2065ee4e61d20/scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851", size = 25456070, upload-time = "2025-09-11T17:41:41.3Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856, upload-time = "2025-09-11T17:41:47.695Z" }, + { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626, upload-time = "2025-09-11T17:41:52.642Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689, upload-time = "2025-09-11T17:41:57.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151, upload-time = "2025-09-11T17:42:02.303Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824, upload-time = "2025-09-11T17:42:07.549Z" }, + { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881, upload-time = "2025-09-11T17:42:13.255Z" }, + { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219, upload-time = "2025-09-11T17:42:18.765Z" }, + { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147, upload-time = "2025-09-11T17:42:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766, upload-time = "2025-09-11T17:43:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169, upload-time = "2025-09-11T17:43:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682, upload-time = "2025-09-11T17:42:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926, upload-time = "2025-09-11T17:42:35.845Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152, upload-time = "2025-09-11T17:42:40.07Z" }, + { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410, upload-time = "2025-09-11T17:42:44.313Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880, upload-time = "2025-09-11T17:42:49.325Z" }, + { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425, upload-time = "2025-09-11T17:42:54.711Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622, upload-time = "2025-09-11T17:43:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985, upload-time = "2025-09-11T17:43:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367, upload-time = "2025-09-11T17:43:14.44Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992, upload-time = "2025-09-11T17:43:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109, upload-time = "2025-09-11T17:43:35.713Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110, upload-time = "2025-09-11T17:43:40.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110, upload-time = "2025-09-11T17:43:44.981Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014, upload-time = "2025-09-11T17:43:49.074Z" }, + { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155, upload-time = "2025-09-11T17:43:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174, upload-time = "2025-09-11T17:44:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752, upload-time = "2025-09-11T17:44:05.619Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010, upload-time = "2025-09-11T17:44:11.322Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061, upload-time = "2025-09-11T17:45:09.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914, upload-time = "2025-09-11T17:45:14.73Z" }, + { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193, upload-time = "2025-09-11T17:44:16.757Z" }, + { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172, upload-time = "2025-09-11T17:44:21.783Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326, upload-time = "2025-09-11T17:44:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036, upload-time = "2025-09-11T17:44:30.527Z" }, + { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341, upload-time = "2025-09-11T17:44:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840, upload-time = "2025-09-11T17:44:41.76Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716, upload-time = "2025-09-11T17:44:47.316Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088, upload-time = "2025-09-11T17:44:53.011Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455, upload-time = "2025-09-11T17:44:58.899Z" }, + { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374, upload-time = "2025-09-11T17:45:03.45Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "simpleeval" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload_time = "2024-11-02T10:29:46.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload-time = "2024-11-02T10:29:46.912Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload_time = "2024-11-02T10:29:45.706Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload-time = "2024-11-02T10:29:45.706Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "soupsieve" version = "2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload_time = "2025-08-27T15:39:51.78Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload_time = "2025-08-27T15:39:50.179Z" }, -] - -[[package]] -name = "stack-data" -version = "0.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pure-eval" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, ] [[package]] name = "structlog" version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload_time = "2025-06-02T08:21:12.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload-time = "2025-06-02T08:21:12.971Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload_time = "2025-06-02T08:21:11.43Z" }, + { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload-time = "2025-06-02T08:21:11.43Z" }, ] [[package]] @@ -2994,18 +2192,18 @@ dependencies = [ { name = "pyyaml" }, { name = "xlsxwriter" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload_time = "2023-02-01T21:53:17.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/2d/5b5c0127e959a715c5365b3b491846fba5bc1fb7f94370cc3a4fb3f51f68/tableschema-to-template-0.0.13.tar.gz", hash = "sha256:2d8d2250efb840e0ecb9012c5e879a82ef68f65dd86bdff574200fdfc978ff1c", size = 13564, upload-time = "2023-02-01T21:53:17.238Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload_time = "2023-02-01T21:53:16.02Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7f/3c129377d9b815c0bb92b8c24bbecabe5e6b13b831f38924f80d2e5b40b2/tableschema_to_template-0.0.13-py3-none-any.whl", hash = "sha256:4905500a4235740654230c3223629d26fdccb7a0457ec1d0110ea102c4f1146c", size = 14860, upload-time = "2023-02-01T21:53:16.02Z" }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, ] [[package]] @@ -3014,11 +2212,11 @@ source = { editable = "." } dependencies = [ { name = "frozendict" }, { name = "hdx-python-country" }, - { name = "mypy" }, { name = "pandas" }, { name = "pint" }, { name = "pydantic" }, { name = "pydeflate" }, + { name = "python-calamine" }, { name = "requests" }, { name = "savepagenow" }, { name = "scipy" }, @@ -3026,7 +2224,7 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "ipykernel" }, + { name = "mypy" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -3036,36 +2234,26 @@ dev = [ ] docs = [ { name = "cairosvg" }, - { name = "gurobipy" }, { name = "mkdocs-argref-plugin" }, { name = "mkdocs-autolinks-plugin" }, - { name = "mkdocs-ezlinks-plugin" }, - { name = "mkdocs-git-committers-plugin" }, { name = "mkdocs-git-revision-date-localized-plugin" }, - { name = "mkdocs-jupyter" }, { name = "mkdocs-material" }, - { name = "mkdocs-minify-plugin" }, - { name = "mkdocs-open-in-new-tab" }, - { name = "mkdocs-redirects" }, { name = "mkdocs-table-reader-plugin" }, { name = "mkdocs-video" }, { name = "mkdocstrings" }, { name = "mkdocstrings-python" }, - { name = "openpyxl" }, { name = "pillow" }, - { name = "python-calamine" }, - { name = "tsam" }, ] [package.metadata] requires-dist = [ { name = "frozendict", specifier = ">=2.4.6" }, { name = "hdx-python-country", specifier = ">=3.9.6" }, - { name = "mypy", specifier = ">=1.15.0" }, { name = "pandas", specifier = ">=2.2.3" }, { name = "pint", specifier = ">=0.24.4" }, { name = "pydantic", specifier = ">=2.11.7" }, { name = "pydeflate", specifier = ">=2.3.3" }, + { name = "python-calamine", specifier = ">=0.4.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "savepagenow", specifier = ">=1.3.0" }, { name = "scipy", specifier = ">=1.16.1" }, @@ -3073,7 +2261,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "mypy", specifier = ">=1.15.0" }, { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pytest", specifier = ">=8.4.1" }, { name = "pytest-cov", specifier = ">=6.2.1" }, @@ -3083,52 +2271,33 @@ dev = [ ] docs = [ { name = "cairosvg", specifier = ">=2.8.2" }, - { name = "gurobipy", specifier = ">=12.0.3" }, { name = "mkdocs-argref-plugin", specifier = ">=0.5.0" }, { name = "mkdocs-autolinks-plugin", specifier = ">=0.7.1" }, - { name = "mkdocs-ezlinks-plugin", specifier = ">=0.1.14" }, - { name = "mkdocs-git-committers-plugin", specifier = ">=0.2.3" }, { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.4.7" }, - { name = "mkdocs-jupyter", specifier = ">=0.25.1" }, { name = "mkdocs-material", specifier = ">=9.6.14" }, - { name = "mkdocs-minify-plugin", specifier = ">=0.8.0" }, - { name = "mkdocs-open-in-new-tab", specifier = ">=1.0.8" }, - { name = "mkdocs-redirects", specifier = ">=1.2.2" }, { name = "mkdocs-table-reader-plugin", specifier = ">=3.1.0" }, { name = "mkdocs-video", specifier = ">=1.5.0" }, { name = "mkdocstrings", specifier = ">=0.29.1" }, { name = "mkdocstrings-python", specifier = ">=1.16.11" }, - { name = "openpyxl", specifier = ">=3.1.5" }, { name = "pillow", specifier = ">=11.3.0" }, - { name = "python-calamine", specifier = ">=0.4.0" }, - { name = "tsam", specifier = ">=2.3.9" }, ] [[package]] name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, ] [[package]] name = "text-unidecode" version = "1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, -] - -[[package]] -name = "threadpoolctl" -version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload_time = "2025-03-13T13:49:23.031Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload_time = "2025-03-13T13:49:21.846Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, ] [[package]] @@ -3138,76 +2307,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload_time = "2024-10-24T14:58:29.895Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload_time = "2024-10-24T14:58:28.029Z" }, + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, ] [[package]] name = "tomlkit" version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload_time = "2025-06-05T07:13:44.947Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload_time = "2025-06-05T07:13:43.546Z" }, -] - -[[package]] -name = "tornado" -version = "6.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821, upload_time = "2025-08-08T18:27:00.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563, upload_time = "2025-08-08T18:26:42.945Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729, upload_time = "2025-08-08T18:26:44.473Z" }, - { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295, upload_time = "2025-08-08T18:26:46.021Z" }, - { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644, upload_time = "2025-08-08T18:26:47.625Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878, upload_time = "2025-08-08T18:26:50.599Z" }, - { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549, upload_time = "2025-08-08T18:26:51.864Z" }, - { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973, upload_time = "2025-08-08T18:26:53.625Z" }, - { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954, upload_time = "2025-08-08T18:26:55.072Z" }, - { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023, upload_time = "2025-08-08T18:26:56.677Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427, upload_time = "2025-08-08T18:26:57.91Z" }, - { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456, upload_time = "2025-08-08T18:26:59.207Z" }, -] - -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, -] - -[[package]] -name = "traitlets" -version = "5.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, -] - -[[package]] -name = "tsam" -version = "2.3.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "highspy" }, - { name = "networkx" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "pyomo" }, - { name = "scikit-learn" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/67/c69f8c46fd46e01480ca10280ab612253255a729a850e2d61fdf0ea08258/tsam-2.3.9.tar.gz", hash = "sha256:1f219eef05788d199af1ff61bd5a3d9217a26f9279988b1ef4b7d5af2757ed15", size = 223755, upload_time = "2025-06-16T07:30:03.015Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/e7/5c072b990bddccc4a78a186d641e50257993c50658cddc0d4bf300acd1e1/tsam-2.3.9-py3-none-any.whl", hash = "sha256:edcc4febb9e1dacc028bc819d710974ede8f563467c3d235a250f46416f93a1b", size = 36816, upload_time = "2025-06-16T07:30:01.562Z" }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, ] [[package]] @@ -3217,9 +2328,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload_time = "2025-06-18T09:56:07.624Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload-time = "2025-06-18T09:56:07.624Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload_time = "2025-06-18T09:56:05.999Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload-time = "2025-06-18T09:56:05.999Z" }, ] [[package]] @@ -3232,18 +2343,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/ea/9cc57c3c627fd7a6a0907ea371019fe74c3ec00e3cf209a6864140a602ad/typer-0.19.1.tar.gz", hash = "sha256:cb881433a4b15dacc875bb0583d1a61e78497806741f9aba792abcab390c03e6", size = 104802, upload_time = "2025-09-20T08:59:22.692Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/ea/9cc57c3c627fd7a6a0907ea371019fe74c3ec00e3cf209a6864140a602ad/typer-0.19.1.tar.gz", hash = "sha256:cb881433a4b15dacc875bb0583d1a61e78497806741f9aba792abcab390c03e6", size = 104802, upload-time = "2025-09-20T08:59:22.692Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/fa/6473c00b5eb26a2ba427813107699d3e6f4e1a4afad3f7494b17bdef3422/typer-0.19.1-py3-none-any.whl", hash = "sha256:914b2b39a1da4bafca5f30637ca26fa622a5bf9f515e5fdc772439f306d5682a", size = 46876, upload_time = "2025-09-20T08:59:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/1e/fa/6473c00b5eb26a2ba427813107699d3e6f4e1a4afad3f7494b17bdef3422/typer-0.19.1-py3-none-any.whl", hash = "sha256:914b2b39a1da4bafca5f30637ca26fa622a5bf9f515e5fdc772439f306d5682a", size = 46876, upload-time = "2025-09-20T08:59:21.153Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload_time = "2025-08-25T13:49:26.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload_time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] @@ -3254,9 +2365,9 @@ dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload_time = "2023-05-24T20:25:47.612Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload_time = "2023-05-24T20:25:45.287Z" }, + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, ] [[package]] @@ -3266,27 +2377,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload_time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload_time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, ] [[package]] name = "unidecode" version = "1.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload_time = "2025-04-24T08:45:03.798Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload-time = "2025-04-24T08:45:03.798Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload_time = "2025-04-24T08:45:01.609Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload-time = "2025-04-24T08:45:01.609Z" }, ] [[package]] @@ -3296,27 +2407,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/31/febb777441e5fcdaacb4522316bf2a527c44551430a4873b052d545e3279/url_normalize-2.2.1.tar.gz", hash = "sha256:74a540a3b6eba1d95bdc610c24f2c0141639f3ba903501e61a52a8730247ff37", size = 18846, upload_time = "2025-04-26T20:37:58.553Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/31/febb777441e5fcdaacb4522316bf2a527c44551430a4873b052d545e3279/url_normalize-2.2.1.tar.gz", hash = "sha256:74a540a3b6eba1d95bdc610c24f2c0141639f3ba903501e61a52a8730247ff37", size = 18846, upload-time = "2025-04-26T20:37:58.553Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/d9/5ec15501b675f7bc07c5d16aa70d8d778b12375686b6efd47656efdc67cd/url_normalize-2.2.1-py3-none-any.whl", hash = "sha256:3deb687587dc91f7b25c9ae5162ffc0f057ae85d22b1e15cf5698311247f567b", size = 14728, upload_time = "2025-04-26T20:37:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d9/5ec15501b675f7bc07c5d16aa70d8d778b12375686b6efd47656efdc67cd/url_normalize-2.2.1-py3-none-any.whl", hash = "sha256:3deb687587dc91f7b25c9ae5162ffc0f057ae85d22b1e15cf5698311247f567b", size = 14728, upload-time = "2025-04-26T20:37:57.217Z" }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload_time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload_time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] [[package]] name = "validators" version = "0.35.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload_time = "2025-05-01T05:42:06.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", hash = "sha256:992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a", size = 73399, upload-time = "2025-05-01T05:42:06.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload_time = "2025-05-01T05:42:04.203Z" }, + { url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", hash = "sha256:e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd", size = 44712, upload-time = "2025-05-01T05:42:04.203Z" }, ] [[package]] @@ -3328,33 +2439,33 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload_time = "2025-08-13T14:24:07.464Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload_time = "2025-08-13T14:24:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] [[package]] @@ -3366,88 +2477,79 @@ dependencies = [ { name = "requests" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload_time = "2022-07-05T15:07:22.772Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload_time = "2022-07-05T15:07:20.606Z" }, -] - -[[package]] -name = "wcwidth" -version = "0.2.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload-time = "2022-07-05T15:07:22.772Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, + { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload-time = "2022-07-05T15:07:20.606Z" }, ] [[package]] name = "webencodings" version = "0.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload_time = "2017-04-05T20:21:34.189Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload_time = "2017-04-05T20:21:32.581Z" }, + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, ] [[package]] name = "wheel" version = "0.45.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, ] [[package]] name = "win32-setctime" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload_time = "2024-12-07T15:28:28.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload_time = "2024-12-07T15:28:26.465Z" }, + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, ] [[package]] name = "xlrd" version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload_time = "2025-06-14T08:46:39.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload-time = "2025-06-14T08:46:39.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload_time = "2025-06-14T08:46:37.766Z" }, + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, ] [[package]] name = "xlrd3" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload_time = "2021-04-25T12:27:10.03Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload-time = "2021-04-25T12:27:10.03Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload_time = "2021-04-25T12:26:55.264Z" }, + { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload-time = "2021-04-25T12:26:55.264Z" }, ] [[package]] name = "xlsx2csv" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload_time = "2024-11-19T17:06:07.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/20/94860286a308a4213581c1beacd4fc7be724250c03583fcff23aaa6107bb/xlsx2csv-0.8.4.tar.gz", hash = "sha256:2aa809888826f6af5b26c77fc7f613f2bbeada0d8cc09e5a58e0f59684bb6911", size = 221390, upload-time = "2024-11-19T17:06:07.818Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload_time = "2024-11-19T17:06:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c0/15c21556362c67f1155f3643a375d50ac67559b82c768e64e800a42a2577/xlsx2csv-0.8.4-py3-none-any.whl", hash = "sha256:52ab873fc7b2f2ca75d14aee8bd1985a9f5c1bcb3cc7b80df7a5d57a40a67473", size = 15904, upload-time = "2024-11-19T17:06:05.362Z" }, ] [[package]] name = "xlsxwriter" version = "3.2.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/2c/c06ef49dc36e7954e55b802a8b231770d286a9758b3d936bd1e04ce5ba88/xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c", size = 215940, upload_time = "2025-09-16T00:16:21.63Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/2c/c06ef49dc36e7954e55b802a8b231770d286a9758b3d936bd1e04ce5ba88/xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c", size = 215940, upload-time = "2025-09-16T00:16:21.63Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315, upload_time = "2025-09-16T00:16:20.108Z" }, + { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315, upload-time = "2025-09-16T00:16:20.108Z" }, ] [[package]] name = "xlwt" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload_time = "2017-08-22T06:47:16.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/97/56a6f56ce44578a69343449aa5a0d98eefe04085d69da539f3034e2cd5c1/xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88", size = 153929, upload-time = "2017-08-22T06:47:16.498Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload_time = "2017-08-22T06:47:15.281Z" }, + { url = "https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", size = 99981, upload-time = "2017-08-22T06:47:15.281Z" }, ] From 60976cfb16d81e3df4d6840fef230f5a1f898c48 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Mon, 31 Aug 2026 17:17:43 +0200 Subject: [PATCH 48/81] Add AI agent instructions (#112) * docs: add instruction files for AI coding agents Add AGENTS.md as the canonical agent instruction file, GitHub Copilot instructions at the canonical .github/ path for Copilot surfaces that do not yet read AGENTS.md, a pull request template, and shared Claude Code project permissions. Co-Authored-By: Claude Fable 5 * Remove GH Copilot specific instructions * Cleanup PR template * Review and complement agent instructions * Update AGENTS.md * docs: Add DataAccessor class to agents file --------- Co-authored-by: Claude Fable 5 --- .claude/settings.json | 13 ++++ .claude/settings.json.license | 3 + .github/PULL_REQUEST_TEMPLATE.md | 18 ++++++ AGENTS.md | 108 +++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+) create mode 100644 .claude/settings.json create mode 100644 .claude/settings.json.license create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 AGENTS.md diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 00000000..0bb88779 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Bash(uv sync:*)", + "Bash(uv run pytest:*)", + "Bash(uv run ruff:*)", + "Bash(uv run mypy:*)", + "Bash(uv run pre-commit:*)", + "Bash(uv run reuse:*)", + "Bash(uv run mkdocs build:*)" + ] + } +} diff --git a/.claude/settings.json.license b/.claude/settings.json.license new file mode 100644 index 00000000..d3ce8722 --- /dev/null +++ b/.claude/settings.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: technologydata contributors + +SPDX-License-Identifier: MIT diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..df24008e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ + + +# Summary + + + +## Checklist + +- [ ] Tests added/updated for the change and `uv run pytest` passes +- [ ] New files carry SPDX license info (checked by REUSE) +- [ ] `uv run pre-commit run --all-files` passes (lint, format, mypy, REUSE) +- [ ] Documentation/docstrings has been updated +- [ ] (If AI-assisted) Changes were reviewed by a human before opening this PR diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..9f71a28a --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,108 @@ +# AGENTS.md β€” instructions for AI coding agents + +`technologydata` is a Python package for managing techno-economic assumptions +(costs, efficiencies, lifetimes) for energy system models, with unit-aware +parameters, currency/inflation conversion, and data provenance tracking. +It is an open-source project (MIT for code, CC-BY-4.0 for processed data) +maintained by a community of maintainers, based on an initiative of Open Energy Transition and Technische UniversitΓ€t Berlin. + +## Layout + +- `src/technologydata/` β€” package source (src layout, installed editable). + Core classes: `DataPackage`, `TechnologyCollection`, `Technology`, + `Parameter`, `Source`, `SourceCollection`; equation system in + `equations.py` with defaults in `equations_data/default_equations.yaml` + (validated against `equations_data/default_equations.schema.json`). +- `src/technologydata/parsers/` β€” parsers for external data sources (e.g. + DEA energy storage). JSON files under `parsers/*/v*/` are parser output β€” + regenerate them via the parser, do not hand-edit. +- `src/technologydata/parsers/data_accessor.py` a `DataAccessor` class for + accessing external data either from the package or from a remote source. +- `test/` β€” pytest suite; shared fixtures in `test/conftest.py`, example + data in `test/test_data/`. +- `docs/` β€” MkDocs documentation (Material theme, `mkdocs.yaml`). + +## Setup + +Requires Python β‰₯ 3.12 and [uv](https://docs.astral.sh/uv/): + +```bash +uv sync # creates .venv, installs package (editable) + dev/docs groups +``` + +Run tools via `uv run ` (or `.venv/bin/`); no need to activate the venv. + +## Testing + +```bash +uv run pytest # full suite (coverage report is on by default) +uv run pytest -n auto # parallel via pytest-xdist +uv run pytest test/test_technology.py -k # single file / test +``` + +Add or update tests for any behavior change. Tests are exempt from the +annotation lint rules, but keep them typed where practical. + +## Linting, formatting, type checking + +Pre-commit is the single entry point β€” prefer it over calling tools directly: + +```bash +uv run pre-commit run --all-files +``` + +It runs ruff (lint + format), mypy in `--strict` mode, codespell, REUSE +license checks, YAML and Markdown formatting, and notebook cleanup. +Consequences for code you write: + +- Full type annotations everywhere (mypy strict); no relative imports. +- Docstrings are required (pydocstyle) and use NumPy style, matching the + existing code. +- pyupgrade targets modern syntax (e.g. `X | None`, builtin generics). +- Formatting with `black` style. + +## Licensing (REUSE) β€” applies to every new file + +The repo follows the [REUSE](https://reuse.software/) spec and CI enforces it. +Every new file needs SPDX copyright and license tags, either: + +- as an inline header β€” copy the two comment lines from the top of any + existing `.py` file (for Markdown, wrap them in an HTML comment), or +- via a `.license` companion file, or an entry in `REUSE.toml` + (root `*.md`, `*.yaml`, and `docs/**` are already covered there). + +Code is MIT; processed/derived data files are CC-BY-4.0. +Copyright statement does not include a year, copyright holders are "technologydata contributors". +Check with `uv run reuse lint`. + +## Conventions + +- Data models are pydantic v2 (`pydantic.BaseModel`, `Annotated[..., + pydantic.Field(...)]`); validation happens at instantiation. +- Physical units use pint via the custom registry in + `src/technologydata/utils/units.py`; currency/inflation via pydeflate; + country/currency codes via hdx-python-country. +- `Parameter` and `Technology` track provenance β€” preserve source and + transformation history when adding transformations. +- Commit messages loosely follow Conventional Commits + (`feat(technology): ...`, `fix: ...`, `docs: ...`, `dep: ...`). + +## Pull requests + +- Branch from `master`; open PRs against `master` on + `open-energy-transition/technology-data`. +- Before pushing: `uv run pre-commit run --all-files` and `uv run pytest` + must both pass (CI runs the same; pre-commit.ci auto-fixes formatting on PRs). +- Do not commit `.venv/`, caches, `.coverage`, or notebook outputs + (a pre-commit hook strips notebook metadata). +- Human contributor guide: `docs/contributing/instructions.md`. + +## Documentation + +```bash +uv run mkdocs serve # live preview +uv run mkdocs build # strict build, same as Read the Docs +``` + +Public API docs are generated with mkdocstrings from docstrings β€” keeping +docstrings accurate updates the docs. From bfd0e7aa3380d0869f4c296ed1458f04be9874b1 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 31 Aug 2026 17:18:09 +0200 Subject: [PATCH 49/81] doc: update documentation on usage of sources.json (#120) --- docs/user_guide/datapackage.md | 20 +++++++++++++++++++- src/technologydata/datapackage.py | 10 ++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/docs/user_guide/datapackage.md b/docs/user_guide/datapackage.md index e70a548d..dda9507c 100644 --- a/docs/user_guide/datapackage.md +++ b/docs/user_guide/datapackage.md @@ -52,7 +52,25 @@ dp = DataPackage.from_json( ) ``` -This will automatically extract sources from the technologies if not already present. +#### Understanding JSON Round-Trip Behavior + +**Important:** `DataPackage.to_json()` writes both `technologies.json` and `sources.json`, +but `DataPackage.from_json()` **only reads `technologies.json`**. This is intentional, +not a bug. + +**Why this design?** + +- `sources.json` is a **derived/informative output** for human readability and provenance tracking +- All source information is already embedded in the parameter objects within `technologies.json` +- When loading, sources are automatically re-extracted from the technology parameters +- This ensures the sources collection always reflects the actual sources referenced in the data + +**When to use `sources.json`:** + +- For standalone source collection management via `SourceCollection.from_json()` +- For human review of all sources cited in a dataset +- For generating bibliography or citation lists +- For archival/documentation purposes ### Exporting to JSON diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index 71f6943d..60a60bd7 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -106,6 +106,16 @@ def from_json( DataPackage The loaded DataPackage instance. + Notes + ----- + This method only loads ``technologies.json`` and derives the sources + collection from the technology parameters. The ``sources.json`` file, + if present, is intentionally ignored as it is a derived/informative + output. All source information is already contained within the + technology parameters in ``technologies.json``. + To load a standalone ``SourceCollection`` from ``sources.json``, + use ``SourceCollection.from_json()`` instead. + """ # Load technologies technologies_path = pathlib.Path(path_to_folder, "technologies.json") From 58953034be3d379b8d49dfdd2f07443bc687a05a Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:50:01 +0200 Subject: [PATCH 50/81] Equation system to automatically calculate linked parameters (#102) * code: Add sympy dependency * docs: First draft for feature * Rename "formulas" to "equations" * code: Initial commit of AI vibes * code: Consider parameters of different currency / currency year incompatible * code: Test for unit compatibility on input parameters with currency unit * code: Do not test for identical currencies - not needed * Simplification of code and cleanup AI slop * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Simplify code * code: Add overdue dependency * code: Fix non-working unit tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add equation registry listing API and name indexing * Add Equation REPL repr with expression truncation * Cache equation symbolic solves at registration * feat(equations): add YAML equation loading and priority-based selection * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * feat(technology): enhance consistency checks and parameter comparison * Simplify consistency check code * dep: add types for YAML to satisfy ruff * Remove copilot instructions * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add human-readable __str__ for Parameter Renders magnitude, units, carrier, and heating value as one string, reusing pint's Quantity formatting. Will be used by equation-derived provenance entries to describe input values. Co-Authored-By: Claude Sonnet 5 * Restructure Parameter.provenance as an ordered history list Parameter.provenance changes from a flat str|None to list[str], where each entry describes one event in the parameter's history (sourced from literature, parsed from a file, calculated from a formula, etc). Arithmetic operators now combine provenance via plain list concatenation, replacing the previous ad-hoc string-glue. Equation-derived parameters get a properly detailed entry: that the value was calculated from other parameters, the formula's name and expression, and the concrete input values (via Parameter.__str__) used to solve it - previously provenance was just the bare equation name. This is a breaking change to Parameter's field type and JSON shape; checked-in reference data (parser outputs, test fixtures) is updated to match, re-serialized through the library's own to_json for canonical formatting. Co-Authored-By: Claude Sonnet 5 * Add human-readable __str__ for Equation Renders the equation as "name: expr = 0 (description)", untruncated, for use in REPL/notebook display and error messages - complementing the existing developer-facing __repr__. Co-Authored-By: Claude Sonnet 5 * Add calculate_parameters and check_consistency to TechnologyCollection Mirrors the existing Technology methods across every technology in the collection, following the same delegate-per-technology pattern already used by to_currency. calculate_parameters returns a new collection with derived parameters added; check_consistency returns one status dict per technology, aligned with `technologies` order. This fulfills the collection-level API already documented (but not implemented) in docs/user_guide/design.md. Co-Authored-By: Claude Sonnet 5 * Simplify equation solving and consistency-check code - Extract the duplicated evaluate-and-validate pattern in Equation.solve_for into a _evaluate_solution helper, replacing the nested try/except fallback blocks; use math.isnan instead of the mag == mag idiom. - Build the step-2 magnitude substitutions from the already-computed input_params (also guarantees the target is never substituted). - Flatten Equation.can_solve_for to a single boolean expression. - Technology.check_consistency: compute the missing-parameters list once and classify statuses with it; fix the return annotation to dict[str, bool | str] (it stores bools too), here and in the TechnologyCollection mirror. Co-Authored-By: Claude Fable 5 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs: fix stale examples and broken markdown in the equations user guide - Replace the reference to the non-existent Technology.remove_parameters method with regular dict modification (del tech.parameters[...]). - Correct the list_equations example output to the actual summary keys (priority/description instead of the removed default flag). - Repair the mangled code fencing in the custom-registry / YAML-loading example so it reads as one coherent Python block. Co-Authored-By: Claude Fable 5 * Document API improvement proposals for later implementation Collects the API gaps and cleanups flagged during the formula-system review: docs-promised-but-missing methods (collection indexing, optional get() filters, public registry removal/lookup), custom-registry plumbing for calculate_parameters, Parameter and collection conveniences, provenance recording in transformations, the deferred behavior-preserving simplifications, and explicitly rejected ideas with reasons. Co-Authored-By: Claude Fable 5 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * doc: Prefer pop over del * Make Parameter.provenance optional again The field becomes list[str] | None with default None, so parameters without any recorded history serialize as null instead of []. The arithmetic operators guard the history concatenation accordingly, and the manual_input_usa reference output is regenerated by its parser (which never sets provenance). Co-Authored-By: Claude Fable 5 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs: Simplify description * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: Remove unnecessary exception * code: Address mypy concerns * code: Move import statement to top of file * doc: Fix outdated docs * code/docs: Address mypy warnings * code: Revert removed currency unit check for parameter arithmetic --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 --- .github/instructions/copilot-instructions.md | 50 - MANIFEST.in | 2 + docs/api/equations.md | 3 + .../contributing/api_improvement_proposals.md | 129 + docs/user_guide/equations.md | 428 +++ docs/user_guide/parameter.md | 8 +- docs/user_guide/technology.md | 104 +- docs/user_guide/technology_collection.md | 30 + mkdocs.yaml | 2 + pyproject.toml | 7 + src/technologydata/__init__.py | 8 + src/technologydata/default_equations.py | 41 + src/technologydata/equations.py | 741 ++++ .../default_equations.schema.json | 42 + .../default_equations.schema.json.license | 3 + .../equations_data/default_equations.yaml | 49 + src/technologydata/parameter.py | 98 +- .../parsers/dea_energy_storage/parser_v10.py | 2 +- .../dea_energy_storage/v10/technologies.json | 3256 ++++++++++++----- src/technologydata/technology.py | 178 +- src/technologydata/technology_collection.py | 94 +- .../technologies.json | 40 +- test/test_equations.py | 1175 ++++++ test/test_parameter.py | 82 +- test/test_technology.py | 239 +- test/test_technology_collection.py | 98 + uv.lock | 2972 +++++++++------ 27 files changed, 7804 insertions(+), 2077 deletions(-) delete mode 100644 .github/instructions/copilot-instructions.md create mode 100644 docs/api/equations.md create mode 100644 docs/contributing/api_improvement_proposals.md create mode 100644 docs/user_guide/equations.md create mode 100644 src/technologydata/default_equations.py create mode 100755 src/technologydata/equations.py create mode 100644 src/technologydata/equations_data/default_equations.schema.json create mode 100644 src/technologydata/equations_data/default_equations.schema.json.license create mode 100644 src/technologydata/equations_data/default_equations.yaml create mode 100644 test/test_equations.py diff --git a/.github/instructions/copilot-instructions.md b/.github/instructions/copilot-instructions.md deleted file mode 100644 index 66d55c46..00000000 --- a/.github/instructions/copilot-instructions.md +++ /dev/null @@ -1,50 +0,0 @@ -# Copilot Coding Agent Instructions for `technologydata` - - - -## Project Overview - -- `technologydata` is a Python package for energy system modellers to screen, harmonize, and transform techno-economic input data for energy system models. -- Major use cases: data validation, harmonization, transformation to model-ready formats, and provenance/audit tracing. -- Core classes: `DataPackage`, `Technology`, `Parameter`, `Source`, and `SourceCollection` (see `technologydata/`). -- Data flows: Input data (JSON or DataFrame) β†’ `DataPackage`/`Technology` objects β†’ validation/transformation β†’ output for modeling/analysis. - -## Key Workflows - -- **Install dependencies:** Use `uv` (see `pyproject.toml`, `uv.lock`). Example: `uv sync`. -- **Activate virtual environment:** Use `source .venv/bin/activate` before running commands. -- **Linting/formatting:** Use `ruff` (`ruff check .` and `ruff format .`). -- **Type checking:** Use `mypy`. -- **Testing:** Use `pytest` (tests in `test/`). Fixtures in `test/conftest.py`. Run: `pytest`. -- **Pre-commit hooks:** Set up with `pre-commit` using `.pre-commit-config.yaml`, use this preferably over using `mypy` and `ruff` manually. -- **Docs:** Built with `mkdocs` (see `docs/`). - -## Project-Specific Patterns - -- **Validation:** Instantiating `Technology` or `DataPackage` triggers schema validation. Use `.check_consistency()` and `.calculate_parameters()` for further checks and derivations. -- **Parameter Derivation:** Use `.calculate_parameters()` to fill in missing values based on rules. -- **Unit Handling:** Uses `pint` for units and `pydeflate` for currency/inflation adjustments. Custom `UnitRegistry` in `technologydata/utils/units.py`. -- **Data Provenance:** Each `Parameter` and `Technology` tracks its source and transformation history. -- **Data Input:** Prefer JSON conforming to the internal schema. See `test/test_data/` for examples. - -## External Integrations - -- `pydeflate` for currency/inflation -- `pint` for units -- `hdx.location.country` for country/currency codes -- `savepagenow` for web archiving - -## References - -- Design: `docs/design.md` -- Class diagram: `docs/class-diagram.puml` -- Example data: `test/test_data/` - ---- - -If any conventions or workflows are unclear, please ask for clarification or check `docs/design.md` for rationale and details. diff --git a/MANIFEST.in b/MANIFEST.in index e9341945..f4965340 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,6 @@ include src/technologydata/utils/*.txt +include src/technologydata/equations_data/*.yaml +include src/technologydata/equations_data/*.json include src/technologydata/parsers/dea_energy_storage/v10/*.json include src/technologydata/parsers/manual_input_usa/v0.13.4/*.json include src/technologydata/parsers/raw/* diff --git a/docs/api/equations.md b/docs/api/equations.md new file mode 100644 index 00000000..1ed29d23 --- /dev/null +++ b/docs/api/equations.md @@ -0,0 +1,3 @@ +::: technologydata.formulas.Equation + +::: technologydata.formulas.EquationRegistry diff --git a/docs/contributing/api_improvement_proposals.md b/docs/contributing/api_improvement_proposals.md new file mode 100644 index 00000000..f2f1d94c --- /dev/null +++ b/docs/contributing/api_improvement_proposals.md @@ -0,0 +1,129 @@ +# API improvement proposals + +This document collects API additions, behavior changes, and code cleanups that were identified +during a review of the formula-system branch but deliberately **not** implemented yet. +Each entry names the owning class, a rough signature, and the rationale, so it can be picked up +as an independent piece of work later. + +## 1. Promised in docs/design but missing (highest priority) + +These are used or promised in the documentation today, so users following the docs hit errors. + +### `TechnologyCollection.__getitem__` + +```python +def __getitem__(self, index: int | slice) -> Technology | Self: ... +``` + +`docs/user_guide/design.md` shows `tech = techs[0]` (twice), but indexing a collection currently +raises `TypeError` even though `__iter__` and `__len__` exist. Integer indices should return the +`Technology`, slices a new `TechnologyCollection`. + +### Optional filter arguments on `TechnologyCollection.get` + +All five arguments (`name`, `region`, `year`, `case`, `detailed_technology`) are currently +required, although the method body already handles `None` and `design.md` shows partial +filtering (`techs.get(technology="Solar PV", region="EUR")`). Give every argument a `= None` +default. + +### Public equation removal and lookup on `EquationRegistry` + +```python +def unregister(self, name: str) -> None: ... # KeyError on unknown name +def get(self, name: str) -> Equation: ... # KeyError on unknown name +``` + +`docs/user_guide/technology.md` promises users can "remove or add equations", but removal and +single-equation lookup currently require the private `_remove_equation` / +`_equations_by_name`. + +### `TechnologyCollection.get_parameter` + +```python +def get_parameter(self, name: str) -> list[Parameter | None]: ... +``` + +`design.md` shows cross-collection parameter access (`techs["lifetime"].values`). A method +returning one entry per technology (with `None` or a skip-policy for technologies lacking the +parameter) covers the use case without overloading `__getitem__` semantics. + +## 2. Custom registry plumbing + +- `Technology.calculate_parameters` (and the `TechnologyCollection` mirror) should accept + `equations: EquationRegistry | None = None` like `check_consistency` already does; today the + default registry is hard-imported, so custom registries (documented in + `docs/user_guide/equations.md`) cannot drive derivation. +- `EquationRegistry.__contains__(name)`, `__len__()`, `__iter__()` and + `equations_for(parameter: str) -> list[Equation]`. Besides user convenience, this would let + `Technology.check_consistency` / `calculate_parameters` stop reaching into the private + `_equations_by_parameter` index. + +## 3. `Parameter` conveniences + +- `__rmul__` (and `__neg__`): `2 * param` currently raises `TypeError` while `param * 2` works; + scalar multiplication should be symmetric. (`__radd__` is only sensible for + Parameter + Parameter, which already works β€” skip it.) +- Ordering comparisons `__lt__` / `__le__` / `__gt__` / `__ge__` via pint quantity comparison + after unit harmonization, mirroring the compatibility checks in `isclose` (useful for + screening, e.g. `tech["lifetime"] > threshold`). +- `add_provenance(entry: str) -> Self`: clean, supported way to append one history entry now + that `provenance` is a `list[str]`. + +## 4. Provenance recording in transformations (behavior change) + +`to()`, `to_currency()`, and `change_heating_value()` currently copy `provenance` unchanged +(see the `TODO` in `change_heating_value`). They should append a human-readable history entry, +e.g. `"Converted from USD_2020/kW to EUR_2020/kW."`, completing the provenance-history design +introduced with `provenance: list[str]`. + +Note this is an observable behavior change: converted parameters gain provenance entries, and +`test/test_parameter.py` asserts `converted.provenance == param.provenance` after +`to_currency`, which would need updating. + +## 5. Collection and technology conveniences + +- `TechnologyCollection.append(tech)` and `__add__(other) -> Self`: merge primitive for + combining harmonized datasets (design.md UC-002); currently requires + `TechnologyCollection(technologies=a.technologies + b.technologies)` by hand. +- `Technology.__contains__(key)`: `"eac" in tech` is natural given `__getitem__`/`__setitem__` + exist. `__delitem__` would complete the mapping protocol (the documented way to drop a + parameter is `del tech.parameters[name]`). +- Compact `__str__` for `Technology` and `TechnologyCollection`: the pydantic repr dumps full + nested parameters, which is unreadable in a REPL. A summary (name/region/year/case + parameter + names) matches the `__str__` methods recently added to `Parameter` and `Equation`. + +## 6. Deferred code simplifications (behavior-preserving) + +Cleanups identified in review but scoped out of the equations-focused simplification pass: + +- `Parameter`: a private `_replace(**overrides)` helper β€” six methods (`to`, `to_currency`, + `change_heating_value`, the scalar branches of `__truediv__`/`__mul__`, `__pow__`) rebuild + `Parameter(...)` passing the same seven fields. Must go through the real constructor, not + `model_copy`, to keep the pint canonicalization in `__init__`. +- `Parameter.__add__`/`__sub__` are identical except for the operator, and all four arithmetic + operators repeat the provenance/note/sources merge block β€” factor into `_additive_op` and + `_merged_metadata` helpers. +- `Parameter.change_heating_value`: remove the `hv_ratios = hv_ratios` no-op branch and the + unreachable `NotImplementedError` (the first loop always fills `hv_ratios` for every carrier + dimension), merge the two loops over `dimensionality`, and collapse the `hv_units` + derivation. Separately worth deciding: an `else: raise` for a target heating value compatible + with neither LHV nor HHV (currently silently behaves like HHV) β€” that is a behavior change. +- `TechnologyCollection.get()`: replace the five copy-pasted regex filter blocks with one loop + over a `{field: pattern}` dict using `getattr` + `str()`. +- `TechnologyCollection.to_currency()`: drop the unused `enumerate` index; use a list + comprehension like the adjacent `calculate_parameters`. +- `TechnologyCollection.project()`: bind `self.technologies[0]` once (used six times), and fix + the `'closest'` `NotImplementedError` message that is missing its `f` prefix (the `{param}` + placeholder is never interpolated). +- `Technology.to_currency()`: replace deep-copy-then-mutate with a dict comprehension + + `model_copy(update=...)` like `calculate_parameters`, and `country = overwrite_country or + self.region`. + +## Considered and rejected + +- `Parameter.__hash__`: the class is mutable (pint attributes, provenance list), so hashing + would be unsafe. Defining `__eq__` without `__hash__` (unhashable) is the correct state. +- `TechnologyCollection.from_csv`: `to_csv` serializes nested structures as strings, so a + faithful round-trip needs real design work; `from_json` covers loading. +- A logging flag on `check_consistency` (design.md's "warnings are logged" alternate flow): the + returned status dict already carries the information; callers can log it as they see fit. diff --git a/docs/user_guide/equations.md b/docs/user_guide/equations.md new file mode 100644 index 00000000..26ab89c0 --- /dev/null +++ b/docs/user_guide/equations.md @@ -0,0 +1,428 @@ +# Parameter Formula System + +Many techno-economic parameters are not independent β€” they are related by well-known +engineering or financial relationships. For example, the Equivalent Annual Cost (EAC) +of a technology can be computed from its specific investment cost, discount rate (WACC), +and economic lifetime. Conversely, if the EAC is known and the lifetime is not, the +same relationship can be used to recover the lifetime. + +The formula system lets you register these relationships once and then use them in +**any direction**: whichever parameter is missing is derived automatically from the +others. No re-implementation is needed per direction β€” a single registration covers all +of them. + +## Example + +The Equivalent Annual Costs of a technology is the cost of owning and operating the technology over its lifetime, expressed on an annual basis. +It is linked to the specific investment cost, WACC, and lifetime of the technology via the annuity factor: + +$$ +\text{EAC} = \text{specific investment} \cdot \frac{\text{WACC}}{1 - (1 + \text{WACC})^{-\text{lifetime}}} +$$ + +Given a technology with the three parameters known, we can use the formula system to calculate the EAC for us: + +```python +import technologydata as td + +# Three parameters are known +tech = td.Technology( + name="Electrolysis", + detailed_technology="PEM", + case="base", + region="DEU", + year=2030, + parameters={ + "specific_investment": td.Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": td.Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": td.Parameter(magnitude=20.0, units="year"), + } +) + +# Calculate EAC from the three inputs (forward direction) +tech = tech.calculate_parameters("eac") +print(tech.parameters["eac"]) # β‰ˆ 94.4 USD_2020/kilowatt/year +``` + +This also works in reverse: +If we know the EAC, specific investment, and WACC, we can calculate the lifetime: + +```python +tech = td.Technology( + name="Electrolysis", + detailed_technology="PEM", + case="base", + region="DEU", + year=2030, + parameters={ + "specific_investment": td.Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": td.Parameter(magnitude=0.07, units="dimensionless"), + "eac": td.Parameter(magnitude=94.4, units="USD_2020/kW/year"), + } +) +# Derive lifetime from EAC instead (reverse direction β€” same formula) +tech = tech.calculate_parameters("lifetime") +print(tech.parameters["lifetime"]) # β‰ˆ 20.0 years +``` + +--- + +## Basic Usage + +### Deriving a single parameter + +The functionality is not strictly tied to `Technology` objects. +The formula system is tied to `Parameter` objects, of which you can pass one or multiple for calculation to the function `equation_registry.calculate`: + +```python +params = { + "specific_investment": td.Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": td.Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": td.Parameter(magnitude=20.0, units="year"), +} +eac = td.equation_registry.calculate("eac", params) +``` + +The result of the calculation is a new `Parameter` object with `magnitude`, `units`, and a `provenance` entry +describing the calculation: that the value was derived from other parameters, the name and expression of the +formula used, and the concrete input values it was solved with. + +```python +print(eac.provenance[0]) +# Calculated from other parameters using formula 'eac_annuity': eac - specific_investment * wacc / (1 - (1 + wacc)**(-lifetime)) = 0 +# Input values: +# specific_investment = 1000.0 USD_2020 / kilowatt +# wacc = 0.07 dimensionless +# lifetime = 20.0 year +``` + +### Checking whether a parameter can be derived + +The system automatically checks whether sufficient inputs are present to calculate the requested parameter and raises a `ValueError` if not. +You can manually check whether a parameter can be derived with `equation_registry.can_calculate`: + +```python +td.equation_registry.can_calculate("eac", params) # True - all inputs present +td.equation_registry.can_calculate("wacc", params) # False - WACC is transcendental +``` + +### Listing registered equations + +You can inspect equations in a registry via `list_equations()`. +The result is a serializable list of dictionaries sorted alphabetically by +equation name (case-insensitive): + +```python +all_equations = td.equation_registry.list_equations() +print(all_equations[0]) +# {'name': 'annuity_factor', +# 'parameters': ['annuity_factor', 'wacc', 'lifetime'], +# 'eq_str': 'annuity_factor - wacc / (1 - (1 + wacc)**(-lifetime))', +# 'priority': 1, +# 'description': 'Capital recovery factor used to annualize upfront investment.'} + +eac_equations = td.equation_registry.list_equations(target="eac") +``` + +If a target has no registered equations, `list_equations(target=...)` raises +a `ValueError`. + +### Displaying equations + +`Equation` objects provide a compact REPL representation via `repr(...)`. +The representation includes equation name, parameters (in original order), +equation string, priority, and description. + +Long equation strings are truncated for readability in interactive sessions. + +```python +eq = td.Equation( + name="my_equation", + parameters=["a", "b", "c"], + eq_str="a - b - c", +) +print(repr(eq)) +# Equation(name='my_equation', parameters=['a', 'b', 'c'], eq_str='a - b - c', priority=0, description=None) +``` + +For a human-readable, math-like rendering use `str(...)` / `print(...)`. +It shows the equation name, the full (untruncated) expression set equal to +zero, and the description if one is set: + +```python +eq = td.Equation( + name="my_equation", + parameters=["a", "b", "c"], + eq_str="a - b - c", + description="a is the sum of b and c.", +) +print(eq) +# my_equation: a - b - c = 0 (a is the sum of b and c.) +``` + +### Equation solve caching + +Symbolic solutions are precomputed and cached when an equation is registered. +This means repeated calculations for the same equation target do not run the +same symbolic solve step again. + +If no symbolic solution exists for a target, that information is also cached. +In that case, each calculation skips symbolic solving for that target and uses +the numeric fallback directly with the provided values. + +### Integration with `Technology` objects + +[`Technology.calculate_parameters`][technologydata.technology.Technology] +wraps the registry so you can derive parameters directly on a `Technology` object. +It always returns a **new** `Technology` instance; the original is never mutated. + +```python +tech = td.Technology( + name="Electrolysis", + detailed_technology="PEM", + case="base", + region="DEU", + year=2030, + parameters={ + "specific_investment": td.Parameter(magnitude=800.0, units="USD_2020/kW"), + "wacc": td.Parameter(magnitude=0.06, units="dimensionless"), + "lifetime": td.Parameter(magnitude=25.0, units="year"), + }, +) + +# Derive a single parameter +tech_with_eac = tech.calculate_parameters("eac") + +# Derive a multiple parameters at once +tech_with_eac = tech.calculate_parameters(["eac", "annuity_factor"]) + +# Derive everything that can be derived automatically +tech_full = tech.calculate_parameters() +``` + +Parameters that already present in the technology object are not overwritten by the calculation, even if they are inconsistent with the derived value. +If you want to force a recalculation of an existing parameter, remove it from the `parameters` dictionary first: + +```python +tech.parameters.pop("eac") +tech = tech.calculate_parameters("eac") # now recalculated +``` + +Derived parameters from intermediate steps are immediately available to subsequent +calculations within the same call, e.g. the automatic calculation above calculates the `annuity_factor` and adds it to the object and then the calculation of the `eac` uses it via the `eac_via_annuity_factor` formula. + +--- + +## Advanced Usage + +### Automatic selection of formulas + +Sometimes you may have multiple formulas available that can calculate the same parameter. +The registry chooses in this order: + +1. An explicitly requested formula via `equation_name=`. +2. The applicable formula with the highest `priority` value. +3. If multiple formulas have the same priority, the first registered one. + +If multiple formulas have equal priority for a target, the one that was +registered first and is applicable wins. + +If no formula can apply, a `ValueError` is raised that lists every registered formula +and which of its inputs are missing. + +### Selecting a specific formula + +You can specify a specific formula to use with `equation_name=`: + +```python +# Use the default formula (i.e. eac_annuity) +eac = td.equation_registry.calculate("eac", params) + +# Specify a specific formula to use (e.g. eac_via_annuity_factor) +tech_alt = tech.calculate_parameters( + targets=["eac"], + equation_names={"eac": "eac_via_annuity_factor"}, +) +``` + +### Currency handling + +The formula system does not support mixed currencies in a single calculation. +Before a calculation a check is performned that every currency-bearing input uses the same currency *and* currency year (e.g. all `USD_2020`, or all `EUR_2022`). + +If the currencies are inconsistent, a `ValueError` is raised immediately: + +```python +params_bad = { + "specific_investment": td.Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": td.Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": td.Parameter(magnitude=20.0, units="year"), + "eac": td.Parameter(magnitude=94.4, units="USD_2022/kW/year"), +} +td.equation_registry.calculate("specific_investment", params_bad) +# ValueError: Currency mismatch in formula 'eac_annuity': +# 'eac' uses USD_2022, 'specific_investment' uses USD_2020. +# Harmonise all currency parameters to the same currency and year +# (e.g. call .to_currency('USD_2020', country=...)) before using this formula. +``` + +To fix this, harmonise currencies first. + +The currency for the result is **inherited automatically** from the inputs. +If all inputs use `EUR_2022`, the calculated parameter will also be in `EUR_2022`. + +### Registering custom formulas + +You can add your own formulas to the system and use for calculations. +There are two options available: + +1. Extend the built-in registry `equation_registry` directly, which makes your formula available globally. +2. Create a separate `EquationRegistry` instance, which keeps your formulas isolated from the built-in ones. + This also allows you to have multiple isolated registries with different formulas in the same program. + +```python +import technologydata as td + +# Option 1: extend the global built-in registry +td.equation_registry.register( + name="lcoe_simplified", + parameters=["lcoe", "eac", "fixed_om", "full_load_hours"], + expr_str="lcoe - (eac + fixed_om) / full_load_hours", +) + +# Option 2: isolated registry +my_reg = td.EquationRegistry() +``` + +### Loading equations from YAML files + +Equation registries can be populated from YAML files with a list of equation +definitions at the root. + +Each entry supports: + +- `name`: equation name +- `parameters`: list of parameter names +- `eq_str`: equation string (equal to zero) +- `priority` (optional): non-negative integer, default `0` +- `description` (optional): arbitrary free-text metadata + +```python +reg = td.EquationRegistry() +reg.load_from_yaml("my_equations.yaml") + +# Load multiple files +reg.load_from_yaml(["base.yaml", "extensions.yaml"]) + +# Replace an existing equation name intentionally +reg.load_from_yaml("override.yaml", overwrite=True) + +# Or create a fresh registry from YAML directly +reg2 = td.EquationRegistry.from_yaml(["base.yaml", "extensions.yaml"]) +``` + +By default (`overwrite=False`), loading fails if a file defines an equation +name that already exists with a different definition. + +The built-in default equations are now loaded from a YAML file in +`src/technologydata/equations_data/default_equations.yaml`. +That file declares a YAML language server schema for editor tooltip support. + +```python +my_reg.register( + name="my_formula", + parameters=["x", "y", "z"], + expr_str="x - y * z", + priority=1, +) +result = my_reg.calculate("x", { + "y": td.Parameter(magnitude=3.0, units="dimensionless"), + "z": td.Parameter(magnitude=4.0, units="dimensionless"), +}) +print(result.magnitude) # 12.0 +``` + +--- + +## Implementation Details + +### How it works + +A [`Equation`][technologydata.formulas.Equation] stores a **SymPy expression string** set to zero (e.g. `"eac - sic*wacc/(1-(1+wacc)**(-lifetime))"`) along with the list of participant parameter names. +When asked to solve for a target, it: + +1. Maps each parameter name to a positional SymPy symbol (`_p0`, `_p1`, ...) so that names with spaces or other non-identifier characters are supported. +2. Applies a **symbolic-first** strategy: solves the expression with abstract symbols and produces a callable via `sympy.lambdify`. The known parameters are then passed as `pint` Quantity objects, so units are propagated automatically through Python's arithmetic operators. +3. Falls back to **numeric substitution** if the symbolic step yields no result β€” substitutes the known values first, then calls the solver on the simplified expression. + +The [`EquationRegistry`][technologydata.formulas.EquationRegistry] indexes each +`Equation` under every parameter it involves. + +### Formula selection + +When multiple formulas are registered for the same parameter, the registry selects one following this priority: + +| Priority | Condition | +|----------|-----------| +| 1 | A specific formula name was requested via `equation_name=` | +| 2 | Highest-priority formula whose inputs are all present | +| 3 | For equal priority, first registered formula whose inputs are all present | + +### Units + +Units are propagated automatically using the `pint` Quantity objects that each `Parameter` carries. +The lambdified SymPy solution is evaluated with these Quantities as inputs, so the result inherits consistent units without any annotation on the formula itself. + +There are two limitations to be aware of: + +- **Exponent parameters**: Parameters that appear only in exponent positions (e.g. `lifetime` in `(1+wacc)**(-lifetime)`) are passed as plain magnitudes. Raising a Quantity to a dimensioned power is physically undefined, and in all real-world formulas such a parameter is a dimensionless count. This means formulas where the output dimension (e.g. `/year`) would only come from an exponent-position parameter β€” such as `eac_annuity` β€” will not carry that dimension in the result. Use `eac_simple` (which divides by `lifetime` directly) if the `/year` unit on EAC is important. + +- **Transcendental functions**: When the SymPy solution contains a transcendental function (e.g. `log`) applied to a Quantity with physical units, evaluation falls back to magnitude-only, and the result will have `units=None`. + +### Limitations + +**Transcendental equations** β€” Some variables cannot be isolated algebraically. +For example, WACC appears both linearly and as an exponent base in the annuity +formula, making it transcendental. Attempting to solve for such a variable raises a +`ValueError`. A 5-second timeout (Unix/Linux) prevents SymPy from hanging indefinitely +on these cases. The affected variable is noted in the built-in formulas reference below. + +**Multiple real solutions** β€” When SymPy returns multiple solutions, the system prefers +positive real values (physical parameters are non-negative by convention) and takes the +first one. + +--- + +## Built-in Formulas Reference + +### Capital cost + +| Formula name | Parameters | Notes | +|---|---|---| +| `annuity_factor` | `annuity_factor`, `wacc`, `lifetime` | WACC not analytically solvable | +| `eac_annuity` *(highest priority for `eac`)* | `eac`, `specific_investment`, `wacc`, `lifetime` | WACC not analytically solvable | +| `eac_via_annuity_factor` | `eac`, `specific_investment`, `annuity_factor` | Requires pre-computed annuity factor | +| `eac_simple` | `eac`, `total_investment_cost`, `lifetime` | Ignores time-value of money | +| `total_investment_from_specific` | `total_investment_cost`, `specific_investment`, `capacity` | Ensure consistent power units | + +### Operations & maintenance + +| Formula name | Parameters | Notes | +|---|---|---| +| `fixed_om_from_fraction` | `fixed_om`, `specific_investment`, `fixed_om_fraction` | Fraction is dimensionless (e.g. 0.03 for 3 %/year) | + +### Efficiency + +| Formula name | Parameters | Notes | +|---|---|---| +| `roundtrip_efficiency` | `roundtrip_efficiency`, `charge_efficiency`, `discharge_efficiency` | All solvable in every direction | + +### Variable cost + +| Formula name | Parameters | Notes | +|---|---|---| +| `fuel_variable_cost` | `fuel_variable_cost`, `fuel_cost`, `efficiency` | Fuel cost and variable cost must be in same energy unit | +| `co2_cost` | `co2_cost`, `co2_price`, `co2_intensity` | `co2_intensity` in t/MWh of output energy | + +```text +``` diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index 8943b5a2..d48561f3 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -9,7 +9,7 @@ The `Parameter` class in `technologydata` encapsulates a value, its unit, proven - **Value and Units**: Stores a numerical value (`magnitude`) and its associated units (`units`). Units are handled using `pint` and support custom currency units (e.g., `USD_2020/kW`). The [pint default units definition](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt) file is available for reference. Be mindful of false unit-friends, e.g. `t = metric_ton = tonne != ton = US_ton` - **Currency Unit Convention**: Currency units must follow the pattern `XYZ_YYYY`, where `XYZ` is the 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code (e.g., `USD`, `EUR`, `CNY`) and `YYYY` is the 4-digit year (e.g., `USD_2020`). This allows for both currency and inflation adjustments. - **Carrier and Heating Value**: Optionally specify an energy carrier (e.g., `H2`) and a heating value type (`LHV` or `HHV`). -- **Provenance and Notes**: Track the origin of the data and any additional notes. +- **Provenance and Notes**: `provenance` is an ordered list of human-readable strings tracking the history of how a parameter's value was derived (e.g. sourced from literature, parsed from a file, calculated from a formula). `note` holds any additional free-text notes. - **Sources**: Attach a `SourceCollection` of references for traceability. - **Unit Conversion**: Convert between compatible units (excluding currency conversion) using `.to()`. - **Currency/Inflation Adjustment**: Convert between currencies and adjust for inflation using `.to_currency()`. @@ -27,7 +27,7 @@ param = Parameter( units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="Directly extracted from literature", + provenance=["Directly extracted from literature"], note="Estimated", sources=SourceCollection(sources=[ Source(title="Example Title", authors="some authors") @@ -35,7 +35,7 @@ param = Parameter( ) >>> param -Parameter(magnitude=1000.0, units='USD_2020/kW', carrier='H2', heating_value='LHV', provenance='literature', note='Estimated', sources=SourceCollection(sources=[Source(title='Example Title', authors='some authors', )])) +Parameter(magnitude=1000.0, units='USD_2020/kW', carrier='H2', heating_value='LHV', provenance=['Directly extracted from literature'], note='Estimated', sources=SourceCollection(sources=[Source(title='Example Title', authors='some authors', )])) ``` ### Unit Conversion (excluding currency) @@ -167,7 +167,7 @@ Please refer to the [API documentation](../api/parameter.md) for detailed inform ## Notes -- **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, the handling and merging of `provenance`, `note`, and `sources` is not yet implemented (see `TODO` comments in the code). +- **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, `provenance` lists are concatenated (preserving both operands' full history); merging of `note` and `sources` is not yet implemented (see `TODO` comments in the code). - **Unit Conversion**: The `.to()` method does not support currency conversion; use `.to_currency()` for that. - **Partial Unit Compatibility**: Only certain combinations of units, carriers, and heating values are supported for arithmetic operations. - **No Uncertainty Handling**: There is currently no support for uncertainty or error propagation. diff --git a/docs/user_guide/technology.md b/docs/user_guide/technology.md index 74a176f0..aaf809aa 100644 --- a/docs/user_guide/technology.md +++ b/docs/user_guide/technology.md @@ -9,7 +9,8 @@ The `Technology` class in `technologydata` represents a single technology, inclu - **Flexible Parameter Storage**: Stores technology parameters as a dictionary mapping names to `Parameter` objects. - **Region, Year, and Scenario**: Tracks metadata for each technology, including `region`, `year`, `case`, and `detailed technology` name. - **Parameter Access**: Supports dictionary-like access and assignment for parameters. -- **Consistency Checking**: Checks for completeness and consistency of required parameters. +- **Consistency Checking**: Checks selected parameters against registered + equations and returns a per-equation status dictionary. - **Parameter Calculation**: Placeholder for calculating missing or derived parameters. - **Currency Adjustment**: Harmonizes all technology parameters to a target currency, including inflation and exchange rates. - **Region and Scale Adjustment**: Placeholder methods for adjusting technology parameters to a different region or scaling values. @@ -58,11 +59,29 @@ investment = tech["specific_investment"] tech["efficiency"] = Parameter(magnitude=0.18, units=None) ``` -### Checking Consistency +### Calculating Parameters and checking consistency + +Parameters of a `Technology` can be related to each other and derived through known equations. +A good example are total capacity, total investment costs and specific investment costs, where the specific costs are just the total costs divided by the total capacity. + +Instead of manually writing out the equation each time and calculating the parameters manually, you can add equations that related parameters to each other and then have `technologydata` calculate missing parameters automatically. + +`technologydata` can also use the equations to check whether existing parameters are consistent with each other, i.e. whether they fulfill the relationship described by the equations. + +Let's take a look at an example: ```python -from technologydata import Technology, Parameter +from technologydata import Technology, Parameter, equation_registry +print(equation_registry.list_equations()) +``` + +The `equation_registry` contains the equations that you can work with. +Some equations are provided by default and you can modify the registry to suit your needs, remove or add equations, or load your own registry from a `yaml` file all together. + +Starting with our known technology: + +```python tech = Technology( name="Solar PV", detailed_technology="Crystalline Silicon", @@ -70,15 +89,54 @@ tech = Technology( region="DEU", year=2020, parameters={ - "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), - "lifetime": Parameter(magnitude=25, units="year"), + "specific_investment": Parameter(magnitude=1, units="EUR_2020/kW"), + "total_investment": Parameter(magnitude=1_000, units="EUR_2020"), } ) +``` + +Let's calculate the `capacity` for this installation: + +```python +tech = tech.calculate("capacity") +tech.parameters["capacity"] +# 1000 kW +``` + +The calculate parameter is automatically added to the technology object. + +We can check whether the parameters of the Technology object are consistent with the equations. +In this case we have derived one parameter using the other two, so they should be consistent: -is_consistent = tech.check_consistency() -print(is_consistent) # True if all required parameters are present +```python +status = tech.check_consistency() +print(status) +# { +# "total_investment_from_specific": True, +# ... +# } ``` +The consistency check will flag equations that are consistent with the parameters of the technology with `True` and those that aren't with `False`. +It will check against all the equations in the registry. +If there are equations for which only some but not all parameters are present, it will notify about these equations as `"missing parameters"` and equations for which no parameter is present will be labelled as `"inapplicable"`. +If we change the value of one of the parameters to be inconsistent with the others, e.g. + +```python +tech.parameters["capacity"].magnitude = 5 + +# Check for consistency again +status = tech.check_consistency() +print(status) +# { +# "total_investment_from_specific": False, +# ... +# } +``` + +The inconsistency will be reported and flagged. +Since it is not possible to determine which parameters are right or wrong, it will not highlight a specific parameter as "inconsistent". + ### Adjusting Currency ```python @@ -123,9 +181,31 @@ scaled_tech = tech.adjust_scale(1.1) Please refer to the [API documentation](../api/technology.md) for detailed information on the `Technology` class methods and attributes. -## Notes +### Calculating Derived Parameters + +Use the formula registry to automatically derive missing parameters. See +[Formula System](equations.md) for the full reference. + +```python +from technologydata.technology import Technology +from technologydata.parameter import Parameter + +tech = Technology( + name="Solar PV", + detailed_technology="Crystalline Silicon", + case="Base", + region="DEU", + year=2020, + parameters={ + "specific_investment": Parameter(magnitude=1000, units="EUR_2020/kW"), + "wacc": Parameter(magnitude=0.06, units="dimensionless"), + "lifetime": Parameter(magnitude=25, units="year"), + } +) + +# Derive EAC automatically +tech_derived = tech.calculate_parameters("eac") -- **Parameter Calculation**: The method for calculating missing or derived parameters is a placeholder and not yet implemented. -- **Region and Scale Adjustment**: Methods for region and scale adjustment are placeholders. -- **Consistency Checking**: Only checks for the presence of required parameters; does not validate values. -- **Type Checking**: The class uses Pydantic for validation and type enforcement. +# Derive all derivable parameters at once +tech_full = tech.calculate_parameters() +``` diff --git a/docs/user_guide/technology_collection.md b/docs/user_guide/technology_collection.md index 20680726..d8bc5d5d 100644 --- a/docs/user_guide/technology_collection.md +++ b/docs/user_guide/technology_collection.md @@ -10,6 +10,7 @@ The `TechnologyCollection` class in `technologydata` represents a collection of - **Filtering**: Supports regex-based filtering by attributes `name`, `region`, `year`, `case`, and `detailed technology`. - **Data Export**: Converts the collection to pandas DataFrame, CSV, and JSON formats, with schema export. - **Currency Adjustment**: Harmonizes all technology parameters to a target currency, including inflation and exchange rates. +- **Formula System**: Derives missing parameters (`calculate_parameters`) and checks equation-level consistency (`check_consistency`) for every technology in the collection. - **Model Fitting**: Fits growth models to technology parameters across the collection. - **Projection**: Projects parameters to future years using growth models or statistical options. - **Integration**: Designed for use with energy system modeling and technology parameter analysis. @@ -75,6 +76,35 @@ collection = TechnologyCollection(technologies=[tech1, tech2]) converted = collection.to_currency("USD_2025", source="worldbank") ``` +### Deriving Missing Parameters and Checking Consistency + +`calculate_parameters` and `check_consistency` apply the corresponding +[`Technology`](technology.md) method to every technology in the collection and +return, respectively, a new `TechnologyCollection` and a list of per-equation +status dicts (one per technology, in the same order as `collection.technologies`). + +```python +from technologydata import Parameter, Technology, TechnologyCollection + +tech1 = Technology( + name="Tech1", region="DEU", year=2020, case="Base", detailed_technology="Solar PV", + parameters={ + "specific_investment": Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": Parameter(magnitude=20.0, units="year"), + }, +) +collection = TechnologyCollection(technologies=[tech1]) + +# Derive "eac" (and any other derivable parameter) for every technology +derived = collection.calculate_parameters() +print(derived.technologies[0].parameters["eac"]) + +# Check consistency of every technology's "eac" against registered equations +status = derived.check_consistency(parameters=["eac"]) +print(status[0]) # status dict for tech1, e.g. {'eac_annuity': True, ...} +``` + ### Fitting a Growth Model ```python diff --git a/mkdocs.yaml b/mkdocs.yaml index 04ddcbd1..54bc4ff9 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -28,6 +28,7 @@ nav: - Source Collection: user_guide/source_collection.md - Technology: user_guide/technology.md - Technology Collection: user_guide/technology_collection.md + - Formula System: user_guide/formulas.md - DEA Energy Storage Parser: user_guide/dea_energy_storage_parser.md - Manual Input USA Parser: user_guide/manual_input_usa_parser.md - Data Accessor: user_guide/data_accessor.md @@ -39,6 +40,7 @@ nav: - API Reference: - Data Package: api/datapackage.md + - Formulas: api/formulas.md - Parameter: api/parameter.md - Source: api/source.md - Source Collection: api/source_collection.md diff --git a/pyproject.toml b/pyproject.toml index 4b1e5d98..490c13c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,10 @@ dependencies = [ "requests>=2.32.3", "savepagenow>=1.3.0", "scipy>=1.16.1", + "overdue>=0.1.5", + "sympy>=1.13", + "pyyaml>=6.0.2", + "types-pyyaml>=6.0.12.20260815", "python-calamine>=0.4.0", ] @@ -97,6 +101,9 @@ version_scheme = "no-guess-dev" where = ["src"] include = ["technologydata"] +[tool.setuptools.package-data] +technologydata = ["equations_data/*.yaml", "equations_data/*.json"] + # code coverage settings [tool.coverage.run] source = [ diff --git a/src/technologydata/__init__.py b/src/technologydata/__init__.py index 75bb5122..9d66eb62 100644 --- a/src/technologydata/__init__.py +++ b/src/technologydata/__init__.py @@ -4,7 +4,12 @@ """technologydata: A package for managing and analyzing technology data used for energy system models.""" +import technologydata.default_equations as _default_equations # noqa: F401 from technologydata.datapackage import DataPackage +from technologydata.default_equations import ( + equation_registry, # also registers built-in equations +) +from technologydata.equations import Equation, EquationRegistry from technologydata.parameter import Parameter from technologydata.source import Source from technologydata.source_collection import SourceCollection @@ -26,6 +31,9 @@ "DateFormatEnum", "DataPackage", "FileExtensionEnum", + "Equation", + "EquationRegistry", + "equation_registry", "Parameter", "Source", "SourceCollection", diff --git a/src/technologydata/default_equations.py b/src/technologydata/default_equations.py new file mode 100644 index 00000000..e4992c9f --- /dev/null +++ b/src/technologydata/default_equations.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +""" +Global equation registry and built-in equation definitions. + +The module-level ``equation_registry`` instance is the single shared registry +that the ``technologydata`` package uses by default. Importing this module +loads all built-in equations from +``equations_data/default_equations.yaml``; this happens automatically when the +``technologydata`` package is imported via ``__init__.py``. + +Equation limitations +------------------- +Some equations are transcendental in specific variables and cannot be solved +analytically by SymPy. For such variables the user must provide the value +directly rather than deriving it via the registry. + +Unit notes +---------- +Units are propagated automatically from the input ``Parameter`` objects using +pint arithmetic. Parameters that appear only in exponent positions (e.g. +``lifetime`` in the annuity equation) are evaluated as plain magnitudes, so +their physical unit label (``year``) does not flow into the result. This +means equations whose output is implicitly "per year" (annuity factor, EAC, +fixed O&M from fraction) will produce units without the ``/year`` suffix when +all inputs treat time as a dimensionless count. Where the ``/year`` dimension +matters, use ``eac_simple`` (which divides by ``lifetime`` directly) or supply +an EAC value that already carries the ``/year`` unit as an input to a reverse +solve. +""" + +import pathlib + +from technologydata.equations import EquationRegistry + +equation_registry = EquationRegistry() +equation_registry.load_from_yaml( + pathlib.Path(__file__).with_name("equations_data") / "default_equations.yaml" +) diff --git a/src/technologydata/equations.py b/src/technologydata/equations.py new file mode 100755 index 00000000..bbb2a479 --- /dev/null +++ b/src/technologydata/equations.py @@ -0,0 +1,741 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +""" +Equation and EquationRegistry for bidirectional parameter linking via equations in SymPy. + +**Design** +Each equation is registered as a symbolic expression equal to zero, e.g. +for ``a = b`` the equation is registered as ``a - b`` and the ``= 0`` part is +not registered. +The package SymPy is used to solve the expression for *any* of its participant +variables after registration assuming all other variables are given. +This allows for performant usage of the equations post the initial registration +in any direction. + +**Equation registry** +An equation registry is used to collect all equations. +The registry contains functions for managing the member equations and look-up +functions for finding equations that contain specific variables (parameters). + +Similarly to the unit registry, there is a default equation registry for the package +with default equations already loaded in from the package data. +Equations can be programmatically added or loaded from external file. + +**Units** +Units are propagated automatically using the ``pint`` of the ``Parameter`` objects +used in the calculations without any extra annotation on the formula itself. + +Exception: Parameters that appear in *exponent positions* in the solved +expression (e.g. ``lifetime`` in ``(1+wacc)**(-lifetime)``) are passed as +plain magnitudes without units. +Raising a quantity to a dimensioned power is physically undefined. +In real-world formulas such a parameter usually represents a dimensionless count +whose physical unit is a label, not a true dimension, and thus we ignore them. + +When pint arithmetic itself fails (e.g. if the solved expression contains a +transcendental function applied to a non-dimensionless quantity), evaluation +falls back to magnitudes and the result is returned with ``units=None``. +Might not be the best design, but if someone stumbles across it, we're open to +suggestions on how to improve this. + +**Unit consistency check** +Unit consistency is checked through pint with symbolic calculations. +With numeric calculations this check does not work so nicely. + +**Solving of equations** +---------------- +To avoid SymPy hanging on transcendental equations (e.g. solving for WACC +inside an annuity formula where it appears both linearly and as an exponent +base), the solver follows this two-step strategy: + +1. Symbolic-first: solve the expression with purely abstract symbols, then + evaluate the result via pint arithmetic. Abstract symbolic solving is + faster than working with floating-point numbers because + SymPy's algebraic algorithms are optimised for symbolic manipulation. + +2. **Numeric fallback**: if the symbolic step produces no result, substitute + the known numeric values first, then call solve on the simplified expression. + This can succeed in cases where SymPy's heuristics prefer concrete numbers. + +The solving is wrapped in a timeout using `overdue` to prevent the system +from hanging indefinitely on difficult equations. +If no SymPy solution is found +within `_SOLVE_TIMEOUT_SECONDS` the call is cancelled and an error raised. +""" + +from __future__ import annotations + +# `from __future__ import annotations` makes all annotations lazy strings at +# runtime. With the TYPE_CHECKING guard below this lets us reference +# `Parameter` in type hints without importing which may lead to circular imports +import math +import pathlib +from collections.abc import Callable, Sequence +from typing import TYPE_CHECKING, Any, TypedDict, cast + +import overdue +import pydantic +import sympy as sp +import yaml + +from technologydata.parameter import Parameter + +if TYPE_CHECKING: + from technologydata.parameter import Parameter + + +class EquationSummary(TypedDict): + """Serializable summary of a registered equation.""" + + name: str + parameters: list[str] + eq_str: str + priority: int + description: str | None + + +class EquationConfig(pydantic.BaseModel): + """Schema for one equation entry loaded from YAML.""" + + name: str + parameters: list[str] + eq_str: str + priority: int = pydantic.Field(default=0, ge=0) + description: str | None = None + + +# Seconds to wait for SymPy before declaring "no analytical solution". +# Equations should usually solve well below under a second, but +# transcendental equations will hang forever +_SOLVE_TIMEOUT_SECONDS = 5 +_EQUATION_REPR_MAX_EXPR_LENGTH = 80 + + +def _solve_with_timeout(expr: sp.Expr, symbol: sp.Symbol) -> list[sp.Expr]: + """Call `sp.solve(expr, symbol)` with a timeout to prevent hanging on transcendental equations.""" + with overdue.timeout_set_to(_SOLVE_TIMEOUT_SECONDS, raise_exception=True): + # sp.solve is untyped (returns Any); the actual runtime type here is a + # list of solved expressions. + return cast("list[sp.Expr]", sp.solve(expr, symbol)) + + +def _get_exponent_symbols(expr: sp.Expr) -> set[sp.Symbol]: + """Return all free symbols that appear in any exponent position within *expr*.""" + result: set[sp.Symbol] = set() + for node in sp.preorder_traversal(expr): + if isinstance(node, sp.Pow): + result |= node.exp.free_symbols + return result + + +def _evaluate_solution( + f: Callable[..., Any], values: list[object] +) -> tuple[float, object] | None: + """ + Evaluate a lambdified solution with the given input values. + + Returns the ``(magnitude, raw_result)`` pair, or ``None`` if the + evaluation fails or does not produce a finite number. + """ + try: + raw = f(*values) + mag = float(raw.magnitude) if hasattr(raw, "magnitude") else float(raw) + except Exception: # noqa: BLE001 + return None + return None if math.isnan(mag) else (mag, raw) + + +class Equation: + """ + A symbolic equation linking multiple parameters. + + The equation is expressed as a string equal to zero. + Sympy is used to solve the equation for any of its participating parameters + given the others. + + Parameters + ---------- + name : str + Unique name given to this equation. Used to identify the equation in + a equation registry and for tracking `Parameter` provenance information. + parameters : list of str + The names of all parameters that participate in the equation. Names must be + exactly the same as those used in the equation string. + Internally they are not passed directly to SymPy's parser, i.e. are not subject + to the naming restriction of SymPy identifiers. + eq_str : str + The equation string, using SymPy-compatible syntax. Parameter names must appear + exactly as listed in `parameters` and may include spaces or other special characters, + they are not directly passed on to SymPy's parser and can therefore be arbitrary strings. + The expression is set to zero, so `"a - b*c"` represents the relationship ``a = b*c``. + priority : int + Priority used when multiple equations can solve the same target. + Higher values are preferred. Defaults to ``0``. + + """ + + def __init__( + self, + name: str, + parameters: list[str], + eq_str: str, + priority: int = 0, + description: str | None = None, + ) -> None: + """Build the equation's internal SymPy representation and precompute symbolic solutions.""" + self.name = name + self.parameters = parameters + self.expr_str = eq_str + if priority < 0: + raise ValueError("Equation priority must be >= 0.") + self.priority = priority + self.description = description + + # Validate names once and build the internal symbolic representation once. + if any(p.startswith("_p") and p[2:].isdigit() for p in self.parameters): + raise ValueError( + f"Equation '{self.name}' has parameters that conflict with internal symbol naming: {self.parameters}. " + "Parameter names cannot start with '_p' followed by digits." + ) + + self._param_idx = {p: i for i, p in enumerate(self.parameters)} + self._symbols_by_parameter = { + p: sp.Symbol(f"_p{self._param_idx[p]}") for p in self.parameters + } + + safe_expr = self.expr_str + for p in sorted(self.parameters, key=len, reverse=True): + safe_expr = safe_expr.replace(p, f"_p{self._param_idx[p]}") + self._expr = sp.sympify(safe_expr) + + # Precompute symbolic solutions for each target once at registration. + # Targets with no symbolic solution are cached as an empty tuple. + self._symbolic_solutions_by_target: dict[str, tuple[sp.Expr, ...]] = {} + for target in self.parameters: + try: + solutions = _solve_with_timeout( + self._expr, self._symbols_by_parameter[target] + ) + except Exception: # noqa: BLE001 + solutions = [] + self._symbolic_solutions_by_target[target] = tuple(solutions) + + def __repr__(self) -> str: + """Return a concise human-readable representation for REPL usage.""" + expr = self.expr_str + if len(expr) > _EQUATION_REPR_MAX_EXPR_LENGTH: + expr = expr[: _EQUATION_REPR_MAX_EXPR_LENGTH - 3] + "..." + + return ( + "Equation(" + f"name={self.name!r}, " + f"parameters={self.parameters!r}, " + f"eq_str={expr!r}, " + f"priority={self.priority!r}, " + f"description={self.description!r}" + ")" + ) + + def __str__(self) -> str: + """Return a human-readable, math-like rendering of the equation.""" + s = f"{self.name}: {self.expr_str} = 0" + if self.description: + s += f" ({self.description})" + return s + + def can_solve_for(self, target: str, available: dict[str, Parameter]) -> bool: + """ + Check if an equation can solve for `target` parameter with the provided `available` parameters. + + Parameters + ---------- + target : str + The parameter to check. + available : dict + Known parameter values. + + Returns + ------- + bool + `True` if the equation can solve for `target`, else `False`. + + """ + # The equation must involve the target parameter, and all other + # participating parameters must be available for solving. + return target in self.parameters and all( + p in available for p in self.parameters if p != target + ) + + def solve_for(self, target: str, params: dict[str, Parameter]) -> Parameter: + """ + Solve the equation for the `target` parameter given the remaining parameters. + + Parameters + ---------- + target : str + The parameter to solve for. + params : dict + Known parameter values, i.e. all other equation participants except the `target`. + + Returns + ------- + Parameter + The calculated parameter including provenance information. + Unit information from parameters that appear as an exponent are evaluated using + their magnitudes only as pint cannot raise a quantity to a dimensioned power; + their physical unit label does not flow into the result. + + Raises + ------ + ValueError + If SymPy cannot find a closed-form analytical solution. + + """ + # Only parameters required for solving this target are relevant. + input_params = [p for p in self.parameters if p != target and p in params] + input_syms = [self._symbols_by_parameter[p] for p in input_params] + + # Step 1: solve symbolically, evaluate via pint arithmetic. + # Using lambdify + pint Quantities propagates units automatically. + # Symbolic solving is significantly faster than working with floats. + symbolic_solutions = self._symbolic_solutions_by_target.get(target, ()) + has_symbolic_solution = bool(symbolic_solutions) + results: list[tuple[float, object]] = [] + + for sym_sol in symbolic_solutions: + # Parameters in exponent positions must be passed as plain magnitudes: + # pint cannot raise a quantity to a dimensioned power (e.g. x**20year). + # Such parameters are typically dimensionless counts (e.g. number of + # years) whose unit is a label, not a true physical dimension. + exponent_syms = _get_exponent_symbols(sym_sol) + f = sp.lambdify(input_syms, sym_sol, modules="math") + + input_values = [ + params[p].magnitude + if self._symbols_by_parameter[p] in exponent_syms + else params[p]._pint_quantity + for p in input_params + ] + + result = _evaluate_solution(f, input_values) + if result is None: + # Pint arithmetic failed (e.g. transcendental function on a + # non-dimensionless quantity). Fall back to magnitude-only. + mag_values: list[object] = [params[p].magnitude for p in input_params] + result = _evaluate_solution(f, mag_values) + if result is not None: + results.append(result) + + if not results: + # Step 2: substitute magnitudes first, then solve. This can succeed + # when SymPy's heuristics prefer concrete numbers over abstract symbols. + subs_mag = { + self._symbols_by_parameter[p]: params[p].magnitude for p in input_params + } + try: + for sol in _solve_with_timeout( + self._expr.subs(subs_mag), self._symbols_by_parameter[target] + ): + try: + mag = float(sol) + if not math.isnan(mag): + results.append((mag, mag)) + except (TypeError, ValueError): + pass + except Exception as exc: # noqa: BLE001 + if not has_symbolic_solution: + raise NotImplementedError( + f"Formula '{self.name}' cannot solve for '{target}' analytically." + ) from exc + raise + + if not results: + if not has_symbolic_solution: + raise NotImplementedError( + f"Formula '{self.name}' cannot solve for '{target}' analytically." + ) + raise ValueError( + f"Formula '{self.name}' has no analytical solution for '{target}' " + "with the given parameter values. " + "This typically means the variable appears in a transcendental term " + "(e.g. as an exponent base). Consider providing the value directly." + ) + + # Physical parameters are positive by convention in energy system + # modelling (costs, efficiencies, lifetimes are never negative). + # Prefer positive real solutions; if none exist, fall back to any real. + positive = [(mag, raw) for mag, raw in results if mag > 0] + magnitude, raw_result = (positive or results)[0] + + result_units = str(raw_result.units) if hasattr(raw_result, "units") else None + + input_values_str = "\n".join(f" {p} = {params[p]}" for p in input_params) + provenance_entry = ( + f"Calculated from other parameters using formula '{self.name}': " + f"{self.expr_str} = 0\n" + f"Input values:\n{input_values_str}" + ) + return Parameter( + magnitude=magnitude, + units=result_units, + provenance=[provenance_entry], + ) + + +class EquationRegistry: + """ + Registry to make :class:`Equation` available for parameter omni-directional computation. + + Each equation in the registry is registered for every parameter it involves. + This way the registry can determine the select the equations suitable for + calculating a parameter without knowing beforehand which equation to use. + + Multiple equations can be associated with the same parameter, + e.g. two different methods for computing EAC. + Equation selection can be influenced by assigning per-equation priorities. + + Attributes + ---------- + _equations_by_parameter : dict[str, list[Equation]] + Index from parameter name to all equations that include this parameter. + Used for equation discovery when solving for a target parameter. + _equations_by_name : dict[str, Equation] + Index from unique equation name to the corresponding equation object. + Used for uniqueness checks and global equation listing. + + """ + + def __init__(self) -> None: + """Initialize an empty registry with no equations registered.""" + # Parameter-centric index used by get_equation/can_calculate. + self._equations_by_parameter: dict[str, list[Equation]] = {} + # Name-centric index used for uniqueness checks and full registry listing. + self._equations_by_name: dict[str, Equation] = {} + + def register( + self, + name: str, + parameters: list[str], + eq_str: str, + priority: int = 0, + overwrite: bool = False, + description: str | None = None, + ) -> None: + """ + Register an equation linking a set of parameters. + + All the `parameters` are indexed to this equation for equation discovery. + + Parameters + ---------- + name : str + Unique equation name to identify the equation. + parameters : list of str + All parameter names that participate in this equation. + eq_str : str + The equation as string representation equal to zero, i.e. LHS of the + equation with $LHS = 0$. The equation must contain the parameter names + exactly as listed in `parameters` (including any spaces). + priority : int, optional + Priority used when multiple equations can solve for the same target. + Higher values are preferred. Defaults to ``0``. + overwrite : bool, optional + If ``True`` and an equation with the same name already exists, + the existing equation is replaced. + description : str, optional + Optional free-text description for documentation or context. + + """ + existing = self._equations_by_name.get(name) + if existing is not None: + same_definition = ( + existing.parameters == parameters + and existing.expr_str == eq_str + and existing.priority == priority + and existing.description == description + ) + if same_definition: + return + + if not overwrite: + raise ValueError( + f"Equation name '{name}' already exists with a different definition. " + "Set overwrite=True to replace it." + ) + + self._remove_equation(name) + + # Setup the equation + formula = Equation( + name=name, + parameters=parameters, + eq_str=eq_str, + priority=priority, + description=description, + ) + self._equations_by_name[name] = formula + + # Register the equation in the registry for each parameter it involves + for param in parameters: + self._equations_by_parameter.setdefault(param, []).append(formula) + + def _remove_equation(self, name: str) -> None: + """Remove one equation by name from all internal indexes.""" + equation = self._equations_by_name.pop(name) + for param in equation.parameters: + equations = self._equations_by_parameter.get(param) + if equations is None: + continue + self._equations_by_parameter[param] = [ + current for current in equations if current.name != name + ] + if not self._equations_by_parameter[param]: + del self._equations_by_parameter[param] + + def load_from_yaml( + self, + yaml_files: str | pathlib.Path | Sequence[str | pathlib.Path], + overwrite: bool = False, + ) -> None: + """ + Load equation definitions from one or multiple YAML files. + + Parameters + ---------- + yaml_files : str | pathlib.Path | Sequence[str | pathlib.Path] + Path(s) to YAML file(s) containing equation definitions. + overwrite : bool, optional + If ``True``, allow replacing existing equations with the same name. + Defaults to ``False``. + + Raises + ------ + ValueError + If the YAML content is not a list of equation definitions or + if conflicting equation names are found and ``overwrite=False``. + + """ + if isinstance(yaml_files, (str, pathlib.Path)): + files = [yaml_files] + else: + files = list(yaml_files) + + for file in files: + path = pathlib.Path(file) + with path.open("r", encoding="utf-8") as handle: + payload = yaml.safe_load(handle) + + if payload is None: + continue + if not isinstance(payload, list): + raise ValueError( + f"YAML file '{path}' must contain a list of equations at the root." + ) + + for raw_entry in payload: + config = EquationConfig.model_validate(raw_entry) + self.register( + name=config.name, + parameters=config.parameters, + eq_str=config.eq_str, + priority=config.priority, + overwrite=overwrite, + description=config.description, + ) + + @classmethod + def from_yaml( + cls, + yaml_files: str | pathlib.Path | Sequence[str | pathlib.Path], + ) -> EquationRegistry: + """ + Create a new registry initialized from one or more YAML files. + + Parameters + ---------- + yaml_files : str | pathlib.Path | Sequence[str | pathlib.Path] + Path(s) to YAML file(s) containing equation definitions. + + Returns + ------- + EquationRegistry + A new instance of EquationRegistry with equations loaded from the specified YAML files. + + """ + registry = cls() + registry.load_from_yaml(yaml_files=yaml_files, overwrite=False) + return registry + + def list_equations(self, target: str | None = None) -> list[EquationSummary]: + """ + List registered equations as serializable summaries. + + Parameters + ---------- + target : str, optional + If provided, only equations registered for this target parameter + are returned. + + Returns + ------- + list[EquationSummary] + Equation summaries sorted alphabetically by equation name, + case-insensitive. + + Raises + ------ + ValueError + If `target` is provided but no equation is registered for it. + + """ + if target is None: + equations = list(self._equations_by_name.values()) + else: + equations = self._equations_by_parameter.get(target, []) + if not equations: + raise ValueError(f"No equation registered for parameter '{target}'.") + + return [ + { + "name": equation.name, + "parameters": equation.parameters, + "eq_str": equation.expr_str, + "priority": equation.priority, + "description": equation.description, + } + for equation in sorted(equations, key=lambda eq: eq.name.lower()) + ] + + def get_equation( + self, + target: str, + params: dict[str, Parameter], + equation_name: str | None = None, + ) -> Equation: + """ + Return the best applicable :class:`Equation` for the `target` parameter. + + Selection priority: + 1. The equation explicitly requested by `equation_name` + 2. Higher-priority equations whose inputs are all present. + 3. For equal priority, earlier registration order. + + Parameters + ---------- + target : str + The name of the parameter to derive. Must match the name in the registered equation. + params : dict + Known parameter values, possible participants of the equation. + Must contain all parameters except `target`. + Used to determine eligible equations for calculating the `target`. + equation_name : str, optional + Name of a specific equation variant to use. + If not provided, an applicable equation is selected automatically. + + Raises + ------ + KeyError + If the equation requested by `equation_name` is not registered. + ValueError + If there is no equation registered that allows for calculation of the + `target` parameter with the provided `params`. + + """ + # All possible registered equations for the target parameter + candidates = self._equations_by_parameter.get(target, []) + + # Fail fast + if not candidates: + raise ValueError(f"No equation registered for parameter '{target}'.") + + # Selection by equation_name + if equation_name is not None: + # Find the requested equation + named = [f for f in candidates if f.name == equation_name] + if not named: + raise KeyError( + f"No equation named '{equation_name}' registered for '{target}'." + ) + + # Check if all required parameters are available for this equation + f = named[0] + if not f.can_solve_for(target, params): + missing = [p for p in f.parameters if p != target and p not in params] + raise ValueError( + f"Equation '{equation_name}' cannot solve for '{target}' because " + f"of missing parameters: {missing}." + ) + return f + + # Selection by available parameters and equation priority. + # Higher priority first; stable sort preserves registration order on ties. + for f in sorted(candidates, key=lambda f: f.priority, reverse=True): + if f.can_solve_for(target, params): + return f + + missing_params_in_equations = "\n".join( + f" * '{f.name}': provided params = {[p for p in f.parameters if p != target and p in params]}, missing params = {[p for p in f.parameters if p != target and p not in params]}" + for f in candidates + ) + raise ValueError( + f"No equation for parameter '{target}' can be used with the provided parameters.\n" + f"Available equations for '{target}' are:\n" + missing_params_in_equations + ) + + def calculate( + self, + target: str, + params: dict[str, Parameter], + equation_name: str | None = None, + ) -> Parameter: + """ + Calculate the `target` parameter using the available equations in the registry. + + If `equation_name` is provided, the corresponding equation is used. Otherwise, + the registry automatically selects an applicable equation based on the provided parameters. + + Information on the equation used and calculation performed is recorded in the `provenance` + attribute of the returned :class:`Parameter`. + + Parameters + ---------- + target : str + The parameter to derive. + params : dict + Names of the known parameters and their corresponding :class:`Parameter` values. + equation_name : str, optional + Name of a specific equation to use for the calculation. If not provided, an applicable + equation is selected automatically. + + Returns + ------- + Parameter + The calculated parameter. + + """ + equation = self.get_equation(target, params, equation_name) + return equation.solve_for(target, params) + + def can_calculate(self, target: str, params: dict[str, Parameter]) -> bool: + """ + Check if the registry has an equation to calculate the `target` parameter from the provided parameters. + + Parameters + ---------- + target : str + The parameter to calculate. + params : dict + Names of the known parameters and their corresponding :class:`Parameter` values. + + Returns + ------- + bool + `True` if any registered formula can solve for `target`, else `False`. + + """ + return any( + equation.can_solve_for(target, params) + for equation in self._equations_by_parameter.get(target, []) + ) diff --git a/src/technologydata/equations_data/default_equations.schema.json b/src/technologydata/equations_data/default_equations.schema.json new file mode 100644 index 00000000..2684e80e --- /dev/null +++ b/src/technologydata/equations_data/default_equations.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://technologydata.readthedocs.io/schemas/default_equations.schema.json", + "title": "technologydata equation definitions", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name", "parameters", "eq_str"], + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Unique equation name" + }, + "parameters": { + "type": "array", + "minItems": 2, + "items": { + "type": "string", + "minLength": 1 + }, + "description": "Names of all parameters used in the equation" + }, + "eq_str": { + "type": "string", + "minLength": 1, + "description": "Equation expression set equal to zero" + }, + "priority": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Priority to use this equation for calculating a parameter, higher values are preferred" + }, + "description": { + "type": "string", + "description": "Optional free-text description" + } + } + } +} diff --git a/src/technologydata/equations_data/default_equations.schema.json.license b/src/technologydata/equations_data/default_equations.schema.json.license new file mode 100644 index 00000000..d3ce8722 --- /dev/null +++ b/src/technologydata/equations_data/default_equations.schema.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: technologydata contributors + +SPDX-License-Identifier: MIT diff --git a/src/technologydata/equations_data/default_equations.yaml b/src/technologydata/equations_data/default_equations.yaml new file mode 100644 index 00000000..a895c65b --- /dev/null +++ b/src/technologydata/equations_data/default_equations.yaml @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +# yaml-language-server: $schema=default_equations.schema.json + +- name: annuity_factor + parameters: [annuity_factor, wacc, lifetime] + eq_str: annuity_factor - wacc / (1 - (1 + wacc)**(-lifetime)) + priority: 1 + description: Capital recovery factor used to annualize upfront investment. + +- name: eac_via_annuity_factor + parameters: [eac, specific_investment, annuity_factor] + eq_str: eac - specific_investment * annuity_factor + +- name: eac_annuity + parameters: [eac, specific_investment, wacc, lifetime] + eq_str: eac - specific_investment * wacc / (1 - (1 + wacc)**(-lifetime)) + priority: 1 + +- name: eac_simple + parameters: [eac, total_investment_cost, lifetime] + eq_str: eac - total_investment_cost / lifetime + +- name: total_investment_from_specific + parameters: [total_investment_cost, specific_investment, capacity] + eq_str: total_investment_cost - specific_investment * capacity + priority: 1 + +- name: fixed_om_from_fraction + parameters: [fixed_om, specific_investment, fixed_om_fraction] + eq_str: fixed_om - specific_investment * fixed_om_fraction + priority: 1 + +- name: roundtrip_efficiency + parameters: [roundtrip_efficiency, charge_efficiency, discharge_efficiency] + eq_str: roundtrip_efficiency - charge_efficiency * discharge_efficiency + priority: 1 + +- name: fuel_variable_cost + parameters: [fuel_variable_cost, fuel_cost, efficiency] + eq_str: fuel_variable_cost - fuel_cost / efficiency + priority: 1 + +- name: co2_cost + parameters: [co2_cost, co2_price, co2_intensity] + eq_str: co2_cost - co2_price * co2_intensity + priority: 1 diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 789693df..3ed3bc8e 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -5,6 +5,7 @@ """Parameter class for encapsulating a value, its unit, provenance, notes, and sources.""" import logging +import math from typing import Annotated, Self import pint @@ -30,8 +31,8 @@ class Parameter(BaseModel): The energy carrier. heating_value : Optional[str] The heating value type. - provenance : Optional[str] - Description of the data's provenance. + provenance : Optional[list[str]] + Ordered history of human-readable descriptions of the data's provenance. note : Optional[str] Additional notes about the parameter. sources : Optional[SourceCollection] @@ -51,9 +52,14 @@ class Parameter(BaseModel): str | None, Field(description="Heating value type for energy carriers ('LHV' or 'HHV')."), ] = None - provenance: Annotated[str | None, Field(description="The data's provenance.")] = ( - None - ) + provenance: Annotated[ + list[str] | None, + Field( + description="Ordered history of human-readable descriptions of how this " + "parameter's value was derived, e.g. sourced from literature, parsed from " + "a file, or calculated from a formula." + ), + ] = None note: Annotated[str | None, Field(description="Additional notes.")] = None sources: Annotated[ SourceCollection, @@ -65,7 +71,9 @@ class Parameter(BaseModel): _pint_carrier: pint.Unit = PrivateAttr(None) _pint_heating_value: pint.Unit = PrivateAttr(None) - def __init__(self, **data: float | str | SourceCollection | None) -> None: + def __init__( + self, **data: float | str | list[str] | SourceCollection | None + ) -> None: """Initialize Parameter and update pint attributes.""" # pint uses canonical names for units, carriers, and heating values # Ensure the Parameter object is always created with these consistent names from pint @@ -123,6 +131,16 @@ def _update_pint_attributes(self) -> None: else: self._pint_heating_value = None + def __str__(self) -> str: + """Render magnitude, units, carrier, and heating value as one human-readable string.""" + self._update_pint_attributes() + parts = [str(self._pint_quantity)] + if self.carrier: + parts.append(f"carrier={self.carrier}") + if self.heating_value: + parts.append(f"heating_value={self.heating_value}") + return ", ".join(parts) + def to(self, units: str) -> Self: """Convert the parameter's quantity to new units.""" self._update_pint_attributes() @@ -147,6 +165,50 @@ def to(self, units: str) -> Self: sources=self.sources, ) # type: ignore + def isclose( + self, + other: Self, + rtol: float = 1e-6, + atol: float = 1e-9, + ) -> bool: + """ + Check whether another parameter is numerically and contextually consistent. + + Consistency means: + - same carrier + - same heating value + - compatible units (or both unitless) + - numerically close magnitudes after unit harmonization + """ + if self.carrier != other.carrier: + return False + + if self.heating_value != other.heating_value: + return False + + if self.units is None and other.units is None: + return math.isclose( + self.magnitude, + other.magnitude, + rel_tol=rtol, + abs_tol=atol, + ) + + if self.units is None or other.units is None: + return False + + try: + other_in_self_units = other.to(self.units) + except Exception: + return False + + return math.isclose( + self.magnitude, + other_in_self_units.magnitude, + rel_tol=rtol, + abs_tol=atol, + ) + def to_currency( self, target_currency: str, country: str, source: str = "worldbank" ) -> Self: @@ -366,7 +428,7 @@ def change_heating_value(self, to_heating_value: str) -> Self: def _check_parameter_compatibility(self, other: Self) -> None: """ - Check if two parameters are compatible in terms of units, carrier, and heating value. + Check if two parameters are compatible in terms of currency units, carrier, and heating value. Parameters ---------- @@ -376,7 +438,7 @@ def _check_parameter_compatibility(self, other: Self) -> None: Raises ------ ValueError - If the carriers or heating values of the two parameters are not compatible. + If the carriers, heating values, or currencies/currency years of the two parameters are not compatible. The error message specifies which attribute differs. """ @@ -390,6 +452,14 @@ def _check_parameter_compatibility(self, other: Self) -> None: f"Operation not permitted on parameters with different heating values: " f"'{self._pint_heating_value}' and '{other._pint_heating_value}'." ) + if set(technologydata.extract_currency_units(self._pint_quantity.units)) != set( + technologydata.extract_currency_units(other._pint_quantity.units) + ): + raise ValueError( + f"Operation not permitted on parameters with different currencies or currency years: " + f"'{self._pint_quantity.units}' and '{other._pint_quantity.units}'. " + f"Use `to_currency` to convert to the same currency before performing the operation." + ) def __add__(self, other: Self) -> Self: """ @@ -419,8 +489,7 @@ def __add__(self, other: Self) -> Self: units=new_quantity.units, carrier=self.carrier, heating_value=self.heating_value, - provenance=(self.provenance or "") - + (other.provenance or ""), # TODO make nicer + provenance=(self.provenance or []) + (other.provenance or []), note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -454,8 +523,7 @@ def __sub__(self, other: Self) -> Self: units=str(new_quantity.units), carrier=self.carrier, heating_value=self.heating_value, - provenance=(self.provenance or "") - + (other.provenance or ""), # TODO make nicer + provenance=(self.provenance or []) + (other.provenance or []), note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -523,8 +591,7 @@ def __truediv__(self, other: int | float | Self) -> Self: units=str(new_quantity.units), carrier=new_carrier, heating_value=new_heating_value, - provenance=(self.provenance or "") - + (other.provenance or ""), # TODO make nicer + provenance=(self.provenance or []) + (other.provenance or []), note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -591,8 +658,7 @@ def __mul__(self, other: int | float | Self) -> Self: units=str(new_quantity.units), carrier=str(new_carrier), heating_value=str(new_heating_value), - provenance=(self.provenance or "") - + (other.provenance or ""), # TODO make nicer + provenance=(self.provenance or []) + (other.provenance or []), note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) diff --git a/src/technologydata/parsers/dea_energy_storage/parser_v10.py b/src/technologydata/parsers/dea_energy_storage/parser_v10.py index 85122342..bbe24d92 100644 --- a/src/technologydata/parsers/dea_energy_storage/parser_v10.py +++ b/src/technologydata/parsers/dea_energy_storage/parser_v10.py @@ -454,7 +454,7 @@ def _build_technology_collection( magnitude=row["val"], units=row["unit"], sources=sources, - provenance="Parsed from Excel file", + provenance=["Parsed from Excel file"], ) list_techs.append( Technology( diff --git a/src/technologydata/parsers/dea_energy_storage/v10/technologies.json b/src/technologydata/parsers/dea_energy_storage/v10/technologies.json index 7d197591..72a8b737 100644 --- a/src/technologydata/parsers/dea_energy_storage/v10/technologies.json +++ b/src/technologydata/parsers/dea_energy_storage/v10/technologies.json @@ -12,7 +12,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -32,7 +34,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -52,7 +56,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -72,7 +78,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -92,7 +100,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -112,7 +122,9 @@ "units": "EUR_2020 / kilowatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -132,7 +144,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -161,7 +175,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -181,7 +197,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -201,7 +219,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -221,7 +241,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -241,7 +263,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -261,7 +285,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -281,7 +307,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -310,7 +338,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -330,7 +360,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -350,7 +382,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -370,7 +404,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -390,7 +426,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -410,7 +448,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -430,7 +470,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -459,7 +501,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -479,7 +523,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -499,7 +545,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -519,7 +567,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -539,7 +589,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -559,7 +611,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -579,7 +633,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -608,7 +664,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -628,7 +686,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -648,7 +708,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -668,7 +730,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -688,7 +752,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -717,7 +783,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -737,7 +805,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -757,7 +827,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -777,7 +849,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -797,7 +871,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -826,7 +902,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -846,7 +924,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -866,7 +946,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -895,7 +977,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -915,7 +999,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -935,7 +1021,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -955,7 +1043,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -975,7 +1065,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -995,7 +1087,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1015,7 +1109,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1044,7 +1140,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1064,7 +1162,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1084,7 +1184,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1104,7 +1206,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1124,7 +1228,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1144,7 +1250,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1164,7 +1272,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1193,7 +1303,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1213,7 +1325,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1233,7 +1347,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1253,7 +1369,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1273,7 +1391,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1293,7 +1413,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1322,7 +1444,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1342,7 +1466,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1362,7 +1488,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1382,7 +1510,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1402,7 +1532,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1422,7 +1554,9 @@ "units": "EUR_2020 / kilowatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1442,7 +1576,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1471,7 +1607,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1491,7 +1629,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1511,7 +1651,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1531,7 +1673,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1551,7 +1695,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1571,7 +1717,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1591,7 +1739,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1620,7 +1770,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1640,7 +1792,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1660,7 +1814,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1680,7 +1836,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1700,7 +1858,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1720,7 +1880,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1740,7 +1902,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1769,7 +1933,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1789,7 +1955,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1809,7 +1977,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1829,7 +1999,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1849,7 +2021,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1869,7 +2043,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1889,7 +2065,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1918,7 +2096,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1938,7 +2118,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1958,7 +2140,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1978,7 +2162,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -1998,7 +2184,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2018,7 +2206,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2047,7 +2237,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2067,7 +2259,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2087,7 +2281,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2107,7 +2303,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2127,7 +2325,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2147,7 +2347,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2167,7 +2369,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2196,7 +2400,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2216,7 +2422,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2236,7 +2444,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2256,7 +2466,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2276,7 +2488,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2305,7 +2519,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2325,7 +2541,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2345,7 +2563,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2365,7 +2585,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2385,7 +2607,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2414,7 +2638,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2434,7 +2660,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2454,7 +2682,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2474,7 +2704,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2494,7 +2726,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2514,7 +2748,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2534,7 +2770,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2563,7 +2801,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2583,7 +2823,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2603,7 +2845,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2632,7 +2876,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2652,7 +2898,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2672,7 +2920,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2692,7 +2942,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2712,7 +2964,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2732,7 +2986,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2752,7 +3008,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2781,7 +3039,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2801,7 +3061,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2821,7 +3083,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2850,7 +3114,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2870,7 +3136,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2890,7 +3158,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2910,7 +3180,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2930,7 +3202,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2959,7 +3233,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2979,7 +3255,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -2999,7 +3277,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3019,7 +3299,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3039,7 +3321,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3059,7 +3343,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3079,7 +3365,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3108,7 +3396,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3128,7 +3418,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3148,7 +3440,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3168,7 +3462,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3188,7 +3484,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3208,7 +3506,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3228,7 +3528,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3257,7 +3559,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3277,7 +3581,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3297,7 +3603,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3317,7 +3625,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3337,7 +3647,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3357,7 +3669,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3377,7 +3691,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3406,7 +3722,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3426,7 +3744,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3446,7 +3766,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3466,7 +3788,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3486,7 +3810,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3515,7 +3841,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3535,7 +3863,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3555,7 +3885,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3575,7 +3907,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3595,7 +3929,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3624,7 +3960,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3644,7 +3982,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3664,7 +4004,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3684,7 +4026,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3704,7 +4048,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3724,7 +4070,9 @@ "units": "EUR_2020 / kilowatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3744,7 +4092,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3773,7 +4123,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3793,7 +4145,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3813,7 +4167,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3833,7 +4189,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3853,7 +4211,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3873,7 +4233,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3893,7 +4255,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3922,7 +4286,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3942,7 +4308,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3962,7 +4330,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -3982,7 +4352,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4002,7 +4374,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4022,7 +4396,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4042,7 +4418,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4071,7 +4449,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4091,7 +4471,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4111,7 +4493,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4131,7 +4515,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4151,7 +4537,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4171,7 +4559,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4191,7 +4581,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4220,7 +4612,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4240,7 +4634,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4260,7 +4656,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4280,7 +4678,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4300,7 +4700,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4320,7 +4722,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4349,7 +4753,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4369,7 +4775,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4389,7 +4797,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4409,7 +4819,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4429,7 +4841,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4449,7 +4863,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4469,7 +4885,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4498,7 +4916,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4518,7 +4938,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4538,7 +4960,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4558,7 +4982,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4578,7 +5004,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4598,7 +5026,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4618,7 +5048,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4647,7 +5079,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4667,7 +5101,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4687,7 +5123,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4707,7 +5145,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4727,7 +5167,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4747,7 +5189,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4767,7 +5211,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4796,7 +5242,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4816,7 +5264,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4836,7 +5286,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4856,7 +5308,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4876,7 +5330,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4905,7 +5361,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4925,7 +5383,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4945,7 +5405,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4965,7 +5427,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -4985,7 +5449,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5014,7 +5480,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5034,7 +5502,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5054,7 +5524,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5074,7 +5546,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5094,7 +5568,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5114,7 +5590,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5134,7 +5612,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5163,7 +5643,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5183,7 +5665,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5203,7 +5687,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5232,7 +5718,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5252,7 +5740,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5272,7 +5762,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5292,7 +5784,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5312,7 +5806,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5341,7 +5837,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5361,7 +5859,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5381,7 +5881,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5401,7 +5903,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5421,7 +5925,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5441,7 +5947,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5461,7 +5969,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5490,7 +6000,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5510,7 +6022,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5530,7 +6044,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5559,7 +6075,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5579,7 +6097,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5599,7 +6119,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5619,7 +6141,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5639,7 +6163,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5668,7 +6194,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5688,7 +6216,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5708,7 +6238,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5728,7 +6260,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5748,7 +6282,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5768,7 +6304,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5788,7 +6326,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5817,7 +6357,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5837,7 +6379,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5857,7 +6401,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5877,7 +6423,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5897,7 +6445,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5917,7 +6467,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5937,7 +6489,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5966,7 +6520,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -5986,7 +6542,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6006,7 +6564,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6026,7 +6586,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6046,7 +6608,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6066,7 +6630,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6095,7 +6661,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6115,7 +6683,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6135,7 +6705,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6155,7 +6727,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6175,7 +6749,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6204,7 +6780,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6224,7 +6802,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6244,7 +6824,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6264,7 +6846,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6284,7 +6868,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6313,7 +6899,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6333,7 +6921,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6353,7 +6943,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6373,7 +6965,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6393,7 +6987,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6413,7 +7009,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6433,7 +7031,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6462,7 +7062,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6482,7 +7084,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6502,7 +7106,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6522,7 +7128,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6542,7 +7150,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6562,7 +7172,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6582,7 +7194,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6611,7 +7225,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6631,7 +7247,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6651,7 +7269,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6671,7 +7291,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6691,7 +7313,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6711,7 +7335,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6740,7 +7366,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6760,7 +7388,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6780,7 +7410,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6800,7 +7432,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6820,7 +7454,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6840,7 +7476,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6860,7 +7498,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6889,7 +7529,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6909,7 +7551,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6929,7 +7573,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6949,7 +7595,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6969,7 +7617,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -6989,7 +7639,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7009,7 +7661,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7038,7 +7692,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7058,7 +7714,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7078,7 +7736,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7098,7 +7758,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7118,7 +7780,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7138,7 +7802,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7158,7 +7824,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7187,7 +7855,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7207,7 +7877,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7227,7 +7899,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7247,7 +7921,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7267,7 +7943,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7287,7 +7965,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7307,7 +7987,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7336,7 +8018,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7356,7 +8040,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7376,7 +8062,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7396,7 +8084,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7416,7 +8106,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7445,7 +8137,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7465,7 +8159,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7485,7 +8181,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7505,7 +8203,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7525,7 +8225,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7545,7 +8247,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7565,7 +8269,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7594,7 +8300,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7614,7 +8322,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7634,7 +8344,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7663,7 +8375,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7683,7 +8397,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7703,7 +8419,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7723,7 +8441,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7743,7 +8463,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7772,7 +8494,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7792,7 +8516,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7812,7 +8538,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7832,7 +8560,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7852,7 +8582,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7872,7 +8604,9 @@ "units": "EUR_2020 / kilowatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7892,7 +8626,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7921,7 +8657,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7941,7 +8679,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7961,7 +8701,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -7981,7 +8723,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8001,7 +8745,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8021,7 +8767,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8041,7 +8789,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8070,7 +8820,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8090,7 +8842,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8110,7 +8864,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8130,7 +8886,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8150,7 +8908,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8170,7 +8930,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8190,7 +8952,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8219,7 +8983,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8239,7 +9005,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8259,7 +9027,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8279,7 +9049,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8299,7 +9071,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8319,7 +9093,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8339,7 +9115,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8368,7 +9146,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8388,7 +9168,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8408,7 +9190,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8428,7 +9212,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8448,7 +9234,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8468,7 +9256,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8497,7 +9287,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8517,7 +9309,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8537,7 +9331,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8557,7 +9353,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8577,7 +9375,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8597,7 +9397,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8617,7 +9419,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8646,7 +9450,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8666,7 +9472,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8686,7 +9494,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8706,7 +9516,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8726,7 +9538,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8746,7 +9560,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8766,7 +9582,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8795,7 +9613,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8815,7 +9635,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8835,7 +9657,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8855,7 +9679,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8875,7 +9701,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8895,7 +9723,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8915,7 +9745,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8944,7 +9776,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8964,7 +9798,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -8984,7 +9820,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9004,7 +9842,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9024,7 +9864,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9053,7 +9895,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9073,7 +9917,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9093,7 +9939,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9113,7 +9961,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9133,7 +9983,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9162,7 +10014,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9182,7 +10036,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9202,7 +10058,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9222,7 +10080,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9242,7 +10102,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9262,7 +10124,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9282,7 +10146,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9311,7 +10177,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9331,7 +10199,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9351,7 +10221,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9380,7 +10252,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9400,7 +10274,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9420,7 +10296,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9440,7 +10318,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9460,7 +10340,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9489,7 +10371,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9509,7 +10393,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9529,7 +10415,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9549,7 +10437,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9569,7 +10459,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9589,7 +10481,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9609,7 +10503,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9638,7 +10534,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9658,7 +10556,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9678,7 +10578,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9707,7 +10609,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9727,7 +10631,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9747,7 +10653,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9767,7 +10675,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9787,7 +10697,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9816,7 +10728,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9836,7 +10750,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9856,7 +10772,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9876,7 +10794,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9896,7 +10816,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9916,7 +10838,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9945,7 +10869,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9965,7 +10891,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -9985,7 +10913,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10005,7 +10935,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10025,7 +10957,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10045,7 +10979,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10065,7 +11001,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10094,7 +11032,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10114,7 +11054,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10134,7 +11076,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10154,7 +11098,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10174,7 +11120,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10194,7 +11142,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10214,7 +11164,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10243,7 +11195,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10263,7 +11217,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10283,7 +11239,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10303,7 +11261,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10323,7 +11283,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10343,7 +11305,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10372,7 +11336,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10392,7 +11358,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10412,7 +11380,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10432,7 +11402,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10452,7 +11424,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10472,7 +11446,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10501,7 +11477,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10521,7 +11499,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10541,7 +11521,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10561,7 +11543,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10581,7 +11565,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10601,7 +11587,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10621,7 +11609,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10650,7 +11640,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10670,7 +11662,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10690,7 +11684,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10710,7 +11706,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10730,7 +11728,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10759,7 +11759,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10779,7 +11781,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10799,7 +11803,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10819,7 +11825,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10839,7 +11847,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10868,7 +11878,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10888,7 +11900,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10908,7 +11922,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10928,7 +11944,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10948,7 +11966,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10968,7 +11988,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -10988,7 +12010,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11017,7 +12041,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11037,7 +12063,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11066,7 +12094,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11086,7 +12116,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11106,7 +12138,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11126,7 +12160,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11146,7 +12182,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11166,7 +12204,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11186,7 +12226,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11215,7 +12257,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11235,7 +12279,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11255,7 +12301,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11275,7 +12323,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11295,7 +12345,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11315,7 +12367,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11335,7 +12389,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11364,7 +12420,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11384,7 +12442,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11404,7 +12464,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11424,7 +12486,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11444,7 +12508,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11473,7 +12539,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11493,7 +12561,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11513,7 +12583,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11533,7 +12605,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11553,7 +12627,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11573,7 +12649,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11593,7 +12671,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11622,7 +12702,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11642,7 +12724,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11662,7 +12746,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11682,7 +12768,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11702,7 +12790,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11731,7 +12821,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11751,7 +12843,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11771,7 +12865,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11791,7 +12887,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11811,7 +12909,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11831,7 +12931,9 @@ "units": "EUR_2020 / kilowatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11851,7 +12953,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11880,7 +12984,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11900,7 +13006,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11920,7 +13028,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11940,7 +13050,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11960,7 +13072,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -11980,7 +13094,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12000,7 +13116,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12029,7 +13147,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12049,7 +13169,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12069,7 +13191,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12089,7 +13213,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12109,7 +13235,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12129,7 +13257,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12149,7 +13279,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12178,7 +13310,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12198,7 +13332,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12218,7 +13354,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12238,7 +13376,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12258,7 +13398,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12278,7 +13420,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12307,7 +13451,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12327,7 +13473,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12347,7 +13495,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12367,7 +13517,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12387,7 +13539,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12407,7 +13561,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12436,7 +13592,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12456,7 +13614,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12476,7 +13636,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12496,7 +13658,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12516,7 +13680,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12536,7 +13702,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12556,7 +13724,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12585,7 +13755,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12605,7 +13777,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12625,7 +13799,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12645,7 +13821,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12665,7 +13843,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12685,7 +13865,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12705,7 +13887,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12734,7 +13918,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12754,7 +13940,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12774,7 +13962,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12794,7 +13984,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12814,7 +14006,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12834,7 +14028,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12854,7 +14050,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12883,7 +14081,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12903,7 +14103,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12923,7 +14125,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12943,7 +14147,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12963,7 +14169,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -12992,7 +14200,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13012,7 +14222,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13032,7 +14244,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13052,7 +14266,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13072,7 +14288,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13101,7 +14319,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13121,7 +14341,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13141,7 +14363,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13161,7 +14385,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13181,7 +14407,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13201,7 +14429,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13221,7 +14451,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13250,7 +14482,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13270,7 +14504,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13299,7 +14535,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13319,7 +14557,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13339,7 +14579,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13359,7 +14601,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13379,7 +14623,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13408,7 +14654,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13428,7 +14676,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13448,7 +14698,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13468,7 +14720,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13488,7 +14742,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13508,7 +14764,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13528,7 +14786,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13557,7 +14817,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13577,7 +14839,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13597,7 +14861,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13617,7 +14883,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13637,7 +14905,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13666,7 +14936,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13686,7 +14958,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13706,7 +14980,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13726,7 +15002,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13746,7 +15024,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13766,7 +15046,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13795,7 +15077,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13815,7 +15099,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13835,7 +15121,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13855,7 +15143,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13875,7 +15165,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13895,7 +15187,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13915,7 +15209,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13944,7 +15240,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13964,7 +15262,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -13984,7 +15284,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14004,7 +15306,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14024,7 +15328,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14044,7 +15350,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14064,7 +15372,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14093,7 +15403,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14113,7 +15425,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14133,7 +15447,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14153,7 +15469,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14173,7 +15491,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14193,7 +15513,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14222,7 +15544,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14242,7 +15566,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14262,7 +15588,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14282,7 +15610,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14302,7 +15632,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14322,7 +15654,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14351,7 +15685,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14371,7 +15707,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14391,7 +15729,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14411,7 +15751,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14431,7 +15773,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14451,7 +15795,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14471,7 +15817,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14500,7 +15848,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14520,7 +15870,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14540,7 +15892,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14560,7 +15914,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14580,7 +15936,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14609,7 +15967,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14629,7 +15989,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14649,7 +16011,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14669,7 +16033,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14689,7 +16055,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14718,7 +16086,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14738,7 +16108,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14758,7 +16130,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14778,7 +16152,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14798,7 +16174,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14818,7 +16196,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14838,7 +16218,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14867,7 +16249,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14887,7 +16271,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14916,7 +16302,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14936,7 +16324,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14956,7 +16346,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14976,7 +16368,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -14996,7 +16390,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15016,7 +16412,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15036,7 +16434,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15065,7 +16465,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15085,7 +16487,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15105,7 +16509,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15125,7 +16531,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15145,7 +16553,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15165,7 +16575,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15185,7 +16597,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15214,7 +16628,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15234,7 +16650,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15254,7 +16672,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15274,7 +16694,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15294,7 +16716,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15323,7 +16747,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15343,7 +16769,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15363,7 +16791,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15383,7 +16813,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15403,7 +16835,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15423,7 +16857,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15443,7 +16879,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15472,7 +16910,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15492,7 +16932,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15512,7 +16954,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15532,7 +16976,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15552,7 +16998,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15581,7 +17029,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15601,7 +17051,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15621,7 +17073,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15641,7 +17095,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15661,7 +17117,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15681,7 +17139,9 @@ "units": "EUR_2020 / kilowatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15701,7 +17161,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15730,7 +17192,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15750,7 +17214,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15770,7 +17236,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15790,7 +17258,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15810,7 +17280,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15830,7 +17302,9 @@ "units": "EUR_2020 / megawatt", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15850,7 +17324,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15879,7 +17355,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15899,7 +17377,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15919,7 +17399,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15939,7 +17421,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15959,7 +17443,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15979,7 +17465,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -15999,7 +17487,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16028,7 +17518,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16048,7 +17540,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16068,7 +17562,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16088,7 +17584,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16108,7 +17606,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16128,7 +17628,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16157,7 +17659,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16177,7 +17681,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16197,7 +17703,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16217,7 +17725,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16237,7 +17747,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16257,7 +17769,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16286,7 +17800,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16306,7 +17822,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16326,7 +17844,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16346,7 +17866,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16366,7 +17888,9 @@ "units": "EUR_2020 / megawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16386,7 +17910,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16406,7 +17932,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16435,7 +17963,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16455,7 +17985,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16475,7 +18007,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16495,7 +18029,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16515,7 +18051,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16535,7 +18073,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16555,7 +18095,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16584,7 +18126,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16604,7 +18148,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16624,7 +18170,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16644,7 +18192,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16664,7 +18214,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16684,7 +18236,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16704,7 +18258,9 @@ "units": "percent / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16733,7 +18289,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16753,7 +18311,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16773,7 +18333,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16793,7 +18355,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16813,7 +18377,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16842,7 +18408,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16862,7 +18430,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16882,7 +18452,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16902,7 +18474,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16922,7 +18496,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16951,7 +18527,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16971,7 +18549,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -16991,7 +18571,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17011,7 +18593,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17031,7 +18615,9 @@ "units": "EUR_2020 / gigawatt_hour / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17051,7 +18637,9 @@ "units": "EUR_2020 / gigawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17071,7 +18659,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17100,7 +18690,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17120,7 +18712,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17149,7 +18743,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17169,7 +18765,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17189,7 +18787,9 @@ "units": "meter ** 3", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17209,7 +18809,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17229,7 +18831,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17258,7 +18862,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17278,7 +18884,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17298,7 +18906,9 @@ "units": "liter", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17318,7 +18928,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17338,7 +18950,9 @@ "units": "EUR_2020 / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17358,7 +18972,9 @@ "units": "EUR_2020 / kilowatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17378,7 +18994,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17407,7 +19025,9 @@ "units": "megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17427,7 +19047,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17447,7 +19069,9 @@ "units": "EUR_2020 / megawatt / year", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17467,7 +19091,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ @@ -17487,7 +19113,9 @@ "units": "EUR_2020 / megawatt_hour", "carrier": null, "heating_value": null, - "provenance": "Parsed from Excel file", + "provenance": [ + "Parsed from Excel file" + ], "note": null, "sources": { "sources": [ diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 8065f8e1..6880dedf 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -4,12 +4,16 @@ """Technology class for representing a technology with parameters and transformation methods.""" -from typing import Annotated, Any, Self +from collections.abc import Sequence +from typing import TYPE_CHECKING, Annotated, Self import pydantic from technologydata.parameter import Parameter +if TYPE_CHECKING: + from technologydata.equations import Equation, EquationRegistry + class Technology(pydantic.BaseModel): """ @@ -75,38 +79,180 @@ def __setitem__(self, key: str, value: Parameter) -> None: """ self.parameters[key] = value - def check_consistency(self) -> bool: + def check_consistency( + self, + parameters: Sequence[str] | None = None, + equations: "EquationRegistry | None" = None, + rtol: float = 1e-6, + atol: float = 1e-9, + ) -> dict[str, bool | str]: """ - Check for consistency and completeness of parameters. + Check equation-level consistency for selected parameters. + + If ``parameters`` is given, only equations linked to those parameters + are checked and other parameters are ignored. If ``parameters`` is + ``None``, all parameters present on this technology are checked. + + If ``equations`` is not provided, the package default registry + is used. + + Returns a mapping from equation name to status: + + - ``True`` if values are consistent with the equation. + - ``False`` if values violate the equation. + - ``"missing parameters"`` followed by the list of missing parameters to + evaluate the equation, e.g. ``"missing parameters: ['wacc', 'lifetime']"``. + - ``"inapplicable"`` if none of the equations parameters are present, followed + by the list of these missing parameters, e.g. + ``"inapplicable: ['specific_investment', 'annuity_factor']"``. + + Only equations that share at least one parameter with the checked + parameter set appear in the result. If ``parameters`` is given + explicitly and names a parameter with no registered equation at all, + a :class:`ValueError` is raised. + + Parameters + ---------- + parameters: list[str] (optional) + The parameters to check for consistency. If None are specified, + all parameters of the Technology are considered. + equations: EquationRegistry (optional) + A registry of equations to check against. + Defaults to technologydata.equation_registry. + rtol: float (optional) + Relative tolerance to use for checking consistency of the parameters. + atol: float (optional) + Absolute tolerance to use for checking consistency of the parameters. + + Returns ------- - bool - True if consistent, False otherwise. + dict[str, bool | str] + Consistency status per checked equation. + + Raises + ------ + ValueError + If ``parameters`` is given explicitly and includes a name for + which no equation is registered. """ - # Example: check required parameters - required = ["specific_investment", "investment", "lifetime"] - missing = [p for p in required if p not in self.parameters] - return len(missing) == 0 + if equations is None: + from technologydata.default_equations import ( + equation_registry as default_registry, + ) + + equations = default_registry + + checked_names = tuple(parameters or self.parameters.keys()) + + if parameters is not None: + unknown = [ + name + for name in checked_names + if name not in equations._equations_by_parameter + ] + if unknown: + raise ValueError(f"No equation registered for parameter(s): {unknown}.") + + # Keep one anchor target parameter per equation so each equation is + # evaluated exactly once while still respecting the user's filter. + equations_to_check: dict[str, tuple[Equation, str]] = {} + for target in checked_names: + for equation in equations._equations_by_parameter.get(target, []): + if equation.name not in equations_to_check: + equations_to_check[equation.name] = (equation, target) + + available_params = dict(self.parameters) + + result: dict[str, bool | str] = {} + for equation_name, (equation, target) in equations_to_check.items(): + supporting_params = [name for name in equation.parameters if name != target] + present_supporting = [ + name for name in supporting_params if name in available_params + ] + missing = [ + name for name in equation.parameters if name not in available_params + ] + + if not present_supporting: + result[equation_name] = f"inapplicable: {missing}" + continue + + if missing: + result[equation_name] = f"missing parameters: {missing}" + continue + + known_params = {name: available_params[name] for name in supporting_params} + + expected = equations.calculate( + target, + known_params, + equation_name=equation_name, + ) + + observed = available_params[target] + result[equation_name] = observed.isclose( + expected, + rtol=rtol, + atol=atol, + ) + + return result - def calculate_parameters(self, parameters: Any | None = None) -> Self: + def calculate_parameters( + self, + targets: str | list[str] | None = None, + equation_names: dict[str, str] | None = None, + ) -> Self: """ - Calculate missing or derived parameters. + Derive missing parameters using registered equations. Parameters ---------- - parameters : Optional[Any] - List of parameter names to calculate, or "" for all missing. + targets : str or list of str, optional + Parameter names to derive. If ``None``, all parameters that can be + derived from currently available parameters (and are not already + present) are calculated automatically. + equation_names : dict of str to str, optional + Mapping of parameter name to equation name, used to override the + default equation for specific targets + (e.g. ``{"eac": "eac_simple"}``). Returns ------- Technology - A new Technology object with calculated parameters. + A new Technology instance with the derived parameters added. + + Raises + ------ + ValueError + If a requested target has no applicable equation, required parameters + are missing, or input currencies are inconsistent. """ - # Placeholder: implement calculation logic as needed - return self + from technologydata.default_equations import equation_registry + + new_params: dict[str, Parameter] = dict(self.parameters) + + if targets is None: + targets = [ + p + for p in equation_registry._equations_by_parameter + if p not in new_params + and equation_registry.can_calculate(p, new_params) + ] + elif isinstance(targets, str): + targets = [targets] + + for target in targets: + equation_name = equation_names.get(target) if equation_names else None + new_params[target] = equation_registry.calculate( + target, new_params, equation_name + ) + + return self.model_copy(update={"parameters": new_params}) def to_currency( self, diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index b3f78fa1..084b8016 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -9,8 +9,8 @@ import logging import pathlib import re -from collections.abc import Iterator -from typing import Annotated, Self +from collections.abc import Iterator, Sequence +from typing import TYPE_CHECKING, Annotated, Self import pandas import pydantic @@ -20,6 +20,9 @@ from technologydata.technologies.growth_models import GrowthModel, LinearGrowth from technologydata.technology import Technology +if TYPE_CHECKING: + from technologydata.equations import EquationRegistry + logger = logging.getLogger(__name__) @@ -289,6 +292,89 @@ def to_currency( return TechnologyCollection(technologies=new_techs) # type: ignore + def calculate_parameters( + self, + targets: str | list[str] | None = None, + equation_names: dict[str, str] | None = None, + ) -> Self: + """ + Derive missing parameters of every contained Technology using registered equations. + + Parameters + ---------- + targets : str or list of str, optional + Parameter names to derive. If ``None``, for each technology all parameters + that can be derived from its currently available parameters (and are not + already present) are calculated automatically. + equation_names : dict of str to str, optional + Mapping of parameter name to equation name, used to override the + default equation for specific targets + (e.g. ``{"eac": "eac_simple"}``). + + Returns + ------- + TechnologyCollection + A new TechnologyCollection with the derived parameters added to each technology. + + Raises + ------ + ValueError + If a requested target has no applicable equation, required parameters + are missing, or input currencies are inconsistent, for any technology. + + """ + new_techs = [ + tech.calculate_parameters(targets=targets, equation_names=equation_names) + for tech in self.technologies + ] + return TechnologyCollection(technologies=new_techs) # type: ignore + + def check_consistency( + self, + parameters: Sequence[str] | None = None, + equations: "EquationRegistry | None" = None, + rtol: float = 1e-6, + atol: float = 1e-9, + ) -> list[dict[str, bool | str]]: + """ + Check equation-level consistency for selected parameters of every contained Technology. + + See :meth:`Technology.check_consistency` for the semantics applied to each + technology individually. + + Parameters + ---------- + parameters: list[str] (optional) + The parameters to check for consistency. If None are specified, + all parameters of each Technology are considered. + equations: EquationRegistry (optional) + A registry of equations to check against. + Defaults to technologydata.equation_registry. + rtol: float (optional) + Relative tolerance to use for checking consistency of the parameters. + atol: float (optional) + Absolute tolerance to use for checking consistency of the parameters. + + Returns + ------- + list[dict[str, bool | str]] + Consistency status per checked equation, one dict per technology, + in the same order as `self.technologies`. + + Raises + ------ + ValueError + If ``parameters`` is given explicitly and includes a name for + which no equation is registered, for any technology. + + """ + return [ + tech.check_consistency( + parameters=parameters, equations=equations, rtol=rtol, atol=atol + ) + for tech in self.technologies + ] + def fit( self, parameter: str, model: GrowthModel, p0: dict[str, float] | None = None ) -> GrowthModel: @@ -436,7 +522,9 @@ def project( deep=True, update={ "magnitude": param_value, - "provenance": f"Projected to {to_year} using {model}.", + "provenance": [ + f"Projected to {to_year} using {model}." + ], "note": None, # Clear any existing note "sources": None, # Clear any existing sources }, diff --git a/test/test_data/solar_photovoltaics_example/technologies.json b/test/test_data/solar_photovoltaics_example/technologies.json index 4288346a..a0866666 100644 --- a/test/test_data/solar_photovoltaics_example/technologies.json +++ b/test/test_data/solar_photovoltaics_example/technologies.json @@ -12,7 +12,9 @@ "units": "megawatt", "carrier": "electricity", "heating_value": null, - "provenance": "Model calculation", + "provenance": [ + "Model calculation" + ], "note": "Average capacity factor of 22% assumed", "sources": { "sources": [ @@ -40,7 +42,9 @@ "units": "EUR_2022 / kilowatt", "carrier": "1 / electricity", "heating_value": null, - "provenance": "Industry report", + "provenance": [ + "Industry report" + ], "note": "Average overnight cost", "sources": { "sources": [ @@ -68,7 +72,9 @@ "units": "EUR_2022 / watt", "carrier": "1 / electricity", "heating_value": null, - "provenance": "Derived", + "provenance": [ + "Derived" + ], "note": "Calculated from investment/capacity", "sources": { "sources": [ @@ -96,7 +102,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Manufacturer specification", + "provenance": [ + "Manufacturer specification" + ], "note": "With performance degradation guarantee", "sources": { "sources": [ @@ -124,7 +132,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Financial analysis", + "provenance": [ + "Financial analysis" + ], "note": "Nominal weighted average cost of capital", "sources": { "sources": [ @@ -161,7 +171,9 @@ "units": "megawatt", "carrier": "electricity", "heating_value": null, - "provenance": "Model calculation", + "provenance": [ + "Model calculation" + ], "note": "Average capacity factor of 25% assumed", "sources": { "sources": [ @@ -189,7 +201,9 @@ "units": "EUR_2022 / kilowatt", "carrier": "1 / electricity", "heating_value": null, - "provenance": "Industry report", + "provenance": [ + "Industry report" + ], "note": "Average overnight cost", "sources": { "sources": [ @@ -217,7 +231,9 @@ "units": "EUR_2022 / watt", "carrier": "1 / electricity", "heating_value": null, - "provenance": "Derived", + "provenance": [ + "Derived" + ], "note": "Calculated from investment/capacity", "sources": { "sources": [ @@ -245,7 +261,9 @@ "units": "year", "carrier": null, "heating_value": null, - "provenance": "Manufacturer specification", + "provenance": [ + "Manufacturer specification" + ], "note": "With performance degradation guarantee", "sources": { "sources": [ @@ -273,7 +291,9 @@ "units": "percent", "carrier": null, "heating_value": null, - "provenance": "Financial analysis", + "provenance": [ + "Financial analysis" + ], "note": "Nominal weighted average cost of capital", "sources": { "sources": [ diff --git a/test/test_equations.py b/test/test_equations.py new file mode 100644 index 00000000..8843744e --- /dev/null +++ b/test/test_equations.py @@ -0,0 +1,1175 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Tests for Equation, EquationRegistry, and Technology.calculate_parameters.""" + +import pathlib + +import pytest + +import technologydata # noqa: F401 β€” ensures default_formulas are registered +import technologydata.equations as equations_module +from technologydata.default_equations import equation_registry +from technologydata.equations import Equation, EquationRegistry +from technologydata.parameter import Parameter +from technologydata.technology import Technology + +# --------------------------------------------------------------------------- +# Helpers / shared fixtures +# --------------------------------------------------------------------------- + +EAC_ANNUITY_PARAMS = { + "specific_investment": Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": Parameter(magnitude=20.0, units="year"), +} + +EAC_SIMPLE_PARAMS = { + "total_investment_cost": Parameter(magnitude=2000.0, units="USD_2020/kW"), + "lifetime": Parameter(magnitude=20.0, units="year"), +} + +# eac_annuity forward result: 1000 * 0.07 / (1 - 1.07^-20) +_EAC_ANNUITY_EXPECTED = 1000.0 * 0.07 / (1 - 1.07**-20) +# eac_simple forward result: 2000 / 20 +_EAC_SIMPLE_EXPECTED = 100.0 +# annuity_factor for wacc=0.07, lifetime=20 +_AF_EXPECTED = 0.07 / (1 - 1.07**-20) + + +# --------------------------------------------------------------------------- +# Equation.can_solve_for +# --------------------------------------------------------------------------- + + +class TestEquationCanSolveFor: + """Test suite for Equation.can_solve_for.""" + + def test_can_solve_for_target_when_all_others_present(self) -> None: + """Test that can_solve_for returns True when all other parameters are present.""" + link = Equation( + name="test", + parameters=["a", "b", "c"], + eq_str="a - b - c", + ) + params = { + "b": Parameter(magnitude=1.0, units="dimensionless"), + "c": Parameter(magnitude=2.0, units="dimensionless"), + } + assert link.can_solve_for("a", params) is True + + def test_cannot_solve_for_target_not_in_parameters(self) -> None: + """Test that can_solve_for returns False when the target is not one of the equation's parameters.""" + link = Equation( + name="test", + parameters=["a", "b"], + eq_str="a - b", + ) + params = {"a": Parameter(magnitude=1.0, units="dimensionless")} + assert link.can_solve_for("x", params) is False + + def test_cannot_solve_when_input_missing(self) -> None: + """Test that can_solve_for returns False when a required input parameter is missing.""" + link = Equation( + name="test", + parameters=["a", "b", "c"], + eq_str="a - b - c", + ) + # c is missing + params = {"b": Parameter(magnitude=1.0, units="dimensionless")} + assert link.can_solve_for("a", params) is False + + +class TestEquationRepr: + """Test suite for Equation.__repr__.""" + + def test_repr_includes_core_fields(self) -> None: + """Test that repr includes the equation's name, parameters, eq_str, and priority.""" + equation = Equation( + name="simple", + parameters=["target", "input_a", "input_b"], + eq_str="target - input_a - input_b", + priority=2, + ) + + rep = repr(equation) + + assert rep.startswith("Equation(") + assert "name='simple'" in rep + assert "parameters=['target', 'input_a', 'input_b']" in rep + assert "eq_str='target - input_a - input_b'" in rep + assert "priority=2" in rep + + def test_repr_preserves_parameter_order(self) -> None: + """Test that repr preserves the original order of the parameters list.""" + equation = Equation( + name="ordered", + parameters=["z", "x", "y"], + eq_str="z - x - y", + ) + + rep = repr(equation) + + assert "parameters=['z', 'x', 'y']" in rep + + def test_repr_truncates_long_expression(self) -> None: + """Test that repr truncates a long eq_str expression with an ellipsis.""" + long_expr = "x - " + " + ".join(f"p{i}" for i in range(100)) + equation = Equation( + name="long", + parameters=["x", "p0"], + eq_str=long_expr, + ) + + rep = repr(equation) + + assert "eq_str='" in rep + assert "...'" in rep + assert long_expr not in rep + + +class TestEquationStr: + """Test suite for Equation.__str__.""" + + def test_str_without_description(self) -> None: + """Test that str formats the equation without a description.""" + equation = Equation( + name="simple", + parameters=["target", "input_a", "input_b"], + eq_str="target - input_a - input_b", + ) + + assert str(equation) == "simple: target - input_a - input_b = 0" + + def test_str_with_description(self) -> None: + """Test that str appends the description in parentheses when present.""" + equation = Equation( + name="simple", + parameters=["target", "input_a", "input_b"], + eq_str="target - input_a - input_b", + description="Sum of two inputs.", + ) + + assert ( + str(equation) + == "simple: target - input_a - input_b = 0 (Sum of two inputs.)" + ) + + def test_str_does_not_truncate_long_expression(self) -> None: + """Test that str does not truncate a long eq_str expression.""" + long_expr = "x - " + " + ".join(f"p{i}" for i in range(100)) + equation = Equation( + name="long", + parameters=["x", "p0"], + eq_str=long_expr, + ) + + assert long_expr in str(equation) + + +class TestEquationCaching: + """Test suite for symbolic solution caching on Equation.""" + + def test_symbolic_solutions_precomputed_on_registration( + self, monkeypatch: pytest.MonkeyPatch + ) -> None: + """Test that symbolic solutions are precomputed once per parameter at registration time.""" + calls = {"count": 0} + + def fake_solve_with_timeout(expr: object, symbol: object) -> list[object]: + calls["count"] += 1 + return [] + + monkeypatch.setattr( + equations_module, "_solve_with_timeout", fake_solve_with_timeout + ) + + Equation( + name="precompute", + parameters=["a", "b", "c"], + eq_str="a - b - c", + ) + + assert calls["count"] == 3 + + def test_solve_for_uses_cached_symbolic_solution( + self, monkeypatch: pytest.MonkeyPatch + ) -> None: + """Test that solve_for reuses the cached symbolic solution instead of recomputing it.""" + equation = Equation( + name="cached_linear", + parameters=["a", "b"], + eq_str="a - b", + ) + + # Any new call to _solve_with_timeout during solve_for would indicate + # that symbolic caching is not used. + def fail_if_called(expr: object, symbol: object) -> list[object]: + raise AssertionError( + "_solve_with_timeout should not be called during solve_for" + ) + + monkeypatch.setattr(equations_module, "_solve_with_timeout", fail_if_called) + + result = equation.solve_for( + "a", {"b": Parameter(magnitude=2.0, units="dimensionless")} + ) + + assert result.magnitude == pytest.approx(2.0) + + def test_unsolved_target_skips_symbolic_step_per_call( + self, monkeypatch: pytest.MonkeyPatch + ) -> None: + """Test that solve_for re-invokes the symbolic solver once per call when no cached solution exists for the target.""" + equation = Equation( + name="annuity", + parameters=["annuity_factor", "wacc", "lifetime"], + eq_str="annuity_factor - wacc / (1 - (1 + wacc)**(-lifetime))", + ) + + calls = {"total": 0, "symbolic": 0} + + def fake_solve_with_timeout(expr: object, symbol: object) -> list[object]: + calls["total"] += 1 + # Symbolic step would still contain multiple free symbols. + if len(expr.free_symbols) > 1: # type: ignore[attr-defined] + calls["symbolic"] += 1 + raise NotImplementedError + + monkeypatch.setattr( + equations_module, "_solve_with_timeout", fake_solve_with_timeout + ) + + af = Parameter(magnitude=_AF_EXPECTED, units="dimensionless") + lifetime = Parameter(magnitude=20.0, units="year") + + with pytest.raises(NotImplementedError): + equation.solve_for("wacc", {"annuity_factor": af, "lifetime": lifetime}) + with pytest.raises(NotImplementedError): + equation.solve_for("wacc", {"annuity_factor": af, "lifetime": lifetime}) + + assert calls["symbolic"] == 0 + assert calls["total"] == 2 + + +# --------------------------------------------------------------------------- +# Currency consistency checks +# --------------------------------------------------------------------------- + + +class TestCurrencyConsistency: + """Test suite for currency-year consistency checks during solve_for.""" + + def _link(self) -> Equation: + return Equation( + name="test", + parameters=["a", "b", "c"], + eq_str="a - b - c", + ) + + def test_required_matching_currency_years_pass(self) -> None: + """Test that solve_for succeeds when all required currency parameters share the same currency year.""" + params = { + "b": Parameter(magnitude=1.0, units="USD_2020/kW"), + "c": Parameter(magnitude=2.0, units="USD_2020/kW"), + } + result = self._link().solve_for("a", params) + assert result.magnitude == pytest.approx(3.0) + assert "USD_2020" in (result.units or "") + + def test_no_currency_required_params_does_not_raise(self) -> None: + """Test that solve_for does not raise when no required parameters carry currency units.""" + params = { + "b": Parameter(magnitude=0.5, units="year"), + "c": Parameter(magnitude=0.5, units="year"), + } + result = self._link().solve_for("a", params) + assert result.magnitude == pytest.approx(1.0) + + def test_mixed_with_non_currency_required_param_passes(self) -> None: + """Test that solve_for succeeds when required parameters mix currency and non-currency units.""" + link = Equation( + name="test", + parameters=["a", "b", "c"], + eq_str="a - b * c", + ) + params = { + "b": Parameter(magnitude=1000.0, units="USD_2020/kW"), + "c": Parameter(magnitude=0.07, units="dimensionless"), + } + result = link.solve_for("a", params) + assert result.magnitude == pytest.approx(70.0) + assert "USD_2020" in (result.units or "") + + def test_extra_non_required_currency_param_is_ignored(self) -> None: + """Test that a currency mismatch on a parameter not required by the equation is ignored.""" + params = { + "b": Parameter(magnitude=2.0, units="USD_2020/kW"), + # `x` is unrelated to this equation and should not be validated. + "x": Parameter(magnitude=1.0, units="EUR_2020/kW"), + } + result = Equation( + name="test", + parameters=["a", "b"], + eq_str="a - b", + ).solve_for("a", params) + assert result.magnitude == pytest.approx(2.0) + + +# --------------------------------------------------------------------------- +# EAC β€” forward and backward +# --------------------------------------------------------------------------- + + +class TestEacAnnuity: + """Test suite for the eac_annuity formula (forward and backward).""" + + def test_forward_eac(self) -> None: + """Test that eac_annuity computes the expected forward EAC value.""" + result = equation_registry.calculate("eac", EAC_ANNUITY_PARAMS) + assert result.magnitude == pytest.approx(_EAC_ANNUITY_EXPECTED, rel=1e-6) + + def test_forward_eac_currency_inherited(self) -> None: + """Test that the forward EAC result inherits the specific investment's currency and power units.""" + # lifetime appears only as exponent, so pint gives USD_2020/kW (not /year) + result = equation_registry.calculate("eac", EAC_ANNUITY_PARAMS) + assert result.units is not None + assert "USD_2020" in result.units + assert "kilowatt" in result.units # pint canonicalises kW β†’ kilowatt + + def test_forward_eac_provenance(self) -> None: + """Test that the forward EAC result records provenance describing the formula and inputs used.""" + result = equation_registry.calculate("eac", EAC_ANNUITY_PARAMS) + assert result.provenance is not None + assert len(result.provenance) == 1 + entry = result.provenance[0] + assert "calculated from other parameters" in entry.lower() + assert "formula 'eac_annuity'" in entry + equation = equation_registry.get_equation("eac", EAC_ANNUITY_PARAMS) + assert equation.expr_str in entry + for name, param in EAC_ANNUITY_PARAMS.items(): + assert name in entry + assert str(param) in entry + + def test_backward_specific_investment(self) -> None: + """Test that eac_annuity can be solved backward for specific_investment given eac, wacc, and lifetime.""" + eac = equation_registry.calculate("eac", EAC_ANNUITY_PARAMS) + params = { + "eac": eac, + "wacc": EAC_ANNUITY_PARAMS["wacc"], + "lifetime": EAC_ANNUITY_PARAMS["lifetime"], + } + result = equation_registry.calculate("specific_investment", params) + assert result.magnitude == pytest.approx(1000.0, rel=1e-4) + assert result.units is not None + assert "USD_2020" in result.units + assert "kilowatt" in result.units + + def test_backward_lifetime(self) -> None: + """Test that eac_annuity can be solved backward for lifetime using the numeric fallback.""" + # Solving for lifetime requires log(); pint falls back to magnitudes. + eac = equation_registry.calculate("eac", EAC_ANNUITY_PARAMS) + params = { + "eac": eac, + "specific_investment": EAC_ANNUITY_PARAMS["specific_investment"], + "wacc": EAC_ANNUITY_PARAMS["wacc"], + } + result = equation_registry.calculate("lifetime", params) + assert result.magnitude == pytest.approx(20.0, rel=1e-4) + + +class TestEacSimple: + """Test suite for the eac_simple formula (forward and backward).""" + + def test_forward_eac(self) -> None: + """Test that eac_simple computes the expected forward EAC value with correct provenance and units.""" + result = equation_registry.calculate( + "eac", EAC_SIMPLE_PARAMS, equation_name="eac_simple" + ) + assert result.magnitude == pytest.approx(_EAC_SIMPLE_EXPECTED) + assert result.provenance is not None + assert len(result.provenance) == 1 + assert "formula 'eac_simple'" in result.provenance[0] + # eac_simple divides by lifetime directly, so pint gives /year correctly + assert result.units is not None + assert "kilowatt" in result.units + assert "year" in result.units + + def test_backward_total_investment_cost(self) -> None: + """Test that eac_simple can be solved backward for total_investment_cost given eac and lifetime.""" + eac = equation_registry.calculate( + "eac", EAC_SIMPLE_PARAMS, equation_name="eac_simple" + ) + params = {"eac": eac, "lifetime": EAC_SIMPLE_PARAMS["lifetime"]} + result = equation_registry.calculate( + "total_investment_cost", params, equation_name="eac_simple" + ) + assert result.magnitude == pytest.approx(2000.0) + + +# --------------------------------------------------------------------------- +# Annuity factor +# --------------------------------------------------------------------------- + + +class TestAnnuityFactor: + """Test suite for the annuity_factor formula (forward and backward).""" + + _PARAMS = { + "wacc": Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": Parameter(magnitude=20.0, units="year"), + } + + def test_forward_annuity_factor(self) -> None: + """Test that annuity_factor computes the expected forward value with provenance.""" + result = equation_registry.calculate("annuity_factor", self._PARAMS) + assert result.magnitude == pytest.approx(_AF_EXPECTED, rel=1e-6) + assert result.units == "dimensionless" + assert result.provenance is not None + assert len(result.provenance) == 1 + assert "formula 'annuity_factor'" in result.provenance[0] + + def test_backward_lifetime(self) -> None: + """Test that annuity_factor can be solved backward for lifetime using the numeric fallback.""" + # Solving for lifetime requires log(); pint falls back to magnitudes. + af = equation_registry.calculate("annuity_factor", self._PARAMS) + params = { + "annuity_factor": af, + "wacc": self._PARAMS["wacc"], + } + result = equation_registry.calculate("lifetime", params) + assert result.magnitude == pytest.approx(20.0, rel=1e-4) + + def test_backward_wacc_no_analytical_solution(self) -> None: + """Test that solving annuity_factor backward for wacc raises NotImplementedError since no closed-form solution exists.""" + # WACC appears in a transcendental position (both linearly and as an + # exponent base), so SymPy cannot find a closed-form solution and does not support + # this type of equation + af = equation_registry.calculate("annuity_factor", self._PARAMS) + params = { + "annuity_factor": af, + "lifetime": self._PARAMS["lifetime"], + } + with pytest.raises(NotImplementedError): + equation_registry.calculate("wacc", params, equation_name="annuity_factor") + + def test_eac_via_annuity_factor_matches_direct_formula(self) -> None: + """Test that computing eac via the annuity_factor formula matches the direct eac_annuity formula.""" + af = equation_registry.calculate("annuity_factor", self._PARAMS) + params = { + "specific_investment": Parameter(magnitude=1000.0, units="USD_2020/kW"), + "annuity_factor": af, + } + eac_via_af = equation_registry.calculate( + "eac", params, equation_name="eac_via_annuity_factor" + ) + assert eac_via_af.magnitude == pytest.approx(_EAC_ANNUITY_EXPECTED, rel=1e-6) + + +# --------------------------------------------------------------------------- +# Total investment cost +# --------------------------------------------------------------------------- + + +class TestTotalInvestment: + """Test suite for the total_investment_cost formula (forward and backward).""" + + _SIC = Parameter(magnitude=800.0, units="USD_2020/kW") + _CAP = Parameter(magnitude=100.0, units="kW") + _TOTAL_EXPECTED = 80_000.0 + + def test_forward_total(self) -> None: + """Test that total_investment_cost computes the expected forward value from specific investment and capacity.""" + params = {"specific_investment": self._SIC, "capacity": self._CAP} + result = equation_registry.calculate("total_investment_cost", params) + assert result.magnitude == pytest.approx(self._TOTAL_EXPECTED) + # sic [USD/kW] * capacity [kW] β†’ pint cancels kW, gives currency only + assert result.units == "USD_2020" + + def test_backward_specific_investment(self) -> None: + """Test that total_investment_cost can be solved backward for specific_investment given total cost and capacity.""" + params = { + "total_investment_cost": Parameter( + magnitude=self._TOTAL_EXPECTED, units="USD_2020" + ), + "capacity": self._CAP, + } + result = equation_registry.calculate("specific_investment", params) + assert result.magnitude == pytest.approx(800.0) + assert result.units is not None + assert "USD_2020" in result.units + + def test_backward_capacity(self) -> None: + """Test that total_investment_cost can be solved backward for capacity given total cost and specific investment.""" + params = { + "total_investment_cost": Parameter( + magnitude=self._TOTAL_EXPECTED, units="USD_2020" + ), + "specific_investment": self._SIC, + } + result = equation_registry.calculate("capacity", params) + assert result.magnitude == pytest.approx(100.0) + assert result.units is not None + assert "kilowatt" in result.units + + +# --------------------------------------------------------------------------- +# Fixed O&M cost +# --------------------------------------------------------------------------- + + +class TestFixedOm: + """Test suite for the fixed_om formula (forward and backward).""" + + _SIC = Parameter(magnitude=1000.0, units="USD_2020/kW") + _FRACTION = Parameter(magnitude=0.03, units="dimensionless") + _FOM_EXPECTED = 30.0 + + def test_forward_fixed_om(self) -> None: + """Test that fixed_om computes the expected forward value from specific investment and fixed O&M fraction.""" + params = { + "specific_investment": self._SIC, + "fixed_om_fraction": self._FRACTION, + } + result = equation_registry.calculate("fixed_om", params) + assert result.magnitude == pytest.approx(self._FOM_EXPECTED) + assert result.units is not None + assert "USD_2020" in result.units + + def test_backward_fraction(self) -> None: + """Test that fixed_om can be solved backward for fixed_om_fraction given fixed_om and specific investment.""" + params = { + "fixed_om": Parameter( + magnitude=self._FOM_EXPECTED, units="USD_2020/kW/year" + ), + "specific_investment": self._SIC, + } + result = equation_registry.calculate("fixed_om_fraction", params) + assert result.magnitude == pytest.approx(0.03) + + def test_backward_specific_investment(self) -> None: + """Test that fixed_om can be solved backward for specific_investment given fixed_om and fixed_om_fraction.""" + params = { + "fixed_om": Parameter( + magnitude=self._FOM_EXPECTED, units="USD_2020/kW/year" + ), + "fixed_om_fraction": self._FRACTION, + } + result = equation_registry.calculate("specific_investment", params) + assert result.magnitude == pytest.approx(1000.0) + + +# --------------------------------------------------------------------------- +# Round-trip efficiency +# --------------------------------------------------------------------------- + + +class TestRoundtripEfficiency: + """Test suite for the roundtrip_efficiency formula (forward and backward).""" + + _CE = Parameter(magnitude=0.95, units="dimensionless") + _DE = Parameter(magnitude=0.90, units="dimensionless") + _RT_EXPECTED = 0.855 + + def test_forward_roundtrip(self) -> None: + """Test that roundtrip_efficiency computes the expected forward value from charge and discharge efficiency.""" + params = {"charge_efficiency": self._CE, "discharge_efficiency": self._DE} + result = equation_registry.calculate("roundtrip_efficiency", params) + assert result.magnitude == pytest.approx(self._RT_EXPECTED) + assert result.units == "dimensionless" + + def test_backward_charge_efficiency(self) -> None: + """Test that roundtrip_efficiency can be solved backward for charge_efficiency given roundtrip and discharge efficiency.""" + params = { + "roundtrip_efficiency": Parameter( + magnitude=self._RT_EXPECTED, units="dimensionless" + ), + "discharge_efficiency": self._DE, + } + result = equation_registry.calculate("charge_efficiency", params) + assert result.magnitude == pytest.approx(0.95, rel=1e-4) + + def test_backward_discharge_efficiency(self) -> None: + """Test that roundtrip_efficiency can be solved backward for discharge_efficiency given roundtrip and charge efficiency.""" + params = { + "roundtrip_efficiency": Parameter( + magnitude=self._RT_EXPECTED, units="dimensionless" + ), + "charge_efficiency": self._CE, + } + result = equation_registry.calculate("discharge_efficiency", params) + assert result.magnitude == pytest.approx(0.90, rel=1e-4) + + +# --------------------------------------------------------------------------- +# Fuel variable cost +# --------------------------------------------------------------------------- + + +class TestFuelVariableCost: + """Test suite for the fuel_variable_cost formula (forward and backward).""" + + _FUEL_COST = Parameter(magnitude=50.0, units="USD_2020/MWh") + _EFF = Parameter(magnitude=0.5, units="dimensionless") + _FVC_EXPECTED = 100.0 + + def test_forward_fuel_variable_cost(self) -> None: + """Test that fuel_variable_cost computes the expected forward value from fuel cost and efficiency.""" + params = {"fuel_cost": self._FUEL_COST, "efficiency": self._EFF} + result = equation_registry.calculate("fuel_variable_cost", params) + assert result.magnitude == pytest.approx(self._FVC_EXPECTED) + assert result.units is not None + assert "USD_2020" in result.units + + def test_backward_efficiency(self) -> None: + """Test that fuel_variable_cost can be solved backward for efficiency given fuel_variable_cost and fuel_cost.""" + params = { + "fuel_variable_cost": Parameter( + magnitude=self._FVC_EXPECTED, units="USD_2020/MWh" + ), + "fuel_cost": self._FUEL_COST, + } + result = equation_registry.calculate("efficiency", params) + assert result.magnitude == pytest.approx(0.5) + assert result.units == "dimensionless" + + def test_backward_fuel_cost(self) -> None: + """Test that fuel_variable_cost can be solved backward for fuel_cost given fuel_variable_cost and efficiency.""" + params = { + "fuel_variable_cost": Parameter( + magnitude=self._FVC_EXPECTED, units="USD_2020/MWh" + ), + "efficiency": self._EFF, + } + result = equation_registry.calculate("fuel_cost", params) + assert result.magnitude == pytest.approx(50.0) + assert result.units is not None + assert "USD_2020" in result.units + + +# --------------------------------------------------------------------------- +# COβ‚‚ cost +# --------------------------------------------------------------------------- + + +class TestCo2Cost: + """Test suite for the co2_cost formula (forward and backward).""" + + _CO2_PRICE = Parameter(magnitude=80.0, units="USD_2020/t") + _CO2_INTENSITY = Parameter(magnitude=0.3, units="t/MWh") + _CO2_COST_EXPECTED = 24.0 + + def test_forward_co2_cost(self) -> None: + """Test that co2_cost computes the expected forward value from co2 price and intensity.""" + params = {"co2_price": self._CO2_PRICE, "co2_intensity": self._CO2_INTENSITY} + result = equation_registry.calculate("co2_cost", params) + assert result.magnitude == pytest.approx(self._CO2_COST_EXPECTED) + assert result.units is not None + assert "USD_2020" in result.units + + def test_backward_co2_price(self) -> None: + """Test that co2_cost can be solved backward for co2_price given co2_cost and co2_intensity.""" + params = { + "co2_cost": Parameter( + magnitude=self._CO2_COST_EXPECTED, units="USD_2020/MWh" + ), + "co2_intensity": self._CO2_INTENSITY, + } + result = equation_registry.calculate("co2_price", params) + assert result.magnitude == pytest.approx(80.0) + assert result.units is not None + assert "USD_2020" in result.units + + def test_backward_co2_intensity(self) -> None: + """Test that co2_cost can be solved backward for co2_intensity given co2_cost and co2_price.""" + params = { + "co2_cost": Parameter( + magnitude=self._CO2_COST_EXPECTED, units="USD_2020/MWh" + ), + "co2_price": self._CO2_PRICE, + } + result = equation_registry.calculate("co2_intensity", params) + assert result.magnitude == pytest.approx(0.3) + + +# --------------------------------------------------------------------------- +# Formula selection +# --------------------------------------------------------------------------- + + +class TestFormulaSelection: + """Test suite for equation/formula selection logic in EquationRegistry.calculate.""" + + def test_default_formula_chosen_when_not_specified(self) -> None: + """Test that the default (highest-priority) formula is chosen when no equation name is specified.""" + result = equation_registry.calculate("eac", EAC_ANNUITY_PARAMS) + assert result.provenance is not None + assert "formula 'eac_annuity'" in result.provenance[0] + + def test_explicit_equation_name_overrides_default(self) -> None: + """Test that an explicitly named equation overrides the default formula selection.""" + result = equation_registry.calculate( + "eac", EAC_SIMPLE_PARAMS, equation_name="eac_simple" + ) + assert result.provenance is not None + assert "formula 'eac_simple'" in result.provenance[0] + + def test_fallback_to_applicable_when_default_cannot_apply(self) -> None: + """Test that calculate falls back to an applicable formula when the default formula's inputs are unavailable.""" + # Only total_investment_cost + lifetime available: + # eac_annuity is default but requires sic/wacc/lifetime β€” cannot apply. + # eac_simple can apply. + result = equation_registry.calculate("eac", EAC_SIMPLE_PARAMS) + assert result.provenance is not None + assert "formula 'eac_simple'" in result.provenance[0] + + def test_unknown_equation_name_raises(self) -> None: + """Test that calculate raises KeyError when given an unknown equation name.""" + with pytest.raises(KeyError, match="No equation named"): + equation_registry.calculate( + "eac", EAC_ANNUITY_PARAMS, equation_name="bogus" + ) + + def test_named_formula_with_missing_params_raises(self) -> None: + """Test that calculate raises ValueError when a named formula is missing required parameters.""" + with pytest.raises(ValueError, match="missing parameters"): + equation_registry.calculate( + "eac", + {"lifetime": Parameter(magnitude=20.0, units="year")}, + equation_name="eac_annuity", + ) + + def test_no_applicable_formula_raises_with_diagnosis(self) -> None: + """Test that calculate raises ValueError with a diagnostic message when no formula is applicable.""" + with pytest.raises(ValueError, match="No equation for"): + equation_registry.calculate( + "eac", + {"lifetime": Parameter(magnitude=20.0, units="year")}, + ) + + def test_unknown_target_raises(self) -> None: + """Test that calculate raises ValueError when the target parameter is not registered.""" + with pytest.raises(ValueError, match="No equation registered"): + equation_registry.calculate("does_not_exist", EAC_ANNUITY_PARAMS) + + +# --------------------------------------------------------------------------- +# can_calculate +# --------------------------------------------------------------------------- + + +class TestCanCalculate: + """Test suite for EquationRegistry.can_calculate.""" + + def test_returns_true_when_applicable(self) -> None: + """Test that can_calculate returns True when the target is computable from the given parameters.""" + assert equation_registry.can_calculate("eac", EAC_ANNUITY_PARAMS) is True + + def test_returns_false_when_inputs_missing(self) -> None: + """Test that can_calculate returns False when required input parameters are missing.""" + assert ( + equation_registry.can_calculate( + "eac", {"lifetime": Parameter(magnitude=20.0, units="year")} + ) + is False + ) + + def test_returns_false_for_unknown_target(self) -> None: + """Test that can_calculate returns False for a target that has no registered equations.""" + assert ( + equation_registry.can_calculate("unknown_param", EAC_ANNUITY_PARAMS) + is False + ) + + +# --------------------------------------------------------------------------- +# Custom registry (isolated from built-in) +# --------------------------------------------------------------------------- + + +class TestCustomRegistry: + """Verify users can create an independent registry and register their own formulas.""" + + def test_custom_formula_forward(self) -> None: + """Test that a custom registry can compute a user-registered formula in the forward direction.""" + reg = EquationRegistry() + reg.register( + name="ohms_law", + parameters=["voltage", "current", "resistance"], + eq_str="voltage - current * resistance", + ) + params = { + "current": Parameter(magnitude=2.0, units="ampere"), + "resistance": Parameter(magnitude=5.0, units="ohm"), + } + result = reg.calculate("voltage", params) + assert result.magnitude == pytest.approx(10.0) + # pint returns "ampere * ohm" (correct but not simplified to "volt") + assert result.units is not None + + def test_custom_formula_backward(self) -> None: + """Test that a custom registry can solve a user-registered formula in the backward direction.""" + reg = EquationRegistry() + reg.register( + name="ohms_law", + parameters=["voltage", "current", "resistance"], + eq_str="voltage - current * resistance", + ) + params = { + "voltage": Parameter(magnitude=10.0, units="volt"), + "resistance": Parameter(magnitude=5.0, units="ohm"), + } + result = reg.calculate("current", params) + assert result.magnitude == pytest.approx(2.0) + + def test_custom_registry_isolated_from_builtin(self) -> None: + """Test that a custom EquationRegistry does not have access to the built-in equations.""" + reg = EquationRegistry() + assert not reg.can_calculate("eac", EAC_ANNUITY_PARAMS) + + def test_parameter_names_with_spaces(self) -> None: + """Parameter names containing spaces must work end-to-end.""" + reg = EquationRegistry() + reg.register( + name="simple_product", + parameters=["unit cost", "quantity", "total cost"], + eq_str="total cost - unit cost * quantity", + ) + params = { + "unit cost": Parameter(magnitude=800.0, units="USD_2020/kW"), + "quantity": Parameter(magnitude=100.0, units="kW"), + } + result = reg.calculate("total cost", params) + assert result.magnitude == pytest.approx(80_000.0) + # pint: USD_2020/kW * kW = USD_2020 + assert result.units == "USD_2020" + + # Backward direction: derive quantity from total cost and unit cost + params_back = { + "unit cost": Parameter(magnitude=800.0, units="USD_2020/kW"), + "total cost": Parameter(magnitude=80_000.0, units="USD_2020"), + } + qty = reg.calculate("quantity", params_back) + assert qty.magnitude == pytest.approx(100.0) + assert qty.units is not None + assert "kilowatt" in qty.units + + +# --------------------------------------------------------------------------- +# list_equations +# --------------------------------------------------------------------------- + + +class TestListEquations: + """Test suite for EquationRegistry.list_equations and duplicate registration handling.""" + + def test_list_equations_empty_registry(self) -> None: + """Test that list_equations returns an empty list for a registry with no equations.""" + reg = EquationRegistry() + assert reg.list_equations() == [] + + def test_list_equations_sorted_case_insensitive(self) -> None: + """Test that list_equations returns entries sorted by name case-insensitively.""" + reg = EquationRegistry() + reg.register("beta", ["x", "y"], "x - y") + reg.register("Alpha", ["a", "b"], "a - b", priority=2) + reg.register("gamma", ["g", "h"], "g - h") + + listed = reg.list_equations() + + assert [entry["name"] for entry in listed] == ["Alpha", "beta", "gamma"] + assert listed[0] == { + "name": "Alpha", + "parameters": ["a", "b"], + "eq_str": "a - b", + "priority": 2, + "description": None, + } + + def test_list_equations_for_target(self) -> None: + """Test that list_equations filters and orders equations applicable to a given target by priority.""" + reg = EquationRegistry() + reg.register("z_from_xy", ["z", "x", "y"], "z - x - y") + reg.register("z_from_k", ["z", "k"], "z - k", priority=2) + reg.register("other", ["q", "r"], "q - r") + + listed = reg.list_equations(target="z") + + assert [entry["name"] for entry in listed] == ["z_from_k", "z_from_xy"] + + def test_list_equations_unknown_target_raises(self) -> None: + """Test that list_equations raises ValueError for an unknown target.""" + reg = EquationRegistry() + reg.register("z_from_xy", ["z", "x", "y"], "z - x - y") + + with pytest.raises(ValueError, match="No equation registered"): + reg.list_equations(target="missing_target") + + def test_register_duplicate_equation_name_raises(self) -> None: + """Test that registering a duplicate equation name with a different definition raises ValueError.""" + reg = EquationRegistry() + reg.register("dup_name", ["a", "b"], "a - b") + + with pytest.raises(ValueError, match="different definition"): + reg.register("dup_name", ["x", "y"], "x - y") + + +class TestEquationYamlLoading: + """Test suite for loading equations from YAML files into an EquationRegistry.""" + + def test_load_from_yaml_single_file(self, tmp_path: pathlib.Path) -> None: + """Test that load_from_yaml loads a single equation definition from a YAML file.""" + yaml_file = tmp_path / "equations.yaml" + yaml_file.write_text( + "\n".join( + [ + "- name: test_sum", + " parameters: [z, x, y]", + " eq_str: z - x - y", + " priority: 3", + ] + ), + encoding="utf-8", + ) + + reg = EquationRegistry() + reg.load_from_yaml(yaml_file) + + listed = reg.list_equations() + assert len(listed) == 1 + assert listed[0]["name"] == "test_sum" + assert listed[0]["priority"] == 3 + assert listed[0]["description"] is None + + def test_load_from_yaml_multiple_files(self, tmp_path: pathlib.Path) -> None: + """Test that load_from_yaml loads equation definitions from multiple YAML files.""" + file_a = tmp_path / "a.yaml" + file_b = tmp_path / "b.yaml" + file_a.write_text( + """ +- name: eq_a + parameters: [a, b] + eq_str: a - b +""".strip(), + encoding="utf-8", + ) + file_b.write_text( + """ +- name: eq_b + parameters: [x, y] + eq_str: x - y +""".strip(), + encoding="utf-8", + ) + + reg = EquationRegistry() + reg.load_from_yaml([file_a, file_b]) + + assert [item["name"] for item in reg.list_equations()] == ["eq_a", "eq_b"] + + def test_load_from_yaml_conflicting_name_raises( + self, tmp_path: pathlib.Path + ) -> None: + """Test that load_from_yaml raises ValueError when two files define the same equation name differently.""" + file_a = tmp_path / "a.yaml" + file_b = tmp_path / "b.yaml" + file_a.write_text( + """ +- name: same + parameters: [a, b] + eq_str: a - b +""".strip(), + encoding="utf-8", + ) + file_b.write_text( + """ +- name: same + parameters: [x, y] + eq_str: x - y +""".strip(), + encoding="utf-8", + ) + + reg = EquationRegistry() + reg.load_from_yaml(file_a) + + with pytest.raises(ValueError, match="different definition"): + reg.load_from_yaml(file_b) + + def test_load_from_yaml_overwrite_replaces(self, tmp_path: pathlib.Path) -> None: + """Test that load_from_yaml with overwrite=True replaces an existing equation definition.""" + file_a = tmp_path / "a.yaml" + file_b = tmp_path / "b.yaml" + file_a.write_text( + """ +- name: same + parameters: [a, b] + eq_str: a - b +""".strip(), + encoding="utf-8", + ) + file_b.write_text( + "\n".join( + [ + "- name: same", + " parameters: [z, x, y]", + " eq_str: z - x - y", + " priority: 4", + ] + ), + encoding="utf-8", + ) + + reg = EquationRegistry() + reg.load_from_yaml(file_a) + reg.load_from_yaml(file_b, overwrite=True) + + listed = reg.list_equations() + assert len(listed) == 1 + assert listed[0]["name"] == "same" + assert listed[0]["parameters"] == ["z", "x", "y"] + assert listed[0]["priority"] == 4 + + def test_from_yaml_factory(self, tmp_path: pathlib.Path) -> None: + """Test that EquationRegistry.from_yaml creates a registry populated from a YAML file.""" + yaml_file = tmp_path / "factory.yaml" + yaml_file.write_text( + """ +- name: factory_eq + parameters: [a, b] + eq_str: a - b +""".strip(), + encoding="utf-8", + ) + + reg = EquationRegistry.from_yaml(yaml_file) + assert [entry["name"] for entry in reg.list_equations()] == ["factory_eq"] + + def test_register_with_description(self) -> None: + """Test that register stores and exposes an equation's description.""" + reg = EquationRegistry() + reg.register( + name="described_eq", + parameters=["a", "b"], + eq_str="a - b", + description="Arbitrary context", + ) + + listed = reg.list_equations() + assert listed[0]["name"] == "described_eq" + assert listed[0]["description"] == "Arbitrary context" + + def test_load_from_yaml_description(self, tmp_path: pathlib.Path) -> None: + """Test that load_from_yaml preserves an equation's description field.""" + yaml_file = tmp_path / "described.yaml" + yaml_file.write_text( + "\n".join( + [ + "- name: with_description", + " parameters: [a, b]", + " eq_str: a - b", + " description: free-text details", + ] + ), + encoding="utf-8", + ) + + reg = EquationRegistry.from_yaml(yaml_file) + listed = reg.list_equations() + assert listed[0]["name"] == "with_description" + assert listed[0]["description"] == "free-text details" + + +# --------------------------------------------------------------------------- +# Technology.calculate_parameters integration +# --------------------------------------------------------------------------- + + +class TestTechnologyCalculateParameters: + """Test suite for Technology.calculate_parameters.""" + + def _tech(self, **extra: Parameter) -> Technology: + params = {**EAC_ANNUITY_PARAMS, **extra} + return Technology( + name="electrolyzer", + detailed_technology="PEM", + case="base", + region="DEU", + year=2030, + parameters=params, + ) + + def test_explicit_target_calculated(self) -> None: + """Test that calculate_parameters computes an explicitly requested target.""" + result = self._tech().calculate_parameters(targets=["eac"]) + assert "eac" in result.parameters + assert result.parameters["eac"].magnitude == pytest.approx( + _EAC_ANNUITY_EXPECTED, rel=1e-6 + ) + + def test_returns_new_instance_original_unchanged(self) -> None: + """Test that calculate_parameters returns a new Technology instance and leaves the original unchanged.""" + tech = self._tech() + _ = tech.calculate_parameters(targets=["eac"]) + assert "eac" not in tech.parameters + + def test_auto_discovery_derives_all_possible_params(self) -> None: + """Test that calculate_parameters auto-discovers and derives all possible parameters when no targets are given.""" + result = self._tech().calculate_parameters() + assert "eac" in result.parameters + + def test_already_present_params_not_overwritten(self) -> None: + """Test that calculate_parameters does not overwrite a parameter that is already present.""" + sentinel = Parameter(magnitude=999.0, units="USD_2020/kW/year") + result = self._tech(eac=sentinel).calculate_parameters() + assert result.parameters["eac"].magnitude == pytest.approx(999.0) + + def test_equation_names_dict_selects_formula(self) -> None: + """Test that calculate_parameters uses the equation_names mapping to select a specific formula.""" + tech = Technology( + name="electrolyzer", + detailed_technology="PEM", + case="base", + region="DEU", + year=2030, + parameters=EAC_SIMPLE_PARAMS, + ) + result = tech.calculate_parameters( + targets=["eac"], equation_names={"eac": "eac_simple"} + ) + assert result.parameters["eac"].magnitude == pytest.approx( + _EAC_SIMPLE_EXPECTED, rel=1e-6 + ) + + def test_unrelated_currency_mismatch_is_ignored(self) -> None: + """Test that calculate_parameters ignores a currency-year mismatch on a parameter not required by the selected equation.""" + params = { + "specific_investment": Parameter(magnitude=1000.0, units="USD_2020/kW"), + "wacc": Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": Parameter(magnitude=20.0, units="year"), + # Different currency year on a parameter that is not required by + # the selected equation and should therefore be ignored. + "total_investment_cost": Parameter(magnitude=2000.0, units="USD_2022/kW"), + } + tech = Technology( + name="electrolyzer", + detailed_technology="PEM", + case="base", + region="DEU", + year=2030, + parameters=params, + ) + result = tech.calculate_parameters( + targets=["eac"], equation_names={"eac": "eac_annuity"} + ) + assert result.parameters["eac"].magnitude == pytest.approx( + _EAC_ANNUITY_EXPECTED, rel=1e-6 + ) + + def test_chained_calculation(self) -> None: + """Derive annuity_factor first, then eac β€” both in a single call.""" + result = self._tech().calculate_parameters() + assert result.parameters["eac"].magnitude == pytest.approx( + _EAC_ANNUITY_EXPECTED, rel=1e-4 + ) diff --git a/test/test_parameter.py b/test/test_parameter.py index 65726536..36409fa9 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -28,7 +28,7 @@ def test_parameter_creation(self) -> None: units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="literature", + provenance=["literature"], note="Estimated", sources=technologydata.SourceCollection( sources=[ @@ -41,7 +41,7 @@ def test_parameter_creation(self) -> None: ) assert param.magnitude == 1000 assert param.units == "USD_2020 / kilowatt" - assert param.provenance == "literature" + assert param.provenance == ["literature"] assert param.note == "Estimated" assert param.sources is not None @@ -154,7 +154,7 @@ def test_pint_attributes_update(self) -> None: units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="literature", + provenance=["literature"], note="Estimated", ) # Change magnitude and units @@ -310,7 +310,7 @@ def test_parameter_unchanged_other_attributes(self) -> None: units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="literature", + provenance=["literature"], note="Estimated", ) @@ -398,6 +398,33 @@ def test_parameter_carrier_compatibility(self) -> None: param_h2 / param_ch4 ).carrier == param_h2._pint_carrier / param_ch4._pint_carrier + def test_parameter_currency_compatibility(self) -> None: + """Test that arithmetic is permitted for matching currencies and years.""" + param_kw = technologydata.Parameter(magnitude=1, units="USD_2020/kW") + param_mw = technologydata.Parameter(magnitude=1000, units="USD_2020/MW") + + # Both operands are equal after unit conversion and use the same currency-year. + added = param_kw + param_mw + subtracted = param_kw - param_mw + + assert isinstance(added, technologydata.Parameter) + assert isinstance(subtracted, technologydata.Parameter) + assert added.units == "USD_2020 / kilowatt" + assert added.magnitude == pytest.approx(2) + assert subtracted.units == "USD_2020 / kilowatt" + assert subtracted.magnitude == pytest.approx(0) + + def test_parameter_currency_incompatibility(self) -> None: + """Test that arithmetic is blocked for different currency years.""" + param_2020 = technologydata.Parameter(magnitude=1, units="USD_2020/kW") + param_2021 = technologydata.Parameter(magnitude=1, units="USD_2021/kW") + + with pytest.raises(ValueError, match="different currencies or currency years"): + param_2020 + param_2021 + + with pytest.raises(ValueError, match="different currencies or currency years"): + param_2020 - param_2021 + def test_parameter_equality(self) -> None: """Test equality comparison of Parameter objects.""" # Create two identical parameters @@ -406,7 +433,7 @@ def test_parameter_equality(self) -> None: units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="literature", + provenance=["literature"], note="Estimated", sources=technologydata.SourceCollection( sources=[ @@ -422,7 +449,7 @@ def test_parameter_equality(self) -> None: units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="literature", + provenance=["literature"], note="Estimated", sources=technologydata.SourceCollection( sources=[ @@ -476,8 +503,10 @@ def test_parameter_equality_different_heating_value(self) -> None: def test_parameter_equality_different_provenance(self) -> None: """Test that parameters with different provenance are not equal.""" - param1 = technologydata.Parameter(magnitude=1000, provenance="literature") - param2 = technologydata.Parameter(magnitude=1000, provenance="expert_estimate") + param1 = technologydata.Parameter(magnitude=1000, provenance=["literature"]) + param2 = technologydata.Parameter( + magnitude=1000, provenance=["expert_estimate"] + ) assert param1 != param2 assert param2 != param1 @@ -544,12 +573,43 @@ def test_parameter_equality_self_reference(self) -> None: units="USD_2020/kW", carrier="H2", heating_value="LHV", - provenance="literature", + provenance=["literature"], note="Estimated", ) assert param == param + def test_is_consistent_with_true_after_unit_conversion(self) -> None: + """Parameters can be consistent even when units differ but are convertible.""" + observed = technologydata.Parameter(magnitude=1000.0, units="USD_2020/kW") + expected = technologydata.Parameter(magnitude=1.0, units="USD_2020/W") + + assert observed.isclose(expected) + + def test_is_consistent_with_false_for_carrier_mismatch(self) -> None: + """Carrier mismatch makes parameters inconsistent.""" + observed = technologydata.Parameter(magnitude=1.0, units="kWh", carrier="H2") + expected = technologydata.Parameter(magnitude=1.0, units="kWh", carrier="el") + + assert not observed.isclose(expected) + + def test_is_consistent_with_false_for_heating_value_mismatch(self) -> None: + """Heating value mismatch makes parameters inconsistent.""" + observed = technologydata.Parameter( + magnitude=1.0, + units="kWh", + carrier="H2", + heating_value="LHV", + ) + expected = technologydata.Parameter( + magnitude=1.0, + units="kWh", + carrier="H2", + heating_value="HHV", + ) + + assert not observed.isclose(expected) + @pytest.mark.parametrize( "example_parameter", [ @@ -558,7 +618,7 @@ def test_parameter_equality_self_reference(self) -> None: "parameter_units": "USD_2020/kW", "parameter_carrier": "H2", "parameter_heating_value": "LHV", - "parameter_provenance": "literature", + "parameter_provenance": ["literature"], "parameter_note": "Estimated", "parameter_sources": [ technologydata.Source(title="title", authors="authors") @@ -657,7 +717,7 @@ def test_parameter_pow_preserves_metadata(self) -> None: units="kg", carrier="H2", heating_value="LHV", - provenance="test", + provenance=["test"], note="note", ) result = param**2 diff --git a/test/test_technology.py b/test/test_technology.py index c85b823f..bf0b0220 100644 --- a/test/test_technology.py +++ b/test/test_technology.py @@ -6,7 +6,10 @@ import pathlib +import pytest + import technologydata +from technologydata.equations import EquationRegistry path_cwd = pathlib.Path.cwd() @@ -26,13 +29,13 @@ def test_technology_creation(self) -> None: "investment": technologydata.Parameter( magnitude=500, units="EUR_2022/kW", - provenance="Industry report", + provenance=["Industry report"], note="Average overnight cost", ), "lifetime": technologydata.Parameter( magnitude=25, units="years", - provenance="Literature", + provenance=["Literature"], ), }, ) @@ -57,18 +60,18 @@ def test_technology_to_currency(self) -> None: "investment": technologydata.Parameter( magnitude=500, units="EUR_2022/kW", - provenance="Industry report", + provenance=["Industry report"], note="Average overnight cost", ), "fixed_om": technologydata.Parameter( magnitude=10, units="EUR_2022/kW/year", - provenance="Literature", + provenance=["Literature"], ), "lifetime": technologydata.Parameter( magnitude=25, units="years", - provenance="Literature", + provenance=["Literature"], ), }, ) @@ -124,7 +127,7 @@ def test_technology_to_currency_with_overwrite_country(self) -> None: "investment": technologydata.Parameter( magnitude=1200, units="EUR_2020/kW", - provenance="Industry data", + provenance=["Industry data"], ), }, ) @@ -178,7 +181,7 @@ def test_technology_to_currency_preserves_other_attributes(self) -> None: magnitude=500, units="EUR_2022/kW", carrier="electricity", - provenance="Industry report", + provenance=["Industry report"], note="Average overnight cost", sources=technologydata.SourceCollection( sources=[ @@ -269,3 +272,225 @@ def test_technology_to_currency_mixed_currencies(self) -> None: converted.parameters["capacity"].magnitude == tech.parameters["capacity"].magnitude ) + + def test_check_consistency_returns_status_per_equation(self) -> None: + """Return per-equation statuses for the selected parameter set.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "specific_investment": technologydata.Parameter( + magnitude=1000, + units="EUR_2020/kW", + ), + "annuity_factor": technologydata.Parameter( + magnitude=0.1, + units="dimensionless", + ), + "eac": technologydata.Parameter( + magnitude=100, + units="EUR_2020/kW", + ), + }, + ) + + status = tech.check_consistency(parameters=["eac"]) + assert status["eac_via_annuity_factor"] is True + assert status["eac_annuity"] == "missing parameters: ['wacc', 'lifetime']" + # None of eac_simple's supporting parameters (total_investment_cost, + # lifetime) are present, so it is inapplicable rather than merely + # missing some parameters. + assert ( + status["eac_simple"] + == "inapplicable: ['total_investment_cost', 'lifetime']" + ) + + def test_check_consistency_marks_equation_violation_false(self) -> None: + """Mark an equation as False when all inputs are present but values disagree.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "specific_investment": technologydata.Parameter( + magnitude=1000, + units="EUR_2020/kW", + ), + "annuity_factor": technologydata.Parameter( + magnitude=0.1, + units="dimensionless", + ), + "eac": technologydata.Parameter( + magnitude=120, + units="EUR_2020/kW", + ), + }, + ) + + status = tech.check_consistency(parameters=["eac"]) + assert status["eac_via_annuity_factor"] is False + + def test_check_consistency_marks_inapplicable_when_all_missing(self) -> None: + """Mark an equation as inapplicable when none of its parameters are present.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "capacity": technologydata.Parameter(magnitude=10, units="MW"), + }, + ) + + status = tech.check_consistency(parameters=["eac"]) + assert ( + status["eac_via_annuity_factor"] + == "inapplicable: ['eac', 'specific_investment', 'annuity_factor']" + ) + assert ( + status["eac_annuity"] + == "inapplicable: ['eac', 'specific_investment', 'wacc', 'lifetime']" + ) + assert ( + status["eac_simple"] + == "inapplicable: ['eac', 'total_investment_cost', 'lifetime']" + ) + + def test_check_consistency_marks_inapplicable_with_default_parameters(self) -> None: + """ + Mark an equation inapplicable even without an explicit `parameters` filter. + + A technology's own present parameters always include the equation's + target, so "inapplicable" only shows up if it is based on whether the + equation's *other* (supporting) parameters are present, not on the + target itself. + """ + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "eac": technologydata.Parameter(magnitude=100, units="EUR_2020/kW"), + }, + ) + + status = tech.check_consistency() + assert ( + status["eac_via_annuity_factor"] + == "inapplicable: ['specific_investment', 'annuity_factor']" + ) + + def test_check_consistency_raises_for_unknown_parameter(self) -> None: + """Raise a clear error when an explicitly requested parameter has no equation.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "capacity": technologydata.Parameter(magnitude=10, units="MW"), + }, + ) + + with pytest.raises(ValueError, match="No equation registered for parameter"): + tech.check_consistency(parameters=["not_a_real_parameter"]) + + def test_check_consistency_ignores_unselected_parameters(self) -> None: + """Ignore parameters outside the requested consistency-check subset.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "specific_investment": technologydata.Parameter( + magnitude=1000, + units="EUR_2020/kW", + ), + "annuity_factor": technologydata.Parameter( + magnitude=0.1, + units="dimensionless", + ), + "eac": technologydata.Parameter( + magnitude=100, + units="EUR_2020/kW", + ), + "fixed_om": technologydata.Parameter( + magnitude=200, + units="EUR_2020/kW", + ), + "fixed_om_fraction": technologydata.Parameter( + magnitude=0.02, + units="dimensionless", + ), + }, + ) + + status = tech.check_consistency(parameters=["eac"]) + assert "fixed_om_from_fraction" not in status + assert status["eac_via_annuity_factor"] is True + + def test_check_consistency_tolerance_is_applied(self) -> None: + """Allow small floating-point deviations within user-provided tolerance.""" + tech = technologydata.Technology( + name="Solar photovoltaics", + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "specific_investment": technologydata.Parameter( + magnitude=1000, + units="EUR_2020/kW", + ), + "annuity_factor": technologydata.Parameter( + magnitude=0.1, + units="dimensionless", + ), + "eac": technologydata.Parameter( + magnitude=100.000001, + units="EUR_2020/kW", + ), + }, + ) + + status = tech.check_consistency(parameters=["eac"], rtol=1e-5) + assert status["eac_via_annuity_factor"] is True + + def test_check_consistency_uses_custom_equation_registry(self) -> None: + """Allow consistency checks against a caller-provided equation registry.""" + custom_registry = EquationRegistry() + custom_registry.register( + name="z_sum", + parameters=["z", "x", "y"], + eq_str="z - x - y", + ) + + tech = technologydata.Technology( + name="Test", + detailed_technology="Custom", + case="example-scenario", + region="DEU", + year=2022, + parameters={ + "x": technologydata.Parameter(magnitude=2.0, units="dimensionless"), + "y": technologydata.Parameter(magnitude=3.0, units="dimensionless"), + "z": technologydata.Parameter(magnitude=5.0, units="dimensionless"), + }, + ) + + status = tech.check_consistency( + parameters=["z"], + equations=custom_registry, + ) + assert status == {"z_sum": True} diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index db1537fe..26941c46 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -391,3 +391,101 @@ def test_to_currency_preserves_technology_attributes(self) -> None: assert orig_tech.case == conv_tech.case assert orig_tech.region == conv_tech.region assert orig_tech.year == conv_tech.year + + @staticmethod + def _tech( + name: str, **params: technologydata.Parameter + ) -> technologydata.Technology: + return technologydata.Technology( + name=name, + detailed_technology="Si-HC", + case="example-scenario", + region="DEU", + year=2022, + parameters=params, + ) + + def test_calculate_parameters_explicit_target(self) -> None: + """Derive an explicit target for every technology in the collection.""" + eac_params = { + "specific_investment": technologydata.Parameter( + magnitude=1000.0, units="USD_2020/kW" + ), + "wacc": technologydata.Parameter(magnitude=0.07, units="dimensionless"), + "lifetime": technologydata.Parameter(magnitude=20.0, units="year"), + } + tc = technologydata.TechnologyCollection( + technologies=[self._tech("A", **eac_params), self._tech("B", **eac_params)] + ) + + result = tc.calculate_parameters("eac") + + assert isinstance(result, technologydata.TechnologyCollection) + assert result is not tc + # Original collection is untouched. + assert "eac" not in tc.technologies[0].parameters + for tech in result.technologies: + assert "eac" in tech.parameters + assert tech.parameters["eac"].magnitude == pytest.approx(94.39292574325566) + + def test_calculate_parameters_auto_discovery_per_technology(self) -> None: + """With no explicit targets, each technology derives what it individually can.""" + tc = technologydata.TechnologyCollection( + technologies=[ + self._tech( + "A", + specific_investment=technologydata.Parameter( + magnitude=1000.0, units="USD_2020/kW" + ), + wacc=technologydata.Parameter( + magnitude=0.07, units="dimensionless" + ), + lifetime=technologydata.Parameter(magnitude=20.0, units="year"), + ), + self._tech( + "B", + total_investment_cost=technologydata.Parameter( + magnitude=2000.0, units="USD_2020/kW" + ), + lifetime=technologydata.Parameter(magnitude=20.0, units="year"), + ), + ] + ) + + result = tc.calculate_parameters() + + assert "eac" in result.technologies[0].parameters + assert "eac" in result.technologies[1].parameters + assert result.technologies[1].parameters["eac"].magnitude == pytest.approx( + 100.0 + ) + + def test_check_consistency_returns_one_status_dict_per_technology(self) -> None: + """Return per-technology consistency statuses, aligned with `technologies`.""" + tc = technologydata.TechnologyCollection( + technologies=[ + self._tech( + "Consistent", + specific_investment=technologydata.Parameter( + magnitude=1000, units="EUR_2020/kW" + ), + annuity_factor=technologydata.Parameter( + magnitude=0.1, units="dimensionless" + ), + eac=technologydata.Parameter(magnitude=100, units="EUR_2020/kW"), + ), + self._tech( + "MissingInputs", + capacity=technologydata.Parameter(magnitude=10, units="MW"), + ), + ] + ) + + status = tc.check_consistency(parameters=["eac"]) + + assert len(status) == len(tc) == 2 + assert status[0]["eac_via_annuity_factor"] is True + assert ( + status[1]["eac_via_annuity_factor"] + == "inapplicable: ['eac', 'specific_investment', 'annuity_factor']" + ) diff --git a/uv.lock b/uv.lock index 5e0e26c0..74687877 100644 --- a/uv.lock +++ b/uv.lock @@ -2,75 +2,141 @@ version = 1 revision = 3 requires-python = ">=3.12" resolution-markers = [ - "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", - "python_full_version < '3.14' and platform_python_implementation != 'PyPy'", - "platform_python_implementation == 'PyPy'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, ] [[package]] name = "annotated-types" -version = "0.7.0" +version = "0.8.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, upload-time = "2024-05-20T21:33:25.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "ast-serialize" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/a9/11851c3e02a3fea2ddc9932d1fdc7d2edaeecc0d2e11bc5f2a7fde2b0934/ast_serialize-0.8.0.tar.gz", hash = "sha256:6c37c43e4004dfb42d321ddedc569dc17ff4259296f3af577c9ea46a809bc010", size = 845638, upload-time = "2026-08-07T11:29:02.152Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/16/6e520b57cd8c75914b38c670ad4593d13c22911e4306cc7165dab8b0789b/ast_serialize-0.8.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3d822605fa7bb326ef868d25fafced7fc660fa46d9b90c02ea86d5e2f5d325f7", size = 863924, upload-time = "2026-08-07T11:27:34.579Z" }, + { url = "https://files.pythonhosted.org/packages/03/e1/48802de9b22a2bcad42ec80601a17e3f69172fe4f590e6311bcc2b323aeb/ast_serialize-0.8.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:2efa40b068197d5efb62655b43baadb842ed71c4958cccd3e8b86a35726f0119", size = 1177662, upload-time = "2026-08-07T11:27:36.196Z" }, + { url = "https://files.pythonhosted.org/packages/38/d4/323438db76bded3a1f3523a3167b8325916b2ddceb2107a330c6ec9fcf4d/ast_serialize-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:db1b957291bca08c7e72f43a12357b2948e20775d970e3fc3dac0aa3160ab725", size = 1167072, upload-time = "2026-08-07T11:27:37.646Z" }, + { url = "https://files.pythonhosted.org/packages/77/82/53c5400b54144b56de8ed7f957fd1ccd97e42482009292ab46121d15f8dd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdc0d5b18ff8fb364e87923e47c0a91d0d69dbcaeaa274591f7fd26892cc3a3a", size = 1225497, upload-time = "2026-08-07T11:27:39.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/5f/36c07327a8b91303fbf1382c7c3e8a2902072dbe1b9546138a5288e75ff0/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9da7330f3e235bf7da89b8d39205c6350fc0c08a85379743f2df9fff87d6d980", size = 1227101, upload-time = "2026-08-07T11:27:40.799Z" }, + { url = "https://files.pythonhosted.org/packages/9d/48/5adf5c67addc7ddb328122208c6d375a84cf154984f412b4087330a157bd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3186969ee66a9863b00acc6523ace44c56974eecb348a7ea4b228d9f0b80e19", size = 1424001, upload-time = "2026-08-07T11:27:42.708Z" }, + { url = "https://files.pythonhosted.org/packages/38/a1/70074dd3869d2b0e934f91891d8d6b734361cd3b80f85ca7ece2e668ecdd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40a57b73731be45da4fa41430c4d5dc94a24b3a4faba7b9e069978c0402064ea", size = 1245545, upload-time = "2026-08-07T11:27:44.4Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/53b9c0a8a6399950c2e3546bdfab96d2b299d5b114b47eb94fd3c49c4054/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b9da3ef807eda752502446dfecea3b381c4900b7e27a5d5f4f899eb39951", size = 1248961, upload-time = "2026-08-07T11:27:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/eb/13/3651d3812548a2bda15e26e5dd51aadb48cf682d0865370255fcf0e367dd/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:293cc1c5bfa741f8e3fbe8175b9c07beee487c9a6fdbb25a5acad9f1df2d30a9", size = 1243877, upload-time = "2026-08-07T11:27:47.325Z" }, + { url = "https://files.pythonhosted.org/packages/21/a0/521f0bf000f675e9312a4aae2c8ba7a992405d072a85c485e08fd59433b9/ast_serialize-0.8.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0910c3442a75216dde0f102d854ba2aaa71d2482e0ee213630b9bf29584fba3", size = 1293903, upload-time = "2026-08-07T11:27:49.264Z" }, + { url = "https://files.pythonhosted.org/packages/b1/7e/402fc902568aa2ee65865a3e151f000db0153da8ce6b1be4c9c349025f8d/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43dd6d596879bb1cb8a12cc9dae7bb10090a39a35883026c24f82488a195619a", size = 1401070, upload-time = "2026-08-07T11:27:50.947Z" }, + { url = "https://files.pythonhosted.org/packages/ff/7c/97d4b66c057f1706fc8be6dd532cc77c988794357c8f4ffdb6adabb39562/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8c9d537f59e936392cfd3597789d1390304dd659efc3c486ce7f40fb6b8a9f53", size = 1502602, upload-time = "2026-08-07T11:27:52.364Z" }, + { url = "https://files.pythonhosted.org/packages/89/6f/72cc3b71562001bba46e898ccfbf1844f7939b3e28912736206102f2e5a8/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f0190a33d7f97c65e9069f7a7f40499eea6b5cbe260c558378109caf20ce934b", size = 1495848, upload-time = "2026-08-07T11:27:53.803Z" }, + { url = "https://files.pythonhosted.org/packages/a0/53/d6f629d1e49308b2f363dae028baa213ec222c9106fa1f7f0d1f7b41499a/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:77308ae6c5cf5264cc0f01a7c556ec77a9e68eb1f61b093534d698139fdc3b14", size = 1556556, upload-time = "2026-08-07T11:27:55.342Z" }, + { url = "https://files.pythonhosted.org/packages/ee/22/340f35dd8dfc6d412d53dc20699ca014b8d228db923e8ed4759c512b162c/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8d53a23f27e1ed3a36b2d26fd2a1a6228c8e85a1ed62ff7cdb44bd610769f20a", size = 1417822, upload-time = "2026-08-07T11:27:56.712Z" }, + { url = "https://files.pythonhosted.org/packages/11/29/6dde5c13fbebc051d3a6df4ec0a6fd1d5359333cc1193f7f609f3410b4d8/ast_serialize-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa5e7cb08f96fed9121f77b224151e41caf88feab9d652bb46c78202b6fbeda", size = 1445153, upload-time = "2026-08-07T11:27:58.275Z" }, + { url = "https://files.pythonhosted.org/packages/62/c5/f473a8ed030f7a0ca24b9849cca184677a50c053867a7b808c2e1289bbd3/ast_serialize-0.8.0-cp314-cp314t-win32.whl", hash = "sha256:fa70ed4dea0bb18b30a1789c77baa701d0ef30c474f2ccabdea61e25623a8827", size = 1063711, upload-time = "2026-08-07T11:27:59.793Z" }, + { url = "https://files.pythonhosted.org/packages/23/63/39e171fcd38ca057c2e1979d5ee81ac7a3502784abe3d83df7454f7a0978/ast_serialize-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d8b3c8eee4c1baef9d4e84d2a59a805501617127be42615cb48970b15b0892b6", size = 1103740, upload-time = "2026-08-07T11:28:01.405Z" }, + { url = "https://files.pythonhosted.org/packages/21/1c/d00762b399e7726d68d0a088cc946e3a4c60f1c6176f557608f672f627f3/ast_serialize-0.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:ac4f0a83c55a9b782f79ad55a5247b7db123c1db405959791c2ef886e9710c9f", size = 1076021, upload-time = "2026-08-07T11:28:02.947Z" }, + { url = "https://files.pythonhosted.org/packages/4c/11/911210c3c78923273a9211a2b6cfc4c8aa723b30dab3e1c8d19afb983b40/ast_serialize-0.8.0-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:86b8a1e6d90467345356098b040150e82fbc26d24a7a202224b13dc1f6264ca0", size = 1177715, upload-time = "2026-08-07T11:28:04.654Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/6282881c8587606638db153cbe21e1e0c4d1f3970dee1aa0610a1c62a026/ast_serialize-0.8.0-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:39e92ff8e8cb45947fe9007174b2950e1fb098e6abd00266a13cd3bcf6675068", size = 1169347, upload-time = "2026-08-07T11:28:06.1Z" }, + { url = "https://files.pythonhosted.org/packages/97/78/a9f846a03a340ff3728c915f23338ca742742f3292700559cdb3ad999b1e/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85d8d18db5b2dfcb3b7e38a4d600ca35504c0ed8a6f75cd1c811e4ffe248a15", size = 1225916, upload-time = "2026-08-07T11:28:07.654Z" }, + { url = "https://files.pythonhosted.org/packages/c0/15/aba6ef8a988a6eceb6f0359589aac509e29ae2dba67fd9bfd5af0c3f13e7/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9830ff7e764f74d9eefb01170c61a9f0fd2c027dac5fcb72e064decd57d56371", size = 1227135, upload-time = "2026-08-07T11:28:09.504Z" }, + { url = "https://files.pythonhosted.org/packages/94/29/3f63d696ea7c5b8abadcecc3505be51bd900daaccc522ed8322fa5b05a93/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6479d9722a4cd21b578f5478074c41e6169f04811996ec881655560f703a5bba", size = 1425040, upload-time = "2026-08-07T11:28:11.044Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5d/0aac338604ff59df5774d4304307898982252f325ff7cafe31d52fedcb65/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a63bed264e818cd83eec11feed0f50aa162542b91132ef58afebc857182763a5", size = 1246278, upload-time = "2026-08-07T11:28:12.519Z" }, + { url = "https://files.pythonhosted.org/packages/23/ca/9f1ef795bb724719532bd86dbec11e5b66857d3fbe9b6772baec0191a6ed/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d187197d234aa45d6cfa2b096be5f666e8cc2e7eb3722d0ab8926293cf5720c", size = 1250029, upload-time = "2026-08-07T11:28:13.896Z" }, + { url = "https://files.pythonhosted.org/packages/dc/25/5e061372d2ed953b9ba3b9c4f73de3b8e9234cda3f6c088db4686801d0e1/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:2d39a56282cfcc0d8eeea37267c754be59c98d48505c23b1dae5c6011f3813dd", size = 1243575, upload-time = "2026-08-07T11:28:15.37Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c1/ae7da218053120635a4ca802366c69f707203641af95372eeb83f70dfd52/ast_serialize-0.8.0-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7cc5f10386994c0f4844f1e6d6a97127e9b478660eb6dec2b257644f0acab64", size = 1294396, upload-time = "2026-08-07T11:28:16.813Z" }, + { url = "https://files.pythonhosted.org/packages/2e/89/271d1f49c5269fcddcc789ea3f25be401f6723fc1138aeda539f4d05516d/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6102f2f985c2e542be85cd857678ec9356fefa792b93cadfadd31139f5696f27", size = 1401987, upload-time = "2026-08-07T11:28:18.333Z" }, + { url = "https://files.pythonhosted.org/packages/55/be/4e7d77fcf571ac7cb5cf7115a20c36642bd7d29473b45dfaaefeb9618f90/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:3a8660fe66667b76a6e9dccd1d33e66b229fde3b308db991c041609226c005b6", size = 1502904, upload-time = "2026-08-07T11:28:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ae/ed1de2db7e019d4236fbc164ffa5ef9a6022a300a342bbf142d21b7c141e/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:e7266307e5fba39836edb79def8608887af48820508bff3c5f2941e1e04d1534", size = 1496967, upload-time = "2026-08-07T11:28:21.734Z" }, + { url = "https://files.pythonhosted.org/packages/92/89/5fea507fae5c5f18b7dc7f95e5c00956574b8c717b8fd2049c504fab0b18/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca7e6fd1ad845d1cc649dc2ecd499db2f8f46af5bf8da7b70dd858774cc038b", size = 1559041, upload-time = "2026-08-07T11:28:23.194Z" }, + { url = "https://files.pythonhosted.org/packages/42/71/478d69df21b64e064554a68134c94be304270316ca676a94e63c389a636a/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:2880350b13d3eae69a0d70bc1fb6c9bfaca4dbd0e20ba8cd1aa483080b56ff06", size = 1417367, upload-time = "2026-08-07T11:28:24.601Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2d/8962dc8d5b3a9dc27b36f9db199afa25264c741505469d9ec10ffbfd2ba7/ast_serialize-0.8.0-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:ab0f9a59f7d63d0d441b56b9a818b273705264352d5115cfee12e940e816d958", size = 1446178, upload-time = "2026-08-07T11:28:26.152Z" }, + { url = "https://files.pythonhosted.org/packages/4f/22/14d2ad4fd1d1bcd0dc687ca268e0630069f45162496260c0efb70ee0ea72/ast_serialize-0.8.0-cp315-abi3.abi3t-win32.whl", hash = "sha256:0485a25ef519c62e749ee3c1ad8070e591b380d67226349eb5a70b228dc1ac4a", size = 1063811, upload-time = "2026-08-07T11:28:27.864Z" }, + { url = "https://files.pythonhosted.org/packages/18/1d/84a327c0202a41aa5fdba3ade33904d6d8f3b9e6806fa83568d835395850/ast_serialize-0.8.0-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:bd84d60bca7079e741be4ac5dbe237751a59d7f6f9f0126b11880d63822cbe16", size = 1105518, upload-time = "2026-08-07T11:28:29.691Z" }, + { url = "https://files.pythonhosted.org/packages/8c/92/74556dec52fde85a2ad84ed159991b916241043788609c15d8b77e14570b/ast_serialize-0.8.0-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:057769b5921336eb2d9124f2a731b42ed05ffdac559b840dbdf6f3937cf153dc", size = 1076319, upload-time = "2026-08-07T11:28:31.282Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5d/c650b1f2cc1e75193358da95a080261422e8cd10b66d7370b1688c9915c5/ast_serialize-0.8.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:a02cbed7d8bfdcdee88edaac12bd50d53d9953aaa2e1852ef078625be5f1c0b5", size = 852914, upload-time = "2026-08-07T11:28:32.929Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e3/6142e920fec6ef7bccabd8c24ed8ed99f8bdc6cb8b065e1df7c6a3b2d667/ast_serialize-0.8.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e1bd223df0f6c96b396975fa604cb33bce53d9b4a0185490be4c4a289f7c9c87", size = 1184007, upload-time = "2026-08-07T11:28:34.654Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e9/6e8be8df02b35d85e2b8809f7f1cfa290bdf5882b55127a539d049482db0/ast_serialize-0.8.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ddd3b61f45c132da66c5476b281891e08c1fd87fbdabe8a6973e1622efc85f06", size = 1177588, upload-time = "2026-08-07T11:28:36.318Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/7e0fd2e2e2aba257820db4a8657c4c356844d36b914b20a4af294bcfb902/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f9caa63fad8241257ae401b5ff0a64026c6adb36b8e86cbe8782d9ea505daf6", size = 1234575, upload-time = "2026-08-07T11:28:37.772Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/3bae0af06f9b1bae3001c44d64215f5b567877e7aae9ffd45db11c3a7647/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3926fa117b5e65019853a2969966d11c7175af377a3425991f3fe73784412405", size = 1236015, upload-time = "2026-08-07T11:28:39.14Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c4/ce2d41a1bc22508e82618901f7e10f2a5e2f9556553fea90624daf9875e2/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485f1113af805e9e170b95ef993ca3fbd4f89c04bab25c58b4fc632d854801ab", size = 1432808, upload-time = "2026-08-07T11:28:40.664Z" }, + { url = "https://files.pythonhosted.org/packages/1a/90/f5058f209756dd70e958b7538aaa82d25d24944baf9ec8ae6f27b06fcacc/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccebbed24f1281062d5852353c72c47502955926cfcb8345ffb3a44d87ff3d3", size = 1256251, upload-time = "2026-08-07T11:28:42.223Z" }, + { url = "https://files.pythonhosted.org/packages/bf/32/7f77ea87fa0836daab706ed5cb7f903bb25fa26a77439011aee626af11d8/ast_serialize-0.8.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:252f883290d1cdb728eb7fe1d9a7221b88af5a329aae0bc91ddee4dafb820331", size = 1258574, upload-time = "2026-08-07T11:28:43.751Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5a/75b82ad2725b5e8e8c742732f9e76c6738a292d0709e1f60d10a973730b4/ast_serialize-0.8.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:96abc072ad29db8d02194afd47d68987322622787daceae82398d7b69f3ba2e6", size = 1254075, upload-time = "2026-08-07T11:28:45.28Z" }, + { url = "https://files.pythonhosted.org/packages/4e/54/8c20ed4eea805516a3fd23dd4a721ce28c64f50f0e4b359969f60a8c97a6/ast_serialize-0.8.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9118ad3e369727060b2696fc4078f250ecffca4248ba87f537f55cea9f9dce06", size = 1301018, upload-time = "2026-08-07T11:28:46.851Z" }, + { url = "https://files.pythonhosted.org/packages/cb/5b/9f14430f12fe830b656fb38f8e2e05ee13b02a88967660bef46af0ab22a8/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f359df4bd921918af8bebd142a376c77511d7151cc8ba852760b587b5a4a54f3", size = 1409951, upload-time = "2026-08-07T11:28:48.312Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3d/084882eca93c842bd4262591a071ec7f825340644035e51501208cc5a8d4/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e94f9121d13fa36cbf21314783c77d05ae3a0868decd18cf5233fdcc6de49ac8", size = 1509544, upload-time = "2026-08-07T11:28:49.847Z" }, + { url = "https://files.pythonhosted.org/packages/ce/73/ea84852096c2036c61cc0b2f97b90242207419f534dc671060ee1c8e05cb/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:54f95b486018d262bcb387a9afd96f0da74508b442762b80c769454a6fbb3ee3", size = 1505671, upload-time = "2026-08-07T11:28:51.239Z" }, + { url = "https://files.pythonhosted.org/packages/cb/88/287b9a5300c1f2f651d259f670931b63110adc265b7613c885b44c5bc53d/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c38b915511e32bc718c49dbce98ff9af36bac0ad6a604f58000cd5e3aecdba7", size = 1563685, upload-time = "2026-08-07T11:28:53.112Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f3/1bc3a79afcf0c2a8d2c37182d0d659d1545a9d7f7f6dc9cf3e63d6c17135/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:9a2ef9cf12f2de4f1028c42c1dd7d775255e0fb3e5bb48896c97e35ef52366fe", size = 1427977, upload-time = "2026-08-07T11:28:54.418Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cd/440c798957e14e31776bfeb024d8fafe0bb1d5b89c51c2f067e69938f7b0/ast_serialize-0.8.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f18048fe9f6dd266bd577cdec48bdcecb74faaa01fe941324435483b013ed2a", size = 1454335, upload-time = "2026-08-07T11:28:55.968Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/587eb36dcc240a54c8660f599464516b469ecad96f0dbdb6bccbedb50745/ast_serialize-0.8.0-cp39-abi3-win32.whl", hash = "sha256:31883542dd6c94d178f5db3d32fbd69c5eb88b3a7c018e7ac8cc0c45195ddbed", size = 1068858, upload-time = "2026-08-07T11:28:57.541Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a4/3e887bbd92164e183cb6e412c6a3e9198ddd446d7fe405958293ef5ef49c/ast_serialize-0.8.0-cp39-abi3-win_amd64.whl", hash = "sha256:861794565b06337005c1447ef23103a3d5a627d08bdc827870d00d0b28ef5f51", size = 1111839, upload-time = "2026-08-07T11:28:59Z" }, + { url = "https://files.pythonhosted.org/packages/25/6c/b400476d3ceba681ab929787edc9554f6d88fcc69435eb681b00fc0457a5/ast_serialize-0.8.0-cp39-abi3-win_arm64.whl", hash = "sha256:b2a5978662fd4db463dfb4b974d2b10ac6430b98f5333aabc7051909df3561d0", size = 1083655, upload-time = "2026-08-07T11:29:00.349Z" }, ] [[package]] name = "attrs" -version = "25.3.0" +version = "26.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, ] [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] name = "backrefs" -version = "5.9" +version = "8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/56/4744bcd0c82184e80c52b0ac4076c261a8ffa1f1b343ff2f6e89ce0e1cef/backrefs-8.0.tar.gz", hash = "sha256:b556cd7d36c3a3a2f256b89590b176b8eddfb73bcfaee3a3ddd84ea66d21ce50", size = 7013081, upload-time = "2026-07-26T19:54:24.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/e3/fd/9bf53b6a6f6f519ffaac765df2f2a25e5c2fc6d32cfd2b2747099e72c911/backrefs-8.0-py310-none-any.whl", hash = "sha256:4a627b817fd2dce43b79ab48da63613340509381cd8ce0897078a0bce79a2ab8", size = 380377, upload-time = "2026-07-26T19:54:17.457Z" }, + { url = "https://files.pythonhosted.org/packages/e1/29/4bd7ae72a2634da00379c2b3bcc5439e7c94620235c6afea8af15229a973/backrefs-8.0-py311-none-any.whl", hash = "sha256:f0c35cf0102ba6b6070c12a492be3c1c1d3f5839529784b9a9565d6d04569a01", size = 392169, upload-time = "2026-07-26T19:54:18.782Z" }, + { url = "https://files.pythonhosted.org/packages/29/13/232505664e8e2a0c7a2eb0c505cfade9d715538f89a5d62bc4c272968f62/backrefs-8.0-py312-none-any.whl", hash = "sha256:87f0fae8c5f207fe9f4b2887efc71d42f4900ac78faa1af08d675ef303692dc5", size = 398084, upload-time = "2026-07-26T19:54:19.954Z" }, + { url = "https://files.pythonhosted.org/packages/8a/69/47a3dc20abc4fa5486655fde681bd55e63211b46c886d8c02223d6468431/backrefs-8.0-py313-none-any.whl", hash = "sha256:601ce68ca12385dbda06ce264406b4c4210cf5b79fd0fd627592365c92f29a88", size = 400040, upload-time = "2026-07-26T19:54:21.194Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cf/e5f9b68a5b0e939a2fb933a66c20180d0c9241bf8927f7a47fa48c1675e9/backrefs-8.0-py314-none-any.whl", hash = "sha256:9ec96efa080938be92323e8e730e57718c9c88eb15ad70bbef4e1766df591408", size = 411903, upload-time = "2026-07-26T19:54:23.221Z" }, ] [[package]] name = "beautifulsoup4" -version = "4.13.5" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954, upload-time = "2025-08-24T14:06:13.168Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113, upload-time = "2025-08-24T14:06:14.884Z" }, -] - -[[package]] -name = "binaryornot" -version = "0.4.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "chardet" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/fe/7ebfec74d49f97fc55cd38240c7a7d08134002b1e14be8c3897c0dd5e49b/binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", size = 371054, upload-time = "2017-08-03T15:55:25.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4", size = 9006, upload-time = "2017-08-03T15:55:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, ] [[package]] @@ -96,7 +162,7 @@ wheels = [ [[package]] name = "cairosvg" -version = "2.8.2" +version = "2.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cairocffi" }, @@ -105,160 +171,315 @@ dependencies = [ { name = "pillow" }, { name = "tinycss2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/07/e8412a13019b3f737972dea23a2c61ca42becafc16c9338f4ca7a0caa993/cairosvg-2.9.0.tar.gz", hash = "sha256:1debb00cd2da11350d8b6f5ceb739f1b539196d71d5cf5eb7363dbd1bfbc8dc5", size = 40877, upload-time = "2026-03-13T15:42:00.564Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload-time = "2025-05-15T06:56:28.552Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e0/5011747466414c12cac8a8df77aa235068669a6a5a5df301a96209db6054/cairosvg-2.9.0-py3-none-any.whl", hash = "sha256:4b82d07d145377dffdfc19d9791bd5fb65539bb4da0adecf0bdbd9cd4ffd7c68", size = 45962, upload-time = "2026-03-14T13:56:33.512Z" }, ] [[package]] name = "cattrs" -version = "25.2.0" +version = "26.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e3/42/988b3a667967e9d2d32346e7ed7edee540ef1cee829b53ef80aa8d4a0222/cattrs-25.2.0.tar.gz", hash = "sha256:f46c918e955db0177be6aa559068390f71988e877c603ae2e56c71827165cc06", size = 506531, upload-time = "2025-08-31T20:41:59.301Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/ec/ba18945e7d6e55a58364d9fb2e46049c1c2998b3d805f19b703f14e81057/cattrs-26.1.0.tar.gz", hash = "sha256:fa239e0f0ec0715ba34852ce813986dfed1e12117e209b816ab87401271cdd40", size = 495672, upload-time = "2026-02-18T22:15:19.406Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/a5/b3771ac30b590026b9d721187110194ade05bfbea3d98b423a9cafd80959/cattrs-25.2.0-py3-none-any.whl", hash = "sha256:539d7eedee7d2f0706e4e109182ad096d608ba84633c32c75ef3458f1d11e8f1", size = 70040, upload-time = "2025-08-31T20:41:57.543Z" }, + { url = "https://files.pythonhosted.org/packages/80/56/60547f7801b97c67e97491dc3d9ade9fbccbd0325058fd3dfcb2f5d98d90/cattrs-26.1.0-py3-none-any.whl", hash = "sha256:d1e0804c42639494d469d08d4f26d6b9de9b8ab26b446db7b5f8c2e97f7c3096", size = 73054, upload-time = "2026-02-18T22:15:17.958Z" }, ] [[package]] name = "certifi" -version = "2025.8.3" +version = "2026.7.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, ] [[package]] name = "cffi" -version = "2.0.0" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, + { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, + { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, + { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, + { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, + { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, + { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, + { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, ] [[package]] name = "cfgv" -version = "3.4.0" +version = "3.5.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, upload-time = "2023-08-12T20:38:17.776Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] [[package]] name = "chardet" -version = "5.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload-time = "2023-08-01T19:23:02.662Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload-time = "2023-08-01T19:23:00.661Z" }, +version = "7.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/cd61c567092a6cec796144510a68aff158ebfc1df82950a45bae65f28413/chardet-7.6.0.tar.gz", hash = "sha256:93d9df6089ded42ed1fe9f57e272c0b74bd0464d45c0c7d50f09f26f31105c3c", size = 914462, upload-time = "2026-08-14T20:36:59.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/62/64da80dad0c804e743b4156f379183578f1e33918856ae928dc9248a6002/chardet-7.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:19fea52164e6e00f2a21ed418f42e4b0162a09199274c86d07ad3efd661317c4", size = 1094073, upload-time = "2026-08-14T20:36:26.53Z" }, + { url = "https://files.pythonhosted.org/packages/44/99/934fb862d102c8756008597f4398323f32cef329f16e87fbb3bf76d4f4be/chardet-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a12023d48d0e207791c01161d03cb3c0d85c6a15f345eb9d3d56063a63d1e40f", size = 1071612, upload-time = "2026-08-14T20:36:28.067Z" }, + { url = "https://files.pythonhosted.org/packages/71/e9/b04e0ec576a77e79fe37279a9a5d5b1ae752d365e43df2eca0d0eee4cea5/chardet-7.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:249993b88ac7a58cad2781acea8f379152a28a719c9b401d614898c63a8c83da", size = 1489219, upload-time = "2026-08-14T20:36:29.357Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a2/c4d99299e9ce7fad561f8bb56babbbbdd3bb6b4fbd7c0ec674c1dbdd2cc5/chardet-7.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf0adaca8b1c4bacfade9d0a1e4f8f70b1bb122833d6f07ab90e3adc84eb13a", size = 1518293, upload-time = "2026-08-14T20:36:30.879Z" }, + { url = "https://files.pythonhosted.org/packages/56/1d/49f13052b74303bab2789d098063cbd19758217949ea54ffa216b6098cb3/chardet-7.6.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cf6d08c2373b7772a558d141f9e8cee53fe1d222341bac612e4d558b04995f73", size = 1459077, upload-time = "2026-08-14T20:36:32.149Z" }, + { url = "https://files.pythonhosted.org/packages/0d/53/8da1f4758286efd8faf71356facddb382788ecf1bbd7c70d63e2e18a4898/chardet-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:406936df1328a3284fef366eaa2bfd1cccd0ef1b10cb99781dd5b022ea644b84", size = 1160778, upload-time = "2026-08-14T20:36:33.436Z" }, + { url = "https://files.pythonhosted.org/packages/a3/29/16a7419edfbd60e901e6a797cbc3e038cb2a81903bc16c029db755f0156f/chardet-7.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:57e6846cc13ce1ff59979f4ec9da770c57e12aa99046073f632de5a51d9a6f20", size = 1088449, upload-time = "2026-08-14T20:36:34.723Z" }, + { url = "https://files.pythonhosted.org/packages/1d/36/3a14b0f8ddeb302f157281ca656a3ce6874b78e2d6af03682f520b487245/chardet-7.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:089e3bb81a0a07e94f15461ded9f9ee66d349615b1a9fd557d4de1003e2fc12e", size = 1065126, upload-time = "2026-08-14T20:36:36.21Z" }, + { url = "https://files.pythonhosted.org/packages/d2/4c/f59a39c2bfe4ac99baba8da842e8d2ea0b84dff7ba53a96e7ad8c71602d7/chardet-7.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:43ea433e43a23c55e8e17f3fad1e07f5cfe5450c73124b95b0d849c21ad379ee", size = 1482492, upload-time = "2026-08-14T20:36:37.649Z" }, + { url = "https://files.pythonhosted.org/packages/bd/eb/93e8036681157f2217a18769927a035984526e6dbd5e91f28a375ca41c14/chardet-7.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b5d31f9b7f793e15e81cca877e7ccd72bffffa2a3443a9d47be9dfee84fad69", size = 1514185, upload-time = "2026-08-14T20:36:39.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/04/0066d7ab2c135e404a6fa166bb7fa49d1c7bf7af07b86ed95b1c48a348c7/chardet-7.6.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54b6a8d3b219560fa5cf4c28df932c37471afe047afdc152067104e741f38c1", size = 1454420, upload-time = "2026-08-14T20:36:40.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9f/e965f1d9eddfb86cf118f980d329cbee43c4ac4b562448b369a6b6ef36af/chardet-7.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:b3b4c96c4df93899b3c8b9e8159e06b1f55c66d7ca384d91481108e251a06eb0", size = 1159067, upload-time = "2026-08-14T20:36:41.816Z" }, + { url = "https://files.pythonhosted.org/packages/cf/78/e14991c9487277ed7d006fff58f3084ac792ed94cced081788abb95df70c/chardet-7.6.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c6061adf247ab5dda173b67010e13904c6071717660c7c8077fb50aca362b264", size = 1087678, upload-time = "2026-08-14T20:36:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/7a/40/0f95e04cb1820e0a582cd6d86bbf26be8302a94ccf330f8ba5f69735389d/chardet-7.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fc1e1571321baf8927582fe34363ad7f02279f11c8c2839c14b4c76894148db6", size = 1065310, upload-time = "2026-08-14T20:36:44.489Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a1/04404dcc9d6e1253b02583e562d2c7ddca50a7e91f460d62eff7e1d07c92/chardet-7.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8900f6c7cf6b015b17a51767cc6144689059ba1cdceaa383d29eb037ac28579e", size = 1485028, upload-time = "2026-08-14T20:36:45.797Z" }, + { url = "https://files.pythonhosted.org/packages/f4/88/360064c4c7d9d0664561dae03b74c871d2f5332b329f5c99f1c997fb869a/chardet-7.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cedbc584789eb2edfde20fd03669972a833ce6019e60014ae613f9bfc440e8e3", size = 1510242, upload-time = "2026-08-14T20:36:47.206Z" }, + { url = "https://files.pythonhosted.org/packages/43/4c/302869fa1c69a5a41e4e78782680b12552ffd4286c3ae3c839b7b8df53d4/chardet-7.6.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5dc835e40e0e09c2c3eab43731a8b5127834f42786dda09ba2f4b699ccd527a", size = 1456456, upload-time = "2026-08-14T20:36:48.668Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a9/ff4fef15ed25fc3f945a3b981ae0f43c8559b3fbedb40267e59e583d105b/chardet-7.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:0f304de7041afaec0195ad6464937cd112392002e9d72ed15d55f20a9abd3a13", size = 1159103, upload-time = "2026-08-14T20:36:50.107Z" }, + { url = "https://files.pythonhosted.org/packages/31/44/94e6f89485ce6c630e8fec6d388e3fa747e58b7246b0cc8c5c532ba98650/chardet-7.6.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a4f0a368ad04d5def08bdfaa17c7e15e71552f93923dc2aa9b2f7d9dee02fbb6", size = 1120302, upload-time = "2026-08-14T20:36:51.484Z" }, + { url = "https://files.pythonhosted.org/packages/e0/cd/8e68ba12f13aaf4ee82d54ef8a1f83d62942e7a6bc1e579dd2d530a3e26e/chardet-7.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:75d6c3a4d2046d49e83d2d2206eb073a1f390743e856d90c1bbc19949b26acf4", size = 1093157, upload-time = "2026-08-14T20:36:52.987Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f6/6a35342b9efa69dcceab0ea8966571c6442a59c336bf460f0a2af95ed234/chardet-7.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:459e2b1c98f9a86a4698112aa42dffa802bbbff883c1ff144071f87224125862", size = 1521213, upload-time = "2026-08-14T20:36:54.812Z" }, + { url = "https://files.pythonhosted.org/packages/df/8c/8f09bfabbaedae45caa72b996e96d5e3f6436dfddc55c1311ffa2f6bd7d2/chardet-7.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bdb6f03107b7ace3f44e0edd91aa24456ee558787df265cc19daf45785b31c7", size = 1528427, upload-time = "2026-08-14T20:36:56.224Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3d/2540627b193112e08b8045f3cad9295570866208555aa6625b63cc69c6cd/chardet-7.6.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:0c44a32da32cc8b23d6b20d98ace15ec7600950e4955d1bf5ab1f849b0187fdb", size = 1087374, upload-time = "2026-08-14T21:04:14.994Z" }, + { url = "https://files.pythonhosted.org/packages/fe/de/dac4f550cde73c4732b4916e72ec489ae36933fbbd1697e4122d3ae2e9dd/chardet-7.6.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:7bbc8a9652c7f859c593847f220c1d264f25749369abb1a267b404ee8cceb209", size = 1064688, upload-time = "2026-08-14T21:04:16.806Z" }, + { url = "https://files.pythonhosted.org/packages/06/45/f4f3f288496797d2cf1d1e9036f920ed2b4c79787b21c42a3314f4a6d532/chardet-7.6.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83512a475a2f3886166aa0bca1bbb39343a4eb3186dd5532127d6f2591d09118", size = 1486320, upload-time = "2026-08-14T21:04:18.535Z" }, + { url = "https://files.pythonhosted.org/packages/c0/81/3ca30c16e6c6015b737fca22d9342957cc617d8a65329d3e963ad754a31b/chardet-7.6.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:271ab71ec1be61dbbce0436de0848895c03eae051c379e937a39573d9ce403d9", size = 1515374, upload-time = "2026-08-14T21:04:20.724Z" }, + { url = "https://files.pythonhosted.org/packages/6e/98/163a75b8b3372a6b6503f5f5a4154a222ac135c7a706b5d176f8e4b237a2/chardet-7.6.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da86fc1b40ff5996fbb5e4c2d2dca770eac2c893cef157dacc050b8b4d929846", size = 1469504, upload-time = "2026-08-14T21:04:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/d7/4f/3ad1b1bd27ae7f0d3d13cf711366525cd781a9e067950d8a09aa280916cb/chardet-7.6.0-cp315-cp315-win_amd64.whl", hash = "sha256:b73f277c1ac09c4f8076c4214b816c7aa78a0a2f0cb7156742f4303f856bedc3", size = 1158551, upload-time = "2026-08-14T21:04:24.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/92/22a609c68c5123ebdccd8fe1a80e423609012ce20166de19a2ed3955b2f7/chardet-7.6.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:61238d5945b36af9a2ad13494f8969b7deb3c3b4abe223e54670c064e73f5328", size = 1119186, upload-time = "2026-08-14T21:04:25.761Z" }, + { url = "https://files.pythonhosted.org/packages/29/35/75a90143e4200e197f4f6cf5895d379e22bc785d0c7711120df18fa5347c/chardet-7.6.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:f2ec3c78cc6b54bf8e091ec4ee885473078b5d7ef18ab1b01c86ae1e98bf88f7", size = 1092596, upload-time = "2026-08-14T21:04:27.884Z" }, + { url = "https://files.pythonhosted.org/packages/d1/2c/b6d5f47d878c46e04ae6fcb58e0969467925bc0819b333c682e0c41bbc5c/chardet-7.6.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:167d7ba3ee08b654e36d7b43ebd9a36606c9a12e2fabdb361757a095ca3b7e3d", size = 1516644, upload-time = "2026-08-14T21:04:29.624Z" }, + { url = "https://files.pythonhosted.org/packages/25/d2/2bc3f1066c6f27bc3fa3a98dfd8a2a9c1e969a9d6bdc1edcd35278791fc4/chardet-7.6.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f14f46ef1977e41ce1f4814ca6984cea7f8b6baf8cbc6626ef7bf3d13cf7ea13", size = 1533221, upload-time = "2026-08-14T21:04:31.39Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6e/5a0b348fa4cd7847567a28c6e697ccf58391960bfd13a6e7473ee23ca2f2/chardet-7.6.0-py3-none-any.whl", hash = "sha256:4076d795897ce45239825956a1334e134322ecc4bfe84dbb12acd5390de0fbc1", size = 680279, upload-time = "2026-08-14T20:36:57.763Z" }, ] [[package]] name = "charset-normalizer" -version = "3.4.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, - { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, - { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, - { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, - { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, - { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, - { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, - { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, - { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, - { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, - { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, - { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, - { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, - { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, - { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, - { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, - { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, - { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, - { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, - { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, - { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, - { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, ] [[package]] name = "click" -version = "8.2.1" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, ] [[package]] @@ -272,89 +493,114 @@ wheels = [ [[package]] name = "coverage" -version = "7.10.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, - { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, - { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, - { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, - { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, - { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, - { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, - { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, - { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, - { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, - { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, - { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, - { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, - { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, - { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, - { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, - { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, - { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, - { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, - { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, - { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, - { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, - { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, - { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, - { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, - { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, - { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, - { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, - { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, - { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, - { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, - { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, - { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, - { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, - { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +version = "7.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/f5/deb1a27aa20746c0278ac998c4179e272004699b2d33959ce020c5ac1615/coverage-7.16.0.tar.gz", hash = "sha256:077f0964087883176ff6ab9b074694cae29f8c708273b13ca62c183c6ed716cd", size = 945620, upload-time = "2026-08-28T21:54:37.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/9c/8d2688694f53dc0b0f0e4783c7eb3c4bb1e79beaf1411879f6dabedf4607/coverage-7.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1c77c3579ac42798f8b7eed6d3dd258debacca32c8753fc8a1f6eaf1db644f5", size = 223194, upload-time = "2026-08-28T21:51:27.767Z" }, + { url = "https://files.pythonhosted.org/packages/ca/11/f002163dd688aa3fa49ac6a424b7c2705c7fcf80fba18ec9f586d77827ca/coverage-7.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1f81cb1554c3712e41649ed5dc98656b50b958e4da12f0f5adb681ce3db92831", size = 223553, upload-time = "2026-08-28T21:51:29.46Z" }, + { url = "https://files.pythonhosted.org/packages/81/65/f9d469e97c4554372a710650a109004a2434dfc56f577142e5d6057fa0cc/coverage-7.16.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e701938ec9081d3e400a0c9a9a8ae0f7ca44214741daeac4454b1c6ef6dbd19", size = 255054, upload-time = "2026-08-28T21:51:31.54Z" }, + { url = "https://files.pythonhosted.org/packages/95/29/dd89fd39af1a3b6e9a9c3eddeaf03f6376ba517d43d6cbf8b519177e2a10/coverage-7.16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:719a3feb6220dd32ed932d4c3676d17fb8739e2643b29c0e7c3af400ff80ac44", size = 257790, upload-time = "2026-08-28T21:51:33.374Z" }, + { url = "https://files.pythonhosted.org/packages/0a/64/208d26cedc525d6b5db9c492cf9130784c42d9eb08d22badaa7b806005ad/coverage-7.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87771ecf986cff55e87413238cd5e4f54d949c2074bd6fc1657d26a56314ee24", size = 258904, upload-time = "2026-08-28T21:51:35.096Z" }, + { url = "https://files.pythonhosted.org/packages/1f/98/28e2752aa9a8baee5798edade9c95602ca200f4e7eeb503eb64df42e5921/coverage-7.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:47d5e1fc0b321c8308a2aacee0497c435b08acaa629b7059798fdf6fc3006352", size = 261165, upload-time = "2026-08-28T21:51:36.744Z" }, + { url = "https://files.pythonhosted.org/packages/eb/77/fa6ae699a0ea2bc12acb38a85d96b786fea0f833c12b5756056350e0e547/coverage-7.16.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01b18b8a6c9cec8d5f45550e2501426ed982cf2c35016b0acd2ba9b5d8b2fb06", size = 255416, upload-time = "2026-08-28T21:51:38.495Z" }, + { url = "https://files.pythonhosted.org/packages/89/c8/5ee46d1de7d34cb00ba08b5c50da1971114dbc09ca9898ccc32975ec74dd/coverage-7.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:32c56b5b47c50635081445ac404dd08c2d591b9c837c22570aa9e182c3b42cd4", size = 256825, upload-time = "2026-08-28T21:51:40.27Z" }, + { url = "https://files.pythonhosted.org/packages/15/f6/d59e1c0693ad48855fe20169fbf6ee5befefe5887a7fabf5f0bcb464a2dc/coverage-7.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ad3bbad240ab937512156bc944fdee63ac4dd34a7558a3094548fd4c1150c02", size = 254970, upload-time = "2026-08-28T21:51:43.136Z" }, + { url = "https://files.pythonhosted.org/packages/df/7b/b51bbe05b3a7565927fccfb1be42b8b3c1f4ab15e53d91b303e9923969aa/coverage-7.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4c1f16d5555a195295d0dc9c902612270e3dfed6a11f3bf7bc470b7b6a79ed3c", size = 259039, upload-time = "2026-08-28T21:51:44.983Z" }, + { url = "https://files.pythonhosted.org/packages/fa/04/d513f816456a8a43c1859abe88a37d01d7d2515b6c3e24ebb3c9b1dd44ec/coverage-7.16.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f6c9c21a8bf0d19788f3c5f3e020c90317a0a63ef60521b376003801e21250fb", size = 254539, upload-time = "2026-08-28T21:51:46.733Z" }, + { url = "https://files.pythonhosted.org/packages/dc/54/5542190ceb97e0d1333a4ce0c8f95b2ef2efe790f1ad018a4b61766f849e/coverage-7.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f20145a9eb5bf1fd1dde3c0bc2af2e7c22135ab07ca6284d6ada7cc3904c4e", size = 256410, upload-time = "2026-08-28T21:51:48.363Z" }, + { url = "https://files.pythonhosted.org/packages/ee/28/78643f361ff6bb5b2ade90f8bfc8395fe9ca367a18c101f8991215b4c65b/coverage-7.16.0-cp312-cp312-win32.whl", hash = "sha256:916cf8d25c1ce148f7eceb1d45afc9724841200110adc4e53250391852debd91", size = 225239, upload-time = "2026-08-28T21:51:50.22Z" }, + { url = "https://files.pythonhosted.org/packages/67/61/8e76b36c36b1a033dc933dd2480db96b04ce3be975793ce3fad122e7174d/coverage-7.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:78f8b56261d608be102c62edd3a60b66bcd0b581f3f86fdcabaf8b8d95adc950", size = 225775, upload-time = "2026-08-28T21:51:51.912Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f3/bb4787a4b81c1792ca69b502f5f730dbbb609f73fed552ab074c6b92cb8b/coverage-7.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:577c2ac8c0036f6f8edd3a7783a9e67302b17771d1abf0fd2ed246e3158be51b", size = 225159, upload-time = "2026-08-28T21:51:53.667Z" }, + { url = "https://files.pythonhosted.org/packages/54/c5/e62c87f4799d1e3647d5b2ae16ea1d12205d72fde1ea8529e13fe050f678/coverage-7.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1545c52ce756b8a97007f439a220297f1cd72a2cbbcdffccdf1c1f70e74f9a42", size = 223215, upload-time = "2026-08-28T21:51:55.628Z" }, + { url = "https://files.pythonhosted.org/packages/89/e9/5e62fda9397175fb206f75368b6e85da06d831c181b6d0f67ca073cd2f89/coverage-7.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0598aadae641f30a0796b75b45c0b9c5de8619bd5cfb251bb0cc254e86e6dd13", size = 223585, upload-time = "2026-08-28T21:51:57.355Z" }, + { url = "https://files.pythonhosted.org/packages/b9/40/bede08621b1ba67e88c4d3336c22b52cb7911ff1fa4ef055344b6670e58a/coverage-7.16.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4080ad6bad9f14690e6b2104f5e8d137ccc65a4b5427a36662090637d4bd16d5", size = 254575, upload-time = "2026-08-28T21:51:59.233Z" }, + { url = "https://files.pythonhosted.org/packages/12/d8/ab0bdaa45dfd6b8cbf1a3ec548fdf827684b1997f9724375c5b3e89144fb/coverage-7.16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e9883a2f8206ce3af59117dc278e5d043fea06912bca3f199816129e5e2de354", size = 257172, upload-time = "2026-08-28T21:52:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/1d/bb/135de81784bbd7dfedcab2b92b03d71d75b09b0815b42d6dabb052def5a6/coverage-7.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:984e5430fc6f858385009e92549955157d79335b1f3e13e1031e0f89d1284261", size = 258410, upload-time = "2026-08-28T21:52:02.76Z" }, + { url = "https://files.pythonhosted.org/packages/ad/72/ce44ecc062fb2e43d9447bb76154d091c2139232f20c125297c4b58f4c6a/coverage-7.16.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b1374099dd1ad0d31fbb6c95d00a56a3c5e85fb3343dca14fc12f78323a2b42a", size = 260539, upload-time = "2026-08-28T21:52:04.821Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/9389c36a41e59406ca2bba493807c2294d2e5186a7e9ebcc2e63a0f2a711/coverage-7.16.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34d8686bce035c8465b318a8c2890e69ba14a00801a27f4eb6bdc97c23944d87", size = 254756, upload-time = "2026-08-28T21:52:06.68Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0f/7762447b15e01fb84263608540123c4d9941f06303265ee74d801ccbec0e/coverage-7.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:857fceba6ff4b507ee0ad98798a33d544a8473df0c542bf04251ee4ed5ee6292", size = 256540, upload-time = "2026-08-28T21:52:08.529Z" }, + { url = "https://files.pythonhosted.org/packages/e6/fa/c60dc75a8346c1dbebebc7279b19971c88f70dd575f0bc10bc0cb16f92d5/coverage-7.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bbf08d951abaa1ce89e28c998361d56b952413846b459cd017f116ad4c9adbfa", size = 254508, upload-time = "2026-08-28T21:52:10.323Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/4e0834f3a1fccaa8bf625a2a1d73bde0fa32577dc3249853c0dd0e7f2b20/coverage-7.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1a03e78f53e4d2ab13adac19958a89322d1829913e5623d642627bf60b35da21", size = 258659, upload-time = "2026-08-28T21:52:12.124Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ec/fe712d3a11fd6e874565a5fa5497c48b8ece561d9611da040b44cdcf8386/coverage-7.16.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:dcd3dafcdd78305d27c59a1006b53a4990acb89e68d8fbe0992f4f83503c827f", size = 254326, upload-time = "2026-08-28T21:52:14.181Z" }, + { url = "https://files.pythonhosted.org/packages/e7/78/093e12072e01034c65ff380f76c74b79dd83e44fa92b689a2154389be734/coverage-7.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c1bcfe470a796fbea6234accd81d258a31574dc0b7bf569e16be757572c4de17", size = 256102, upload-time = "2026-08-28T21:52:16.003Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c0/265176117ca5d06e3f65575842884cdda96cf213350a31e9d41c80d65854/coverage-7.16.0-cp313-cp313-win32.whl", hash = "sha256:1420370276f1694b663207b8245c3628aafb9624fe3cebf313a13d860e55ee67", size = 225250, upload-time = "2026-08-28T21:52:17.82Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/8a87f2c04fde322430b45d16d8f543693e9894c5b2d2ca238a287c00beca/coverage-7.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:496277c8d7beed695e02c7be53516a0152e4caef8738a0feab6a638546cce449", size = 225790, upload-time = "2026-08-28T21:52:19.641Z" }, + { url = "https://files.pythonhosted.org/packages/23/40/c21feacd9edfe7063195bf9cc84d650e9938fc6a23063e4f027199b160e1/coverage-7.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:181c2906b9b3759955c1c33c51fbb91c754fbd0b82ea49e2c81061f5a052082c", size = 225180, upload-time = "2026-08-28T21:52:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/850675f262391b322c4c988b6cdc32cdc6629288f0fb158687b587a393a8/coverage-7.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:54b7fba6a74d010de34319a0419d5b65af8c00f539ad0b6f39fc6f342ab99697", size = 223258, upload-time = "2026-08-28T21:52:23.558Z" }, + { url = "https://files.pythonhosted.org/packages/61/c1/4f54c6d47c80d1cc58ef8fe6b74e6eb50f9e2c0f6e2de6cf38dbca2937b8/coverage-7.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fa4ff0b3dd52208d2b30903022d5087f82000507b504753dfeee83e4f32d6883", size = 223587, upload-time = "2026-08-28T21:52:25.627Z" }, + { url = "https://files.pythonhosted.org/packages/3c/be/298f2456230fb44e272a4e53a41b3f3c39f0821c242d7b7daa9787b4d6f7/coverage-7.16.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:35a9676bf86097f790113ebd9fb67681804ef54d40941d2f10ba68c02239e575", size = 254632, upload-time = "2026-08-28T21:52:27.689Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9c/a1bda6439c19c4783d50df896142b67b9e7d432db36675d339a32778669d/coverage-7.16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f98d438add63546745e5e847192e3e9ab897ed6f2ca96f8281e2f5a15958ae62", size = 257139, upload-time = "2026-08-28T21:52:29.741Z" }, + { url = "https://files.pythonhosted.org/packages/f8/cd/cd735c9be757f97237c305f36897a5e5b348bdbc12ebed3b2b80060dd8a9/coverage-7.16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:151855767480be14db595cbc2040f6a4db965cdfeebd354d79b0256742b029e0", size = 258484, upload-time = "2026-08-28T21:52:31.68Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/84b2e1e8aae9db3f549782f28ce25bba5fd6a9c7bfba3782ffe8b4cd2559/coverage-7.16.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:183613f664718b340589d7f005c7e92b4b601cffd20a8a4117cfda3e983b080f", size = 260798, upload-time = "2026-08-28T21:52:33.642Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4f/e04cf52483619a4dc5dd6367b30c9a8ac52243567fdfacec9b11a441565c/coverage-7.16.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:785b114356c99c0dd5b3f57b9696cfd57b7704f4c53847df8dc88c6cc0d9bcb6", size = 254612, upload-time = "2026-08-28T21:52:35.543Z" }, + { url = "https://files.pythonhosted.org/packages/da/33/627c4113f66bfffd43807f54dbf080c4632ecf12e4ef7a3bdd4ec38e46a2/coverage-7.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:30f5aee6d1d517abcdfd4f9cad027969ff79a1440a22da263f9514e31b5b66e9", size = 256495, upload-time = "2026-08-28T21:52:37.485Z" }, + { url = "https://files.pythonhosted.org/packages/3c/38/aaca432f4e008a88f2bc4d1459aa7016d8d1bbbe801f7e4fa3cf2746557b/coverage-7.16.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:190ffa0f5af966254c249fb3aeaca2cef389785e3e287fd577d39e134d20f8a3", size = 254454, upload-time = "2026-08-28T21:52:39.425Z" }, + { url = "https://files.pythonhosted.org/packages/cc/db/8430aa87ef0a508f4c17c1b8fa7e0cf80231988d9081aa36c194036592d6/coverage-7.16.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0ccc37c00e1a5d30840902c54557e104d04aead872cedf6d2281c8725a467e06", size = 258728, upload-time = "2026-08-28T21:52:41.32Z" }, + { url = "https://files.pythonhosted.org/packages/76/88/cd8aa8c82493ffbd291d3ef5554452fffc634c6c6098a04ac848c79c98f3/coverage-7.16.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:6c60cde430c0e7e3be612973af39b4cff90ec2e2defe7b2b701daea3a0ffff04", size = 254271, upload-time = "2026-08-28T21:52:43.278Z" }, + { url = "https://files.pythonhosted.org/packages/a8/49/fe16c811ea9314a84b48f34e4bf5a3d9013091093b285a74b2272fc863d7/coverage-7.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c5297028c8df849a61b29129cadfe682f90b5b396f528eb319a57d7678eefdad", size = 255927, upload-time = "2026-08-28T21:52:45.461Z" }, + { url = "https://files.pythonhosted.org/packages/d1/45/d0bd410e78cfbf768acc8099b335e1d5c0d5c26103c796d2bebdee001715/coverage-7.16.0-cp314-cp314-win32.whl", hash = "sha256:136988df5bc5a48795d9c42c75c4bbda5d9a78e750a080c1233010edff93a1af", size = 225424, upload-time = "2026-08-28T21:52:47.658Z" }, + { url = "https://files.pythonhosted.org/packages/17/78/1ce6ce4646822e9308dcdb1942eaf31bfd7da43247b8886338b0d6fe3767/coverage-7.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:ce2ba5e9f1842fe09165825abfb3bc6b527c71a27bc2eb3a10f2284ced64506d", size = 225918, upload-time = "2026-08-28T21:52:49.692Z" }, + { url = "https://files.pythonhosted.org/packages/f9/cd/e1323fe3a7dfcdd709451a43fe708ca1dfd36a7fc07b34eb7bd1dfdfb52d/coverage-7.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a89d07e48d9baead9a15599923a02f62c6df6c3d85aa84ef34be3c9fd6aeb91f", size = 225344, upload-time = "2026-08-28T21:52:51.665Z" }, + { url = "https://files.pythonhosted.org/packages/39/fb/1c15460d4cf915f09ae3ad3862fef4f901838991c5641b0cec545050d810/coverage-7.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6e2854b62601c89a63814ad5def3b90d99c6724cc4cb977f75b725e5fca4b1e3", size = 223986, upload-time = "2026-08-28T21:52:53.572Z" }, + { url = "https://files.pythonhosted.org/packages/9f/73/347d2d0009ac211f79ee2a2364fd2aa19d6b9628dc22ed13a9b9386097ab/coverage-7.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f093faf23df888518d273be6da65f0ec5a25b5d8b670231e4d87de07361042e7", size = 224254, upload-time = "2026-08-28T21:52:55.59Z" }, + { url = "https://files.pythonhosted.org/packages/5a/2f/51442e6ad9d705369596f08496021647e276d5b57311818fd4312d93509b/coverage-7.16.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b7dbbbf6551eb94618e7bc76ab61cc2740a5b3d13294171bd6adb36e12346c3c", size = 265619, upload-time = "2026-08-28T21:52:57.645Z" }, + { url = "https://files.pythonhosted.org/packages/ea/8e/0f752276f6d13efbd019ab6d90792e20d6272c44cda039dc5c6d27b91e7f/coverage-7.16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51e7d0e311d2fba3915f971236cbdd4ad821fc7a23988221c0b33c964b0eba22", size = 267734, upload-time = "2026-08-28T21:52:59.611Z" }, + { url = "https://files.pythonhosted.org/packages/fa/02/4df3baef8029881c9d1a380859f2be73f90080d430def567d182e8566a35/coverage-7.16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bb04ee77e557d7476471969d35fbbfb5fc8a4152e9409aa5811780c36d9b23e", size = 270156, upload-time = "2026-08-28T21:53:01.658Z" }, + { url = "https://files.pythonhosted.org/packages/9f/30/ce10fdb74055ebbfb5c8a025d8845dc19c76e4b2c42bb5c755b56678990c/coverage-7.16.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c72c9b201dc0e8c2c8821d49858fd865010d08181bf877d2320971b6464ebfd5", size = 271279, upload-time = "2026-08-28T21:53:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/71/19/c7e1fc9504d90da848493bad4018dd235c713a80633e48c5f0a41b63d45e/coverage-7.16.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0fca700cae4635656668ba6e2b66a85aac9f2622d7b2bcf82e844c409eaa1313", size = 264677, upload-time = "2026-08-28T21:53:05.741Z" }, + { url = "https://files.pythonhosted.org/packages/a4/f3/4021519dd41583ab396c81955387f927779641f6bac26818b6918a45aafc/coverage-7.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:584896fb8b650e999e24ef57e9513e482c12f8e15a73ee9d4584e23c99465867", size = 267610, upload-time = "2026-08-28T21:53:07.763Z" }, + { url = "https://files.pythonhosted.org/packages/55/fc/df65aac93938d8f506434c8e96440c1d696f6be0a6a01d3c6bfe5d49403e/coverage-7.16.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:949eae7e0f562b1518355aaef4b03523e49a6d3fea12aa3542d9e36c863f8267", size = 265217, upload-time = "2026-08-28T21:53:09.786Z" }, + { url = "https://files.pythonhosted.org/packages/32/2d/dc9a5e62715165fcb4c715f965f411e324917c9daeddde16536e9d36ce3f/coverage-7.16.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:64f0611ee05364fc85cc3e5bc371804117a76fd337720e6017332fc7c534257a", size = 268948, upload-time = "2026-08-28T21:53:11.866Z" }, + { url = "https://files.pythonhosted.org/packages/8b/4e/fe73a5560f25fca52acda76fc1554f30de081793ae4de97e920f8ab161d7/coverage-7.16.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:050a291b3cfe5e0df5999ef2fa5a7aff6e2db329f069d47eb63f02bde2e7e96b", size = 264061, upload-time = "2026-08-28T21:53:13.996Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f7/bb78cc4b97085ebbd77fa18cbc25abfab462814efa3e2363b4e50885c775/coverage-7.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a336b1e2990a64f5c356a9b8380fb9c029d56c832b801255250c44d603271bfd", size = 266371, upload-time = "2026-08-28T21:53:16.233Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ec/84b4af5cd4ad498477b3bfb2217e47b048da919451053790efda66f7383c/coverage-7.16.0-cp314-cp314t-win32.whl", hash = "sha256:058631257350b31784ed43ceb808298b6f074edf4ebca4c7ce5082e6bf873a61", size = 225736, upload-time = "2026-08-28T21:53:18.632Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/50fc0e6c675c3ef14895a74bab2d6120cb5d6f4b562a3d3f5046797758dc/coverage-7.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:ed35097438dfa980c1ec75bc83edf8acbe7a374d7007e571957a257fbd0e2fb3", size = 226570, upload-time = "2026-08-28T21:53:20.754Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/9effce7bcd3c6eeb4da3561905837509e582dcdde7a7f07d6ef2c8512f76/coverage-7.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0466f4a5c0370461b7d8c7eb259d7d1db0b5756f13d66230b04d22a1d380ee11", size = 225879, upload-time = "2026-08-28T21:53:22.747Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2c/318e4379106bc8047ba235e3732ddc87d1b393ac3db9776f5405ff14f322/coverage-7.16.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:80d7d5d744a041f08637df743ac086204ec5acbcd8432a42b00b49e607358024", size = 223257, upload-time = "2026-08-28T21:53:25.376Z" }, + { url = "https://files.pythonhosted.org/packages/81/4d/a5c54d9144e9db6505749758ba50a28be624148873751728a59cbb72d27a/coverage-7.16.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:c5feffce90c3d602e149de1c477578efc34dee5f069f9764cc15808ce01ee15c", size = 223596, upload-time = "2026-08-28T21:53:27.461Z" }, + { url = "https://files.pythonhosted.org/packages/bc/97/38e93a10899c9315964c0a4e729b3e5867f8f46e977808f9c6fbda52525a/coverage-7.16.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:acadbf2f2a18d7f9c7f119ac798c00c540d7c79c93abd71ed648c87891303633", size = 254699, upload-time = "2026-08-28T21:53:29.715Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7a/acddda030b4630f68167f3daa94b41d22071847822a70d8178d43dcf678e/coverage-7.16.0-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4212cec9b42fd9929e70b462732fefd8b13406371871c82f3c14397499d6550b", size = 257614, upload-time = "2026-08-28T21:53:31.948Z" }, + { url = "https://files.pythonhosted.org/packages/15/7e/225b182497c1ce6d3f0d76a3074a4dbc9f272300e92bb100df53b03de0aa/coverage-7.16.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c5a43cc0ef101637ae920a9eed24cf0549ef815621eae68b3ad577ec5a7ad2f", size = 259236, upload-time = "2026-08-28T21:53:34.291Z" }, + { url = "https://files.pythonhosted.org/packages/2e/19/76641ddc50cb2410ebbd0ed7fe1052614d0e5612e802a2817521adb9febb/coverage-7.16.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c76a9b50a344261fe4a9bd20c322b48d3913cc48e8c37f78c21a596008296e68", size = 261433, upload-time = "2026-08-28T21:53:36.401Z" }, + { url = "https://files.pythonhosted.org/packages/12/9e/5f89de8b7c2017f36b68b4e4a25940723a748b21474820bf61e8bce0891c/coverage-7.16.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80cf547379ad6b1878fd03b033b51188beab4b41824c96e7839e014a4cb947be", size = 255182, upload-time = "2026-08-28T21:53:38.496Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c1/ce94b2ec502e79775efb5efa22c741ebb0bd2be10bdd29650825ff57bdcb/coverage-7.16.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:4b1d09cb5d8dc2c7164450f5217e6f0717497de9c588806a0780d352abef904a", size = 257329, upload-time = "2026-08-28T21:53:40.87Z" }, + { url = "https://files.pythonhosted.org/packages/86/8d/3f5374df3a6ca19ee5f98a6bd21dbb05f1e9d399bd9978e9821d260eab5e/coverage-7.16.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:cd1e85abed2d2499c16664137ac802356316f92b4e2bf3c150bdf0c45f5dd9ae", size = 255210, upload-time = "2026-08-28T21:53:43.393Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b8/1bc5751496d0be6fd9dde8ca547d9a8a9f07847856aba3f3ae5ac594cd81/coverage-7.16.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:360967a6fd77794c167529eec2d16ff8e38216110619d23acc3fd466a1648bee", size = 259442, upload-time = "2026-08-28T21:53:45.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/dc/8aca78e47e1e6fcc761cd28a20daf4a84bd847a7369e2701a93ccfc3d1fd/coverage-7.16.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:92cbc2bf4f7f67c79f1d3ca4fe8c50faddf48e852a3d07eaaf02dc014889832f", size = 254618, upload-time = "2026-08-28T21:53:48.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/fd/787842cdf6ce16ac5c1bd8a26549bab3b3f27b02500075bc540dc7853bca/coverage-7.16.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cce4dc8528453128c6fae523b15f3887fbea1d4d7c9eb9639d3d4fdcbe570c73", size = 256541, upload-time = "2026-08-28T21:53:50.805Z" }, + { url = "https://files.pythonhosted.org/packages/ef/79/8df302cbef373dd1f3401044cdb94dfc74517e5af2af27b4d0e721557e0e/coverage-7.16.0-cp315-cp315-win32.whl", hash = "sha256:5205baea687133613dced668a3d0168ea1479349615bfc255849a7944988c889", size = 225429, upload-time = "2026-08-28T21:53:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/85/87/5bad7ac45f76b3728ca211028ee561c2ede3ba44da401129e28bb8737291/coverage-7.16.0-cp315-cp315-win_amd64.whl", hash = "sha256:4fcb5f07a9b7083bfb715115d27ce263ba2b5b89dddeee536b295ba0e3c2c627", size = 225903, upload-time = "2026-08-28T21:53:55.535Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ea/67d84b11caf240f059ec313f616d82212df5004e8bc85802c1edfc50bb3d/coverage-7.16.0-cp315-cp315-win_arm64.whl", hash = "sha256:d568a8adcec0eda42ec23e5e65dfb8c184fc255120f9e99b484f7c869d923fb9", size = 225334, upload-time = "2026-08-28T21:53:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/65/21/a88349cce3ff720729b754916ac47e2e3646a8137552e4fa7cdd5967cc7f/coverage-7.16.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:3e8037e8213adf882e9d7eedd2c5c557933ab0b9632c42d98fe98ec9bcdb4025", size = 223980, upload-time = "2026-08-28T21:54:00.082Z" }, + { url = "https://files.pythonhosted.org/packages/fd/02/4d54abf3e6a4d8b7675921b20e91163b1064a5a9dbefebb71c05065dd136/coverage-7.16.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:289f2ed4d56eebf029b649e7dfc3c1153b111962a75e294cdd8e4a1598a04cc3", size = 224276, upload-time = "2026-08-28T21:54:02.381Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/10dbc96d95d20b9b041045d293480bd49e536180e93af62dd7662376284d/coverage-7.16.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b83f6ac575530783771c8dcf05284f7c8b5b12f1e7cb226d63445aac4497a3a", size = 265135, upload-time = "2026-08-28T21:54:04.558Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/6b326544afd1a8aef3a495bbae109a7ab5baf23e04a2741d8d64e2df2ba2/coverage-7.16.0-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c3ff6580f2dfc5bec34717b85b2e6cf5ec993b721e7bb58a794babd525a8178", size = 268216, upload-time = "2026-08-28T21:54:06.97Z" }, + { url = "https://files.pythonhosted.org/packages/54/34/1dc8265f3ed990690e24d5f31ff79bc9fb9b25d54f9f89bebad5a6a8b7a1/coverage-7.16.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507596cee23e9968b1934fe86d799b76166541af0a293930918b1b48a5c84bd2", size = 270772, upload-time = "2026-08-28T21:54:09.234Z" }, + { url = "https://files.pythonhosted.org/packages/66/a7/3a8463713a402b44044ec832f4a76e442ce4b3a207804303f4d1dc1a9bb4/coverage-7.16.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edc2be98e6c55ccc5ff7832bb64f023a4b03dba39dfa84b850046cf08a8249b0", size = 271752, upload-time = "2026-08-28T21:54:11.701Z" }, + { url = "https://files.pythonhosted.org/packages/25/3b/dd5e795cfbe1842f69899189089ae289a96d6a68de312960ea668542e33c/coverage-7.16.0-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9c0690994b84a15a53bdd39e0b2fdb539b22533820623eb86ba75b93760c645b", size = 265589, upload-time = "2026-08-28T21:54:14.12Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b6/fd90636cbd95cb018312f6ca1ca2bbd70fbe8e4ee6f3992fc36a4230364e/coverage-7.16.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:de24c62bf798940a14674a47489a81b79915ec4134f556d5199830e065225dd0", size = 268596, upload-time = "2026-08-28T21:54:16.303Z" }, + { url = "https://files.pythonhosted.org/packages/91/10/ef2d59264f3b3b358cc5885ca375e6cdbda7c195e78304d5aae800a72d9d/coverage-7.16.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:69474d81f198774c9d2937599ca5da04c9e1c5de5032da23c607ce4960ce360e", size = 265072, upload-time = "2026-08-28T21:54:18.597Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5b/400891c364c0170408d172501b340b18611800f4c42d8fbb16f9f5497c24/coverage-7.16.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:72a0795cc6d34acc2b03dfeabdc82b61b72087f2737018b56ac92c1cf5446c54", size = 269768, upload-time = "2026-08-28T21:54:20.985Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/9792c80271df04d287d21ed5d662fd8fa58b1737888d817679b1ce5d2fab/coverage-7.16.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:d9a218d3f9c7d6916684ed5ba94f620661117a730e733cd6ef5e87accc5872eb", size = 265211, upload-time = "2026-08-28T21:54:23.344Z" }, + { url = "https://files.pythonhosted.org/packages/81/67/5b8f827cfa6616e6bd7ba9397acfe7e3c4fd5b9fca4125511d5089f55d5a/coverage-7.16.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:49fa72ead28c8216f8916398a4f3c4669acb30a061822810ee20a727a1be2897", size = 267170, upload-time = "2026-08-28T21:54:25.85Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ee/c135d2d2cb617d744bc3e13c922f2fae66964494176ddef225dc4656bd2c/coverage-7.16.0-cp315-cp315t-win32.whl", hash = "sha256:27461af9f3ed7d2cf2411eb083784f87055ebf42211789ae3a216c48609bc743", size = 225731, upload-time = "2026-08-28T21:54:28.151Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4d/dc3d53eadf155916e183bf5dfacbfc4aa5bfb7f13b7da11c01caa7a05cbc/coverage-7.16.0-cp315-cp315t-win_amd64.whl", hash = "sha256:c5612cc20ca76abc883e50269af47c1494b42958bb63dbb9aa79729a1ab5f7d3", size = 226562, upload-time = "2026-08-28T21:54:30.42Z" }, + { url = "https://files.pythonhosted.org/packages/2f/00/ac9da1a60a4e84c3ad0f7db4723fd327154a8f9add210c0dcd2db3ec5156/coverage-7.16.0-cp315-cp315t-win_arm64.whl", hash = "sha256:2ddaa9e2af4760a329d80008b7a3b4762fbb0dbcb169199360f9a5179c32f2dc", size = 225872, upload-time = "2026-08-28T21:54:32.806Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5a/234e8fadf85c3cc48cb31c247b9e8e0c7f06ece80f5b29f9b8c241f9da4c/coverage-7.16.0-py3-none-any.whl", hash = "sha256:245f7de6d023a5bba375dbec9f2e0869bfa26ac0cc639bbb7b4c814884000b73", size = 214977, upload-time = "2026-08-28T21:54:35.189Z" }, ] [[package]] name = "cssselect2" -version = "0.8.0" +version = "0.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tinycss2" }, { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/00/2456b6b664c7a770989cbe3c352aac4eb962c938486f03a2e1255ae963c6/cssselect2-0.10.1.tar.gz", hash = "sha256:83b0d820ef589dabaf693289b647c2f5b410f76d285f56deba911ffa75a7b9d1", size = 35653, upload-time = "2026-08-31T21:57:42.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" }, + { url = "https://files.pythonhosted.org/packages/bd/59/6b1daa3b94de8970e2a2787ba73616c2d0675d2f948ef4cad8bef7f21bc6/cssselect2-0.10.1-py3-none-any.whl", hash = "sha256:25cc4494d55985d6a6da359be48da6ce98c28dcbafa2314c383ace3fc32ec868", size = 15489, upload-time = "2026-08-31T21:57:41.162Z" }, ] [[package]] @@ -366,22 +612,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] -[[package]] -name = "diskcache" -version = "5.6.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload-time = "2023-08-31T06:12:00.316Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload-time = "2023-08-31T06:11:58.822Z" }, -] - [[package]] name = "distlib" -version = "0.4.0" +version = "0.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, ] [[package]] @@ -395,20 +632,20 @@ wheels = [ [[package]] name = "execnet" -version = "2.1.1" +version = "2.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload-time = "2024-04-08T09:04:19.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" }, + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, ] [[package]] name = "filelock" -version = "3.19.1" +version = "3.32.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/a0/50c2c0ce5e74d7721bbb1b19a26ebd339aac5878553a6e35308c2f31f935/filelock-3.32.5.tar.gz", hash = "sha256:f6a6a28f743f9b95ce19db5abe0f376f75eb56517dff21e1a4751e2657d3e83d", size = 222838, upload-time = "2026-08-31T18:56:34.729Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, + { url = "https://files.pythonhosted.org/packages/36/d2/b70a31e13d04456d28493f31d2aa087e99eeb2767ef0293b2625727ccb8c/filelock-3.32.5-py3-none-any.whl", hash = "sha256:142cd9fa77a872c5e78c62329a0d15278fadc686eb89e760017968961a4fd6b2", size = 100003, upload-time = "2026-08-31T18:56:33.078Z" }, ] [[package]] @@ -437,7 +674,7 @@ wheels = [ [[package]] name = "frictionless" -version = "5.18.1" +version = "5.19.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -460,20 +697,18 @@ dependencies = [ { name = "typing-extensions" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/d0/c94675a1c1b8c12fd68489e2b4a924f80a2b122199cd986c58a5136197d2/frictionless-5.18.1.tar.gz", hash = "sha256:daeaf55f896eeb52b43e62600466af9528fe0aeeebd28b1b917e13322f370a8b", size = 74372478, upload-time = "2025-03-25T21:32:50.081Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/21/3494557b8c72b8375597cdd5b85d46c76eb978994c2f34f5737262047438/frictionless-5.19.0.tar.gz", hash = "sha256:75a060c8806c4a84dd72112ceeb919277d84982b07420295b9b920e8e30a65ab", size = 74375968, upload-time = "2026-04-13T13:05:53.293Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/7a/dac76d31584bb4f874ae860490c9465f5b59bd8c110f68fbbb07aba48845/frictionless-5.18.1-py3-none-any.whl", hash = "sha256:3f4c87469a89bdb88e9cc318088553a26f3d14839098f95c183ea01fc89628dd", size = 531615, upload-time = "2025-03-25T21:32:45.534Z" }, + { url = "https://files.pythonhosted.org/packages/1b/3a/e568ea129fbcf9ee0f148178c67f8a2fc4e88de3aa34c840a180bcce4775/frictionless-5.19.0-py3-none-any.whl", hash = "sha256:81436b94a950b1a5cf83e953921e64dc888c00f51400f783ea0aa824319a6d67", size = 535173, upload-time = "2026-04-13T13:05:50.897Z" }, ] [[package]] name = "frozendict" -version = "2.4.6" +version = "2.4.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e", size = 316416, upload-time = "2024-10-13T12:15:32.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/b2/2a3d1374b7780999d3184e171e25439a8358c47b481f68be883c14086b4c/frozendict-2.4.7.tar.gz", hash = "sha256:e478fb2a1391a56c8a6e10cc97c4a9002b410ecd1ac28c18d780661762e271bd", size = 317082, upload-time = "2025-11-11T22:40:14.251Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea", size = 16148, upload-time = "2024-10-13T12:15:26.839Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9", size = 16146, upload-time = "2024-10-13T12:15:28.16Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757", size = 16146, upload-time = "2024-10-13T12:15:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/38/74/f94141b38a51a553efef7f510fc213894161ae49b88bffd037f8d2a7cb2f/frozendict-2.4.7-py3-none-any.whl", hash = "sha256:972af65924ea25cf5b4d9326d549e69a9a4918d8a76a9d3a7cd174d98b237550", size = 16264, upload-time = "2025-11-11T22:40:12.836Z" }, ] [[package]] @@ -502,45 +737,41 @@ wheels = [ [[package]] name = "gitpython" -version = "3.1.45" +version = "3.1.61" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/61/3285044215fb596bf093e39ccb96ece0a1076a8ca57a61e069a6a33cdb1b/gitpython-3.1.61.tar.gz", hash = "sha256:f51c24d8c0f733a195447385f5774a5dfe8767f5acfd7994a33755644c6ecc95", size = 231680, upload-time = "2026-08-28T11:01:13.761Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/49cc172da4d0578644ba37cec5cb365b1fefc603b26edea9bcac1c7f830a/gitpython-3.1.61-py3-none-any.whl", hash = "sha256:8ab28c9da863cdd9e7d7694ec46cf3e6c9a12d8a30a1acd3447aec11975d530c", size = 222118, upload-time = "2026-08-28T11:01:12.262Z" }, ] [[package]] -name = "griffe" -version = "1.14.0" +name = "griffelib" +version = "2.2.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload-time = "2025-09-05T15:02:29.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/b4/a767e91c606deefc447a96eaf59edd77397960b1d677dffd833ee8449831/griffelib-2.2.0.tar.gz", hash = "sha256:e1bc36fe9cd21d4b6b659b456346755e4cfdc5676c0a5214083126ee12612b3c", size = 227048, upload-time = "2026-08-16T14:04:58.383Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload-time = "2025-09-05T15:02:27.511Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b6/f65ac785d4ac90dcf7c831ac6256f5dd4a19780f4e1575b2c0d6eeebe319/griffelib-2.2.0-py3-none-any.whl", hash = "sha256:d71c3bc2bbed9f958488634fe788b843a9f705d6d2838ca32cd6c25eeb64dfc4", size = 166779, upload-time = "2026-08-16T14:04:54.365Z" }, ] [[package]] name = "hdx-python-country" -version = "3.9.8" +version = "4.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hdx-python-utilities" }, - { name = "libhxl" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/5621c48b79a510a87288495f4bdde38a292f0f97dd14177e2cc77c8a79bb/hdx_python_country-3.9.8.tar.gz", hash = "sha256:de9d928e490490fe6fa2d743597464fa8bae317f808667a947e734c1ea26e4d9", size = 531031, upload-time = "2025-09-21T23:42:45.054Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/72/5b8ddb48debb4a63907075dbd7af0f0bc5c2211dbd703d8e15205d917cc5/hdx_python_country-4.1.4.tar.gz", hash = "sha256:54e911aaed7ff406cdca5119ca00015c7aa8f332cb7cde9015e8f7199d9387f0", size = 540576, upload-time = "2026-08-05T18:15:45.761Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/8f/7d961e17372bb9df875e988432a2abb9ca4883b4a0592dfccefa50cb697f/hdx_python_country-3.9.8-py3-none-any.whl", hash = "sha256:602e495028e474e2f93094136007b2c0e765d88af55b2cae7e0ba778e178bcaf", size = 56383, upload-time = "2025-09-21T23:42:43.267Z" }, + { url = "https://files.pythonhosted.org/packages/2e/6a/bbac937933ecdfcb2850a75d3510a6f522d5fa189a861c07765e9f7cf7cb/hdx_python_country-4.1.4-py3-none-any.whl", hash = "sha256:77a0557325c4513b3ca943be87d73932c1bd6a6adb0d2495792dcd7910add45c", size = 56900, upload-time = "2026-08-05T18:15:44.441Z" }, ] [[package]] name = "hdx-python-utilities" -version = "3.9.2" +version = "4.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frictionless" }, @@ -554,106 +785,170 @@ dependencies = [ { name = "requests-file" }, { name = "ruamel-yaml" }, { name = "tableschema-to-template" }, + { name = "typing-extensions" }, { name = "xlrd" }, { name = "xlsx2csv" }, { name = "xlwt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/13/f22d36f9146beaefe27b1a888acd31ddd09c1a9730ed1d42df9af33f99e2/hdx_python_utilities-3.9.2.tar.gz", hash = "sha256:de39248afdca00ab636fdfa0c3259fa80e4b95dba026170a4efc5bee14eda3f3", size = 656826, upload-time = "2025-09-21T23:14:17.457Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/96/7a6ba9ed08a8c9439d2875fa37e8e4303c8f17c7d8b4a6f41b50b2341d8c/hdx_python_utilities-4.1.2.tar.gz", hash = "sha256:f054b267251686478ac76b2551e047211fd78bed61886de38c8217c365a860b3", size = 2112376, upload-time = "2026-06-16T03:48:33.559Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/6d/06994f86c2cc172b5ea127dedbb19e809205e06b1ba7532e2f0aea5631cd/hdx_python_utilities-3.9.2-py3-none-any.whl", hash = "sha256:fae3cc241420ae7ebb0a7a53cc8034c6851886396b2f0880685aba9045973111", size = 61187, upload-time = "2025-09-21T23:14:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/b5/97/752da03ba533e64f889c819b17f1054f82af32e0c20e3afdf43a62a73626/hdx_python_utilities-4.1.2-py3-none-any.whl", hash = "sha256:31200985910953354d7c44ca5795184534463f783b01c13868d15594f7ab4828", size = 65121, upload-time = "2026-06-16T03:48:31.908Z" }, ] [[package]] name = "humanize" -version = "4.13.0" +version = "4.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884, upload-time = "2025-08-25T09:39:20.04Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/ea/13a1ef3c12d12662905801495283530251918b70d62d368f1d2e0272c70d/humanize-4.16.0.tar.gz", hash = "sha256:7dc2244a2f84a4bfb1d36c37bac80cd78e35cdc5c119206d87b018e1445f3a3f", size = 89515, upload-time = "2026-06-30T16:17:29.859Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869, upload-time = "2025-08-25T09:39:18.54Z" }, + { url = "https://files.pythonhosted.org/packages/b0/aa/0b7365d30fed43e7a3449aba1fe20a0a7174d9cf13e282af4e69ac825441/humanize-4.16.0-py3-none-any.whl", hash = "sha256:353eb2f34c09d098b2880eee8bef21832eae6d174f48c5762fff7e5fcb74d01d", size = 137209, upload-time = "2026-06-30T16:17:28.36Z" }, ] [[package]] name = "identify" -version = "2.6.14" +version = "2.6.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload-time = "2025-09-06T19:30:52.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload-time = "2025-09-06T19:30:51.759Z" }, + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, ] [[package]] name = "idna" -version = "3.10" +version = "3.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, ] [[package]] name = "ijson" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/4f/1cfeada63f5fce87536651268ddf5cca79b8b4bbb457aee4e45777964a0a/ijson-3.4.0.tar.gz", hash = "sha256:5f74dcbad9d592c428d3ca3957f7115a42689ee7ee941458860900236ae9bb13", size = 65782, upload-time = "2025-05-08T02:37:20.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ec/317ee5b2d13e50448833ead3aa906659a32b376191f6abc2a7c6112d2b27/ijson-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:956b148f88259a80a9027ffbe2d91705fae0c004fbfba3e5a24028fbe72311a9", size = 87212, upload-time = "2025-05-08T02:35:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/f8/43/b06c96ced30cacecc5d518f89b0fd1c98c294a30ff88848b70ed7b7f72a1/ijson-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b89960f5c721106394c7fba5760b3f67c515b8eb7d80f612388f5eca2f4621", size = 59175, upload-time = "2025-05-08T02:35:52.988Z" }, - { url = "https://files.pythonhosted.org/packages/e9/df/b4aeafb7ecde463130840ee9be36130823ec94a00525049bf700883378b8/ijson-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a0bb591cf250dd7e9dfab69d634745a7f3272d31cfe879f9156e0a081fd97ee", size = 59011, upload-time = "2025-05-08T02:35:54.394Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/a80b8e361641609507f62022089626d4b8067f0826f51e1c09e4ba86eba8/ijson-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e92de999977f4c6b660ffcf2b8d59604ccd531edcbfde05b642baf283e0de8", size = 146094, upload-time = "2025-05-08T02:35:55.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/fa416347b9a802e3646c6ff377fc3278bd7d6106e17beb339514b6a3184e/ijson-3.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e9602157a5b869d44b6896e64f502c712a312fcde044c2e586fccb85d3e316e", size = 137903, upload-time = "2025-05-08T02:35:56.814Z" }, - { url = "https://files.pythonhosted.org/packages/24/c6/41a9ad4d42df50ff6e70fdce79b034f09b914802737ebbdc141153d8d791/ijson-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e83660edb931a425b7ff662eb49db1f10d30ca6d4d350e5630edbed098bc01", size = 148339, upload-time = "2025-05-08T02:35:58.595Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/7d01efda415b8502dce67e067ed9e8a124f53e763002c02207e542e1a2f1/ijson-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:49bf8eac1c7b7913073865a859c215488461f7591b4fa6a33c14b51cb73659d0", size = 149383, upload-time = "2025-05-08T02:36:00.197Z" }, - { url = "https://files.pythonhosted.org/packages/95/6c/0d67024b9ecb57916c5e5ab0350251c9fe2f86dc9c8ca2b605c194bdad6a/ijson-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:160b09273cb42019f1811469508b0a057d19f26434d44752bde6f281da6d3f32", size = 141580, upload-time = "2025-05-08T02:36:01.998Z" }, - { url = "https://files.pythonhosted.org/packages/06/43/e10edcc1c6a3b619294de835e7678bfb3a1b8a75955f3689fd66a1e9e7b4/ijson-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2019ff4e6f354aa00c76c8591bd450899111c61f2354ad55cc127e2ce2492c44", size = 150280, upload-time = "2025-05-08T02:36:03.926Z" }, - { url = "https://files.pythonhosted.org/packages/07/84/1cbeee8e8190a1ebe6926569a92cf1fa80ddb380c129beb6f86559e1bb24/ijson-3.4.0-cp312-cp312-win32.whl", hash = "sha256:931c007bf6bb8330705429989b2deed6838c22b63358a330bf362b6e458ba0bf", size = 51512, upload-time = "2025-05-08T02:36:05.595Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/530802bc391c95be6fe9f96e9aa427d94067e7c0b7da7a9092344dc44c4b/ijson-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:71523f2b64cb856a820223e94d23e88369f193017ecc789bb4de198cc9d349eb", size = 54081, upload-time = "2025-05-08T02:36:07.099Z" }, - { url = "https://files.pythonhosted.org/packages/77/b3/b1d2eb2745e5204ec7a25365a6deb7868576214feb5e109bce368fb692c9/ijson-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d96f88d75196a61c9d9443de2b72c2d4a7ba9456ff117b57ae3bba23a54256", size = 87216, upload-time = "2025-05-08T02:36:08.414Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cd/cd6d340087617f8cc9bedbb21d974542fe2f160ed0126b8288d3499a469b/ijson-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c45906ce2c1d3b62f15645476fc3a6ca279549127f01662a39ca5ed334a00cf9", size = 59170, upload-time = "2025-05-08T02:36:09.604Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/32d3a9903b488d3306e3c8288f6ee4217d2eea82728261db03a1045eb5d1/ijson-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4ab4bc2119b35c4363ea49f29563612237cae9413d2fbe54b223be098b97bc9e", size = 59013, upload-time = "2025-05-08T02:36:10.696Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c8/db15465ab4b0b477cee5964c8bfc94bf8c45af8e27a23e1ad78d1926e587/ijson-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b0a9b5a15e61dfb1f14921ea4e0dba39f3a650df6d8f444ddbc2b19b479ff1", size = 146564, upload-time = "2025-05-08T02:36:11.916Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d8/0755545bc122473a9a434ab90e0f378780e603d75495b1ca3872de757873/ijson-3.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3047bb994dabedf11de11076ed1147a307924b6e5e2df6784fb2599c4ad8c60", size = 137917, upload-time = "2025-05-08T02:36:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c6/aeb89c8939ebe3f534af26c8c88000c5e870dbb6ae33644c21a4531f87d2/ijson-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68c83161b052e9f5dc8191acbc862bb1e63f8a35344cb5cd0db1afd3afd487a6", size = 148897, upload-time = "2025-05-08T02:36:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/be/0e/7ef6e9b372106f2682a4a32b3c65bf86bb471a1670e4dac242faee4a7d3f/ijson-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1eebd9b6c20eb1dffde0ae1f0fbb4aeacec2eb7b89adb5c7c0449fc9fd742760", size = 149711, upload-time = "2025-05-08T02:36:16.476Z" }, - { url = "https://files.pythonhosted.org/packages/d1/5d/9841c3ed75bcdabf19b3202de5f862a9c9c86ce5c7c9d95fa32347fdbf5f/ijson-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13fb6d5c35192c541421f3ee81239d91fc15a8d8f26c869250f941f4b346a86c", size = 141691, upload-time = "2025-05-08T02:36:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d2/ce74e17218dba292e9be10a44ed0c75439f7958cdd263adb0b5b92d012d5/ijson-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:28b7196ff7b37c4897c547a28fa4876919696739fc91c1f347651c9736877c69", size = 150738, upload-time = "2025-05-08T02:36:19.483Z" }, - { url = "https://files.pythonhosted.org/packages/4e/43/dcc480f94453b1075c9911d4755b823f3ace275761bb37b40139f22109ca/ijson-3.4.0-cp313-cp313-win32.whl", hash = "sha256:3c2691d2da42629522140f77b99587d6f5010440d58d36616f33bc7bdc830cc3", size = 51512, upload-time = "2025-05-08T02:36:20.99Z" }, - { url = "https://files.pythonhosted.org/packages/35/dd/d8c5f15efd85ba51e6e11451ebe23d779361a9ec0d192064c2a8c3cdfcb8/ijson-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:c4554718c275a044c47eb3874f78f2c939f300215d9031e785a6711cc51b83fc", size = 54074, upload-time = "2025-05-08T02:36:22.075Z" }, - { url = "https://files.pythonhosted.org/packages/79/73/24ad8cd106203419c4d22bed627e02e281d66b83e91bc206a371893d0486/ijson-3.4.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:915a65e3f3c0eee2ea937bc62aaedb6c14cc1e8f0bb9f3f4fb5a9e2bbfa4b480", size = 91694, upload-time = "2025-05-08T02:36:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/17/2d/f7f680984bcb7324a46a4c2df3bd73cf70faef0acfeb85a3f811abdfd590/ijson-3.4.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:afbe9748707684b6c5adc295c4fdcf27765b300aec4d484e14a13dca4e5c0afa", size = 61390, upload-time = "2025-05-08T02:36:24.42Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/f3ca7bab86f95bdb82494739e71d271410dfefce4590785d511669127145/ijson-3.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d823f8f321b4d8d5fa020d0a84f089fec5d52b7c0762430476d9f8bf95bbc1a9", size = 61140, upload-time = "2025-05-08T02:36:26.708Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/dd340df3d4fc7771c95df29997956b92ed0570fe7b616d1792fea9ad93f2/ijson-3.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0a2c54f3becf76881188beefd98b484b1d3bd005769a740d5b433b089fa23", size = 214739, upload-time = "2025-05-08T02:36:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/85380b7f51d1f5fb7065d76a7b623e02feca920cc678d329b2eccc0011e0/ijson-3.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ced19a83ab09afa16257a0b15bc1aa888dbc555cb754be09d375c7f8d41051f2", size = 198338, upload-time = "2025-05-08T02:36:29.496Z" }, - { url = "https://files.pythonhosted.org/packages/a5/cd/313264cf2ec42e0f01d198c49deb7b6fadeb793b3685e20e738eb6b3fa13/ijson-3.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8100f9885eff1f38d35cef80ef759a1bbf5fc946349afa681bd7d0e681b7f1a0", size = 207515, upload-time = "2025-05-08T02:36:30.981Z" }, - { url = "https://files.pythonhosted.org/packages/12/94/bf14457aa87ea32641f2db577c9188ef4e4ae373478afef422b31fc7f309/ijson-3.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d7bcc3f7f21b0f703031ecd15209b1284ea51b2a329d66074b5261de3916c1eb", size = 210081, upload-time = "2025-05-08T02:36:32.403Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b4/eaee39e290e40e52d665db9bd1492cfdce86bd1e47948e0440db209c6023/ijson-3.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2dcb190227b09dd171bdcbfe4720fddd574933c66314818dfb3960c8a6246a77", size = 199253, upload-time = "2025-05-08T02:36:33.861Z" }, - { url = "https://files.pythonhosted.org/packages/c5/9c/e09c7b9ac720a703ab115b221b819f149ed54c974edfff623c1e925e57da/ijson-3.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:eda4cfb1d49c6073a901735aaa62e39cb7ab47f3ad7bb184862562f776f1fa8a", size = 203816, upload-time = "2025-05-08T02:36:35.348Z" }, - { url = "https://files.pythonhosted.org/packages/7c/14/acd304f412e32d16a2c12182b9d78206bb0ae35354d35664f45db05c1b3b/ijson-3.4.0-cp313-cp313t-win32.whl", hash = "sha256:0772638efa1f3b72b51736833404f1cbd2f5beeb9c1a3d392e7d385b9160cba7", size = 53760, upload-time = "2025-05-08T02:36:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/2f/24/93dd0a467191590a5ed1fc2b35842bca9d09900d001e00b0b497c0208ef6/ijson-3.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3d8a0d67f36e4fb97c61a724456ef0791504b16ce6f74917a31c2e92309bbeb9", size = 56948, upload-time = "2025-05-08T02:36:37.849Z" }, +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/06/b31f040a8764336a11152e474a7abcb3782fedb0d1cdf78f442b82878c56/ijson-3.5.1.tar.gz", hash = "sha256:af40bd1a85f55db0b8b30715c858761306bd92d5590148636f75c3309e6e76bd", size = 69913, upload-time = "2026-07-06T17:37:42.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/6e/f3ded1ebb85ccc89a30f7b10a0076f30db70ae1d1e0b6423ff93c57b7539/ijson-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ee60c7741012671867678eae71c51872cac938b76f3d4ca40a778e6c361774d2", size = 88643, upload-time = "2026-07-06T17:36:28.529Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f2/18f14a1d79ef4898e746b4f50dcdbe60abab317cc2bd8390f043b9553c4e/ijson-3.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:11c1d7d36a13054b5872ecd5d745dc4009d9abdbcba2312de69e66c2f92a46d2", size = 60611, upload-time = "2026-07-06T17:36:29.597Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/6e3e591324fd4c7a7a9e1bc23548bacbd84c0d91766b71f09f13e945e7e9/ijson-3.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9517efbe6604bce16f3e50d49b0cd1bdc58917f98cf2eab026599c5c0422991", size = 60447, upload-time = "2026-07-06T17:36:30.747Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a5/9af7be670381ddac26dd55107ed0110b50f5161673b053311db67f510dcc/ijson-3.5.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ea4fd7bec203a600b1cc88a492dfe6b75ce4b1b87488a66adcd5406022213f64", size = 139092, upload-time = "2026-07-06T17:36:31.749Z" }, + { url = "https://files.pythonhosted.org/packages/41/fb/f9c1664d75467453e6bd4e5f9cd2211b730b09e049445ab64cbac68cc6a3/ijson-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350caea815e53151994b597abc80cf669454276b5ac6aadcec69ef6d48f7e90b", size = 149921, upload-time = "2026-07-06T17:36:32.912Z" }, + { url = "https://files.pythonhosted.org/packages/43/80/d20b1c49c4aa7cc6644131e2e57192b45346ef4816566ed1cd9fd05bae38/ijson-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e4fcebfe1685bb7ba06a8255a5d428ea6b4b895d7acf979cb637d8bbc9db2f47", size = 149848, upload-time = "2026-07-06T17:36:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/fd/fc/5baa710869f5ab939e6233583ced1546889b55c35f35b844c518ac10abc3/ijson-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d78f362f51c8691798758a9e6ac3c9d385ee1228cb82987c91562a2fae235cd3", size = 150810, upload-time = "2026-07-06T17:36:35.19Z" }, + { url = "https://files.pythonhosted.org/packages/54/16/a12b3d987a5c1677b04557c6f9b9feb7e04b7d4171e9a344856cb9136e9b/ijson-3.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0b184180d45f85fd4479659582749b109e49f4a29c21ac700ccc9c2280fe015e", size = 142989, upload-time = "2026-07-06T17:36:36.23Z" }, + { url = "https://files.pythonhosted.org/packages/ed/63/1026c535671fc334fc85aeb78f0945c825e7a338575edc753c0f455459ae/ijson-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e353891d33a2e6aa5caf72c2a5fbadd7a46f5f9b32dcfd0c84113b2444c255b8", size = 151702, upload-time = "2026-07-06T17:36:37.296Z" }, + { url = "https://files.pythonhosted.org/packages/cb/af/b58aa3a2bf4d31c388ea78b49826605f60932891ce97e404d196766b4ea3/ijson-3.5.1-cp312-cp312-win32.whl", hash = "sha256:936f28671f018f8ac4d3f003ae9fa01d0467ab4ef4cfd0c97f23beda485b61c6", size = 52613, upload-time = "2026-07-06T17:36:38.345Z" }, + { url = "https://files.pythonhosted.org/packages/04/66/ce70a92949c2a753dad91fdd5761dc14f3a44517e80cfc3c26612982ed61/ijson-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:322c783f3ee0c6b383bbd4db88370b10172168808cc2a0bf811f1253f7435602", size = 54729, upload-time = "2026-07-06T17:36:39.337Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/e17784240c9cf1d58de2f2853ebaf9cc54f6bce117a1f12a6150bbb4a5aa/ijson-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:e2ac204b59f09e38e16d277f906240e9fd38780e42076599419265af183dc4b4", size = 53714, upload-time = "2026-07-06T17:36:40.308Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c0/5384ccf4fc497ae3dc79a5a28561b05518b503ade29daf3898168d640406/ijson-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3c0556d628443d3e871f414855313b2ae6cd9faa0104de3316bd8db03aab1589", size = 88652, upload-time = "2026-07-06T17:36:41.278Z" }, + { url = "https://files.pythonhosted.org/packages/8e/42/58769b8b6d614adb15c2c938c77bcdbfadfba8b1d21a98b5b09cb8961adc/ijson-3.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12aa7fcf46f0fdc8e9e7cf37541e1dc20ac3f9243a23f4d346ab5395f72b0fe2", size = 60607, upload-time = "2026-07-06T17:36:42.697Z" }, + { url = "https://files.pythonhosted.org/packages/db/4a/8322c2824c24184880587bbca45531127a21a4b3bfc897f13427fea02424/ijson-3.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a96066d8c12a18ce2fa90579f2bbf991377cb71725874932e4a5d855226c162a", size = 60447, upload-time = "2026-07-06T17:36:43.791Z" }, + { url = "https://files.pythonhosted.org/packages/f4/43/7bdca8f733c45ce97f61a64fadd3e51d255c4c9b467345cbf71ccc7bb368/ijson-3.5.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a19413a092d458a57aaa574fec08e265851d3b5c6e018377f426cd5e70b91280", size = 138889, upload-time = "2026-07-06T17:36:45.081Z" }, + { url = "https://files.pythonhosted.org/packages/e7/dc/e8a2e63700ab1d63aaf3fa38c454f8178eaa5b80a6d7c019d1d61b490a6c/ijson-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65974568748678165d7e90e3e7ce2f7c233cfe4de6c37fbb0760941c97e14632", size = 149933, upload-time = "2026-07-06T17:36:46.312Z" }, + { url = "https://files.pythonhosted.org/packages/d9/56/640a4d980f7f2c11e399a7fd5ccb9e3d3c9e1dec3a1d5a10024570697c25/ijson-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bad5d55c99c89de8cd0a4cded51f86427ba3353c4dccca37ec2e32e06f26b437", size = 149857, upload-time = "2026-07-06T17:36:47.309Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a1/c953e22c83992b69ae538a83b3678d28768f1a48042fc7794733423a5ce7/ijson-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1a38d503ce343952e88edfd9a27296a4ec96af7073a9db58b3df6233367f75fc", size = 151141, upload-time = "2026-07-06T17:36:48.405Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ab/8fe5b7269b140e6e5f8837a33ce980fd9b67c70d0f8114289ed1cea4dace/ijson-3.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2f41982c73896acab4a2a14faa14e152e444bd69f37c3139204429fd3fe65a10", size = 143112, upload-time = "2026-07-06T17:36:50.353Z" }, + { url = "https://files.pythonhosted.org/packages/78/f3/23d1284edcde50ba337ddfba5b5d59f8273084d98b28af94715e73dd2b64/ijson-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3321fede2b638d400de0036889a3a25c3bb689feb8df45e70a393346aad6194f", size = 152184, upload-time = "2026-07-06T17:36:51.536Z" }, + { url = "https://files.pythonhosted.org/packages/82/4e/df61be89dd295e4da722ec96ba03b1765bcb2becdaaaede9c96a7d2365b6/ijson-3.5.1-cp313-cp313-win32.whl", hash = "sha256:af6ddbd10ac9bce87a835f2de3ec61455ec435c54e7e0ba7b17c31c66de6f164", size = 52607, upload-time = "2026-07-06T17:36:52.596Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d9/03e5dbd3ef7e0cee06fbef0f87b91d7ce1c07fae9b5a1b0ca8b895de62c4/ijson-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:1de3de278b0ffb40338374ad2a730e1c56f933e0706b1815ebeb07b82239b1a3", size = 54730, upload-time = "2026-07-06T17:36:53.526Z" }, + { url = "https://files.pythonhosted.org/packages/38/30/4f37076c88a96a1a5e44df38b59fade4f59eaef87ef8b5162d55b2d426d5/ijson-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:c8a36a19b92cb7172c6448ab94f446033cfa3129dc4894aebe205f96b3fabf42", size = 53719, upload-time = "2026-07-06T17:36:54.592Z" }, + { url = "https://files.pythonhosted.org/packages/f9/17/54f9180c0da9a9e96e5b3791bc74093f029a2344678b4da218c2699465bf/ijson-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21e1a250b254edba2f0dd7272a4c56f0a879aabe328d9e306dd1fc115f560e74", size = 89223, upload-time = "2026-07-06T17:36:55.534Z" }, + { url = "https://files.pythonhosted.org/packages/09/70/0ee0d2627c534174455a745ca25284797e71b0d6e2b2a1b31cc914e7b462/ijson-3.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e01f95433725e2df62d682ff88e4a57bb694385ff2362bc364adec961167ae04", size = 60831, upload-time = "2026-07-06T17:36:56.554Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e6/56f64ba7a3e7a25d9a9fbbeb4c30597d6b76c1094cc2041d11a3224b562c/ijson-3.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:539e8d6cca079bcbb68c390e55148f908e0a943a34f7dd321248637c6272adca", size = 60752, upload-time = "2026-07-06T17:36:57.826Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/5a55db881f1b043cd6d5716578937a60ac16348be1a3afbf846b21cf4b44/ijson-3.5.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:32f64051be2f990d8ae7b614b5abdf4a7bead510ce3666568d7403c6c46ce4d8", size = 140783, upload-time = "2026-07-06T17:36:58.984Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/f7783cc18672dc31544141139efd187fb34795d24e573fed6abea6b776c7/ijson-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd0dfc5a788d0b0c2f1eab258b9dabdeefc631ca8ef87644a999f633b0b2555a", size = 149976, upload-time = "2026-07-06T17:37:00.235Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d6/4182dd63b6b70eae4f5208c53558a050895a40734dff283463033c153742/ijson-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42bfda7858d99ee9777ec28cb6d347928249eefeb577f9b0a67503c18f7ebb6a", size = 149317, upload-time = "2026-07-06T17:37:01.476Z" }, + { url = "https://files.pythonhosted.org/packages/01/b1/a675e4a9b428a0ef556e7d718bf0e6885e3e5543042248a1a7030899a3d4/ijson-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c4b9a28e9719d1aebebe93ad8dc2ba87f4e2d9035043b196c1c07ef8530b44cc", size = 150555, upload-time = "2026-07-06T17:37:02.676Z" }, + { url = "https://files.pythonhosted.org/packages/b5/69/52686f56b44af63a93c3dc3f5bcfa07f87427d9aea4d2cbe3e1c94188c74/ijson-3.5.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9a0b25c750a6bde14a0b31f1dcbfc86368e50767e3eaa73bb138e54128055edd", size = 144485, upload-time = "2026-07-06T17:37:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/f0/46/10554e817dde56300a8414e52c0f5a44a29f3440327cd6d829ece57759b3/ijson-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bd756f7b22df745ac14b7bc2ab9ed7c190a222e4c8e1bef26ef1162af8e54d0f", size = 151470, upload-time = "2026-07-06T17:37:04.901Z" }, + { url = "https://files.pythonhosted.org/packages/91/82/f37cbb110b48abdb623d169d0e196f2f6e064e2c20fa789ecde6e69b0440/ijson-3.5.1-cp314-cp314-win32.whl", hash = "sha256:e035cdfb2a1446b13881f0dfc0eecd1541cbb17a27a938ded2160ae6ce25051b", size = 53219, upload-time = "2026-07-06T17:37:06.254Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/792df8f001c246c8ff28f860de81d35ea0d797c0d3276c22a2af83089656/ijson-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:eeb2fb2daa5dd30326f93db465d0855b34aa6b1f52a7c0ff94522aec5ad57dfb", size = 55485, upload-time = "2026-07-06T17:37:07.242Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3c/db3ccc22c09ed4738787e8d82fff76101aa81ec8de7eaf6572e065e012d3/ijson-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:a96ab35d7ce2129dfde49c4c807596443410e260d7f7a4ca8fe4d0035553b589", size = 54390, upload-time = "2026-07-06T17:37:08.497Z" }, + { url = "https://files.pythonhosted.org/packages/26/59/eefa5d9488250c03f24152576804205ae40e29cac0dc65cbbc5f3d422008/ijson-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:77b68e91f95fb16ac2e7819903cd545db6cffa308c28833cc34911e6b21e91dd", size = 93177, upload-time = "2026-07-06T17:37:09.71Z" }, + { url = "https://files.pythonhosted.org/packages/88/db/6329eb7bb9f1906c1906fc10e7074b8f08bf39b7d50baa58f1b597d48898/ijson-3.5.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:94a95065b1ac67602af0cec852b07505abc37b77e3774d1c801d935d05e48f82", size = 62891, upload-time = "2026-07-06T17:37:10.735Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d0/b3beddb96eef0b20bb9902c36e4de30f145be06d7e5e1d780e1a1689d0ce/ijson-3.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b70b5da6b0571da8f601a437c4fba2d35bc27739637d85f3acdc8f88916ce68e", size = 62575, upload-time = "2026-07-06T17:37:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/5b/01/95f3a7c27d25bb917954ef0c8e86d0e60f585b9db675cbd05d355f54cce8/ijson-3.5.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0ade373dd765b057b1dec05d7711bfeb5a36f1e825259466d9f545cfd8ef3ba3", size = 200568, upload-time = "2026-07-06T17:37:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/77/61/c94ee4ea1f22318aab9a49b35d0ce8ac87dd24d508ea4c77dcbde362ba5e/ijson-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:882bc0bdd25d41eae90a15695cd50707edde0978b8b72a2532e30442dd8fd04c", size = 217956, upload-time = "2026-07-06T17:37:14.041Z" }, + { url = "https://files.pythonhosted.org/packages/1a/82/43e8d225aea5ee00eef7998c8ce41f344f7ba451329dfa9e92f4700813af/ijson-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:451901c36e12fa87cbb1cafe661bd25c08c6bd7900cc738279614f71cea07048", size = 208403, upload-time = "2026-07-06T17:37:15.201Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6f/375f67fad76677aca9bc0817b2b18fdd231d309fe24e26b19a5556ef6cdd/ijson-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3c5f660658f2ebfba5d4dfe4bafe8cd3a0defcda410ec08d2205fe08c398940", size = 211967, upload-time = "2026-07-06T17:37:16.484Z" }, + { url = "https://files.pythonhosted.org/packages/dc/53/4c754c3ba18ec70b7086b91a4abd368358fc47cc9b3871afd50deef4fea1/ijson-3.5.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:29eb8f0c77a296a10843a1714ad4a5d561e604cda3c88585e9012cf2c1729b0a", size = 201020, upload-time = "2026-07-06T17:37:18.017Z" }, + { url = "https://files.pythonhosted.org/packages/26/2d/3e7191b3222a31c378b827565b4fa64676a293441279f84db3d971720bf5/ijson-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85997568d6b304cfa59d5c3f2b04f95b92e9a8c7f57d312343a7989cf8dfff85", size = 205584, upload-time = "2026-07-06T17:37:19.343Z" }, + { url = "https://files.pythonhosted.org/packages/24/11/55ae9c915e68f37c8698f8b09355071dc808ced5e9d4abf8238dc363f500/ijson-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:c2e2509dc7f2fa5a2ac9ba7d15dd901f4093bd36b0784f65e04b681b7956651c", size = 54438, upload-time = "2026-07-06T17:37:20.656Z" }, + { url = "https://files.pythonhosted.org/packages/96/df/5bf2656447f14a923d25a0401b1cd628ca05c23041d3a4c116ae8d44dc39/ijson-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2699e838099d056818c5f8e4ba702b345d0304e58847bdc79c5c1616d5d750a5", size = 56467, upload-time = "2026-07-06T17:37:21.615Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/dec06e84fac704039625039c6b116a44f17ad72fda48b8f88a2493364b77/ijson-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:c388f85cbb9eec022b2bdedd23ffacfe7ab100c1200b1f47bee6e6ea2c3309fa", size = 55774, upload-time = "2026-07-06T17:37:22.958Z" }, ] [[package]] name = "imf-reader" -version = "1.4.1" +version = "2.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, - { name = "chardet" }, - { name = "diskcache" }, { name = "pandas" }, + { name = "pyarrow" }, + { name = "readerkit" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/5a/c8bc268ae5b6dbab4db01d92f9d34713a7c487bc85f2522173cf24bc5c74/imf_reader-1.4.1.tar.gz", hash = "sha256:2584e45485b539cd2d15bf0a785e6ac5f29775c042d9d5f83c7af5d5f0947c0b", size = 13271, upload-time = "2025-12-05T11:41:01.049Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/79/97bd7b6c3af609b33ba2d787ea9e06ad93b1deca38388a345b6c913825ea/imf_reader-1.4.1-py3-none-any.whl", hash = "sha256:16c0dafcbe0e6630e7d3adbccb81e828b3e971b79e3969b79fbd6772151165c5", size = 19285, upload-time = "2025-12-05T11:41:00.218Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/26/f6ed424490fb49798c86eb5990448a4bba1ad7d5821c34857b9053e46ed5/imf_reader-2.2.0.tar.gz", hash = "sha256:3f725d5759b0d78875833ee9a5c66cd27d61c31bd8a553ff71eee05b5e628b57", size = 51023, upload-time = "2026-08-14T17:42:33.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/0b/f039227891003395030935c2efeba61f72048fd6cbc7c38f678024964f68/imf_reader-2.2.0-py3-none-any.whl", hash = "sha256:b7decf529540b0d923e5fc39e5afaf899ce46d7e199b7163d1ad346bde954a4a", size = 59523, upload-time = "2026-08-14T17:42:32.392Z" }, +] + +[[package]] +name = "inflate64" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/f3/41bb2901543abe7aad0b0b0284ae5854bb75f848cf406bf8a046bf525f67/inflate64-1.0.4.tar.gz", hash = "sha256:b398c686960c029777afc0ed281a86f66adb956cfc3fbf6667cc6453f7b407ce", size = 902542, upload-time = "2025-11-28T10:55:52.641Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/33/5cfa7468960de1be0833e7e41adf5b7804a0aef2fb46f3679df3876bf3ab/inflate64-1.0.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c8009e4a4918ee6c8cbc49e58fe159464895064cfdf0565fed3f49ca81e45272", size = 58619, upload-time = "2025-11-28T10:54:48.315Z" }, + { url = "https://files.pythonhosted.org/packages/cd/0a/583c7c2832da36e986c5758d0afb6f5944599e55c5b798b066a9ef63e581/inflate64-1.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0d173a7a0e865bb7d19685c5b1ad2994712b8361b24136d7e94abeff58505647", size = 35865, upload-time = "2025-11-28T10:54:49.389Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/9c6acfbe900e5c8698132244c68036b0455bd2169f46e356c83dc0366f11/inflate64-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8bad992f2d034f5f7e36208e54502d1b0829ce772c898e5dc59109833420148a", size = 36019, upload-time = "2025-11-28T10:54:50.813Z" }, + { url = "https://files.pythonhosted.org/packages/7f/66/c0c3d3b4b863aab2c2ce631d219a8eb3b95b78acd5f40d3212f071e693db/inflate64-1.0.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6bfcf806912ced77a21394f7363805ecacd626b79f93cba87d505a48e88ede78", size = 98765, upload-time = "2025-11-28T10:54:52.273Z" }, + { url = "https://files.pythonhosted.org/packages/37/00/1a2351a85d36b26c5b2b8cfbb37ad86084c98f592dd7590f8577d8b33993/inflate64-1.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62d1aac3aba094ae42e27ce7581b414c90f218248be0953b6aeb11a127225e5d", size = 100594, upload-time = "2025-11-28T10:54:53.684Z" }, + { url = "https://files.pythonhosted.org/packages/f7/3e/5d18ff5b86aaaf54117e1bb6ce15cb17163f56035f9c480e609d35f258ab/inflate64-1.0.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8065166f355122484f004225b379d403346bdae69ec624786a9334f025580675", size = 96745, upload-time = "2025-11-28T10:54:55.277Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/306d5d6aca1e04e596d2a504a59ff9a900623a6ec852f38aab99f384562d/inflate64-1.0.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94a95f32087d223d2e119ff5c7c264109e8d4cb7e421e7a688a899a6fe021b38", size = 99795, upload-time = "2025-11-28T10:54:56.485Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ec/d4caa4bf3c9e520c15e900fee5a00fc523953843e14aa378ca1abfb2b4ea/inflate64-1.0.4-cp312-cp312-win32.whl", hash = "sha256:ad4fa490bb7dc2a4640a3adaa2d5950f4a465ba034bbcf184c2103646e58ad97", size = 32956, upload-time = "2025-11-28T10:54:57.642Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/c0de4e9bdf12e449360b710e9ab5b5248804610f382b538773cbd07b72bb/inflate64-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:2c6befdf83d088a6e0d10d0873a9d4bfde2ce00ad7a52c8189cf303306f98030", size = 35577, upload-time = "2025-11-28T10:54:59.14Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/03a5ef74ad3869b3c5af3b09216321f5a1a5a45265f7bd6d5abc669c7622/inflate64-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:2b263c619469f90a75f29c421c53d31b208ad494a078235a8f6db2bc96583fdc", size = 33465, upload-time = "2025-11-28T10:55:00.568Z" }, + { url = "https://files.pythonhosted.org/packages/c2/55/b7de7ae318a4f233f892c4f7c8b7e0e8643abe3fdcc53ed35020a9fe3f47/inflate64-1.0.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3f37540d0e64884a935fd62a7d17e40ab69f05ec63e815483b6513675d01bef", size = 58633, upload-time = "2025-11-28T10:55:01.931Z" }, + { url = "https://files.pythonhosted.org/packages/b8/5f/6f89c8524503fd7a9ca2bd91fe60d7291b3f684e9d41edb38ef49e10fc3d/inflate64-1.0.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4d24112180c95d12f279cade9a1e21f8be7f4790c4109c293292edf87d061992", size = 35864, upload-time = "2025-11-28T10:55:03.075Z" }, + { url = "https://files.pythonhosted.org/packages/7d/14/9eadd59244b38cf85ccd0ca43d1296c50b3a33aa37be4fb68a1928efa58c/inflate64-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5c098dab17821f466fc6e6a3d78fc6e0295bb51458015f03416b1d58d6a8df4f", size = 36019, upload-time = "2025-11-28T10:55:04.126Z" }, + { url = "https://files.pythonhosted.org/packages/ca/04/399e82d8f5003dd92c8a0c5c1a9a8ce0919114710a496cbe88848bff3a72/inflate64-1.0.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a984b9287ff0fb596eb058d66a9e94530556afd2b7c054b44f2e0aeeff894e8f", size = 98973, upload-time = "2025-11-28T10:55:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c5/038dc2593bbc4272d87eac8c9f75692267d47f834ced888f6d81995df606/inflate64-1.0.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f62a13d0327631778fa2a47c308ae2b07b2659b7bb8564783259ac65949f8c0c", size = 100777, upload-time = "2025-11-28T10:55:06.41Z" }, + { url = "https://files.pythonhosted.org/packages/74/4a/f6d3031dd3578510894a41bfe1ac149228970ce1629a43f20e0c5abbe8d1/inflate64-1.0.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:513201336fb3b0b7e2aee5dbbbe30a9f1b23291738b5ceb80076fc285f2ec2f1", size = 96967, upload-time = "2025-11-28T10:55:07.594Z" }, + { url = "https://files.pythonhosted.org/packages/26/ef/7ab3bde4e176609ae0e607a8a9bb38d201885275664a6d574299f5bf7850/inflate64-1.0.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:84ce3a97272ba745fce52b38363855c7201968f6402a794bbade774e64c657b9", size = 99997, upload-time = "2025-11-28T10:55:08.85Z" }, + { url = "https://files.pythonhosted.org/packages/39/59/8256b3e802e203c8645e0b32b25e6bd94508ad572593f0cdf8234db3879a/inflate64-1.0.4-cp313-cp313-win32.whl", hash = "sha256:332051a9d7e50579b90a3f555d68f53414b06f636c9ffe82e97c0baae3c8fbcc", size = 32958, upload-time = "2025-11-28T10:55:10.343Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4f/5784ee1eb8260f2310e24ef2883f1f494f9332bcfde4ed14ee780372149e/inflate64-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:3983f53b590ff7d0ba243f664ce852aca882482f30f7a8eab33e10d769336d0c", size = 35578, upload-time = "2025-11-28T10:55:11.389Z" }, + { url = "https://files.pythonhosted.org/packages/39/e8/8d927770ce25dc9764c8104207a80653d65471d0a6a8f9ead350016e4586/inflate64-1.0.4-cp313-cp313-win_arm64.whl", hash = "sha256:118d8286f085e99a14341c76ef9fbffd56619ccc80318a9a204aea3dbfa71470", size = 33465, upload-time = "2025-11-28T10:55:12.824Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fb/ec9d10f44f2fc7666ad5d70acae2b8a1941e8e08ccae1fad0820f7796be3/inflate64-1.0.4-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4f61925b2d4248eac2ebb15350a80aaa0d1f7f1dc770bd5ebbbb3b0db4a6a416", size = 58727, upload-time = "2025-11-28T10:55:13.834Z" }, + { url = "https://files.pythonhosted.org/packages/81/80/24ba0d2ee14e07e275e9c5b058e59a8a58f8ef42dd51a78ebbfd7c857ac4/inflate64-1.0.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c1acf18b08b32981a4a11ec5a112b8ad5d7c7a5b15cb5bdbdb5b19201e9aa180", size = 35945, upload-time = "2025-11-28T10:55:15.225Z" }, + { url = "https://files.pythonhosted.org/packages/70/b8/073a79716e093db973b8823bdfb02e10fbdf65642dbe1fa3cda24832aeb2/inflate64-1.0.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:abddae8920b2eaef824254e14b8d4ff54afbe6194a1bbe9816584859f0c1244d", size = 36060, upload-time = "2025-11-28T10:55:16.261Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f0/87d3c317ed0acd94f5e9b3b1b9e9000228ea2af0cb4618c62cbfc816da34/inflate64-1.0.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b303132cc562a906543a56f35c4e164e3880da6ff041cb4a7b1df9f9d2b4bb69", size = 98995, upload-time = "2025-11-28T10:55:17.405Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/0b6035302e9c33f004240a50cb6e2e1fc7bb1f2b415b02d939c551bdd06b/inflate64-1.0.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f0993214dea0738c557fa56c13cd9083aef0097a201d726c21984ad7f577514", size = 100781, upload-time = "2025-11-28T10:55:18.597Z" }, + { url = "https://files.pythonhosted.org/packages/2b/05/5f383c615ec0f01bcbbc699a71da167623e494083ab7ed0df86b4bddf125/inflate64-1.0.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a6baedc3288d7a4ff588951d3a9a97a5391dceed6255ff5b16e42cae7274bfa9", size = 97038, upload-time = "2025-11-28T10:55:20.156Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9a/c1482718c717c49c67490c42b4fdced9476e894eaebd52193e488c12e188/inflate64-1.0.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a846ce1f38845b20bef2625af1b512be83416d97824539524c5a34e7a729aec7", size = 100016, upload-time = "2025-11-28T10:55:21.337Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7f/700ede7474e72a1c0e2e8fe36624cd0225ca8b2875eca33d64aa2de75f4d/inflate64-1.0.4-cp314-cp314-win32.whl", hash = "sha256:eef87908c780439393d577a155868317f0a275b47b417db9f47d8633ec791745", size = 33691, upload-time = "2025-11-28T10:55:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/f2972df8cceecc9bf3afa3353d517ffc7125285198c844588e9aaf98f5d0/inflate64-1.0.4-cp314-cp314-win_amd64.whl", hash = "sha256:fb2fdd63ef3933b67af98b3f2ee2f57e7787278041d7ba4821382fedd729b68a", size = 36304, upload-time = "2025-11-28T10:55:24.005Z" }, + { url = "https://files.pythonhosted.org/packages/29/77/16200aced67215119fb30ec9a5889b48289ee2fa5ce5137623a9ad41b2c4/inflate64-1.0.4-cp314-cp314-win_arm64.whl", hash = "sha256:2e129669a0243ac7816fd526946ee01c25688fe81623a6d6bc95b3156d80f4fb", size = 34491, upload-time = "2025-11-28T10:55:25.068Z" }, + { url = "https://files.pythonhosted.org/packages/c0/79/b466ec7666c40912ea81a305a8a2b75f5998e6cec1d3d75e067d76203731/inflate64-1.0.4-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:b17bf665d948dc4edeea0cd17752415d0cd7240c882b9c7e136ad4cc4321e9d4", size = 59300, upload-time = "2025-11-28T10:55:26.185Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/16e1168ac80f39894e6cb18b439eec63fec42cbced239aebfe12081b6ec7/inflate64-1.0.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6751758301936fbb38fa38eb5312e14e27b6a1abf568f83c17557fab2694373d", size = 36258, upload-time = "2025-11-28T10:55:27.295Z" }, + { url = "https://files.pythonhosted.org/packages/25/42/c463b42fd8a7947b4445fbaf57c265bb7f3114362fb7aee6884ffd8b5341/inflate64-1.0.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d6a4136752aa2a544301059d8f13780aeb88c34d60770258436a87dacd3fc304", size = 36296, upload-time = "2025-11-28T10:55:28.632Z" }, + { url = "https://files.pythonhosted.org/packages/39/f1/cf6121926e405020e9e7bccb78ec7781fbc87500ec67368e7d9e866758be/inflate64-1.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:938ebc6b28578bfd365d1a9fdb18b7faab08321babeb2198e8025d07d8dc7fb5", size = 106788, upload-time = "2025-11-28T10:55:29.797Z" }, + { url = "https://files.pythonhosted.org/packages/9c/dd/b653f9962497cf4d3520d69272894c37fd76f86a0e04bb3bd9f32827dc2f/inflate64-1.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61f51f80fa6f367288343c1a2cd20a42af454883087064e9274fd2a8c3a5a200", size = 107959, upload-time = "2025-11-28T10:55:31.306Z" }, + { url = "https://files.pythonhosted.org/packages/60/ae/65d88109b63611c9b6c29008201107127cf2603d186ab99beec39d85f38e/inflate64-1.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:172b51da7bbfa66b33f0a5405e944807b9949e92cf4cd9f983c07af8152766df", size = 104213, upload-time = "2025-11-28T10:55:32.506Z" }, + { url = "https://files.pythonhosted.org/packages/f9/94/c17de2f55b9fb1269bca4657f9089efe4ba0f3d4b652f07b34dfc69f69a2/inflate64-1.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8ca9a2985afd5a14fb48cd126a67e5944ccb7a0a6bdec58c4f796c8c88a84539", size = 106629, upload-time = "2025-11-28T10:55:33.735Z" }, + { url = "https://files.pythonhosted.org/packages/8e/30/8bbc587bb2ad09ab7edf1f9215b2c5faf4fa7ee7c071daefe9ed55e28814/inflate64-1.0.4-cp314-cp314t-win32.whl", hash = "sha256:f8964ceaabea294bc20abc9ef408c6aae978a75c25c83168a76cd87a37c38938", size = 33865, upload-time = "2025-11-28T10:55:35.335Z" }, + { url = "https://files.pythonhosted.org/packages/91/87/8bf6f412f93c8b6dc14866a021b83321331fbdd17f6ab902a24dbf88773d/inflate64-1.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:7d13b04cba65c12d21e65eaa77da9484e265e8e821b26e0761d1455ad3a878d9", size = 36943, upload-time = "2025-11-28T10:55:36.983Z" }, + { url = "https://files.pythonhosted.org/packages/7d/85/33447bb3c4e3c0ae7b1fde3aadc52a18b2b0193cfcf4f585977e924c6463/inflate64-1.0.4-cp314-cp314t-win_arm64.whl", hash = "sha256:9ae3ee727235a06dc3cd353ee5761fdd8e3b56ad119c711f61680528972a6ced", size = 34846, upload-time = "2025-11-28T10:55:38.433Z" }, ] [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] @@ -679,11 +974,14 @@ wheels = [ [[package]] name = "joblib" -version = "1.5.2" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" } +dependencies = [ + { name = "cloudpickle" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/1d/537ab090f302b838943a1b56497dd53059b9a9b46a074936470173a2e207/joblib-1.6.0.tar.gz", hash = "sha256:2ccc96785b12046c08fd6d55839c12857831b54a3c1673ffadd2f04bfc4eda03", size = 327903, upload-time = "2026-08-31T09:39:04.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/84099323c2ec4be98d935f63c033ac4151ee83836ca1050ede3b3aadf155/joblib-1.6.0-py3-none-any.whl", hash = "sha256:3dbbf9f6e4b592a2357b854608e980fe6390d131d7a82f011a377ef2ebef7aba", size = 306115, upload-time = "2026-08-31T09:39:02.298Z" }, ] [[package]] @@ -698,21 +996,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload-time = "2023-09-01T12:34:42.563Z" }, ] -[[package]] -name = "jsonpath-ng" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ply" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload-time = "2024-10-11T15:41:42.404Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload-time = "2024-11-20T17:58:30.418Z" }, -] - [[package]] name = "jsonschema" -version = "4.25.1" +version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -720,9 +1006,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, ] [[package]] @@ -738,22 +1024,105 @@ wheels = [ ] [[package]] -name = "libhxl" -version = "5.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpath-ng" }, - { name = "ply" }, - { name = "python-dateutil" }, - { name = "python-io-wrapper" }, - { name = "requests" }, - { name = "structlog" }, - { name = "unidecode" }, - { name = "urllib3" }, - { name = "wheel" }, - { name = "xlrd3" }, +name = "librt" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/9b/356320fbae2ac8467e21c5e73e1389c80468e4998c62cc7d3536cc51b614/librt-0.15.0.tar.gz", hash = "sha256:4e66cbe84437497d951b799d3e1551291b6fb3d643820a7014b3655d57a59162", size = 214338, upload-time = "2026-08-07T10:49:42.663Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/39/99c25030e782bdfb7a21be8c05254806a2e4bbb05c8d50c2a2130acbfa05/librt-0.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e87bc679f86a99aa3b26e3c78eeb821a247c9a28eae48eaafcc32c3bf4c3bb9e", size = 151021, upload-time = "2026-08-07T10:47:00.057Z" }, + { url = "https://files.pythonhosted.org/packages/14/43/f4b1bd1b2888798a1409808889a25ea1ba49eaabce7d681ed27734c2df9d/librt-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71599e011ac880e8e45d46047d714871894c7d4ab6f25626f8d4f89da21f368d", size = 155267, upload-time = "2026-08-07T10:47:01.311Z" }, + { url = "https://files.pythonhosted.org/packages/0c/db/3ad9c965c72f1e1d6beeec44ec10a54e17be8ae042fbb4baade16cbadced/librt-0.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c802434092b769b1d613ed2e13fac15fbfce1934a74bd10283b03c0fae231cd1", size = 503136, upload-time = "2026-08-07T10:47:02.45Z" }, + { url = "https://files.pythonhosted.org/packages/4b/07/5888a6d76acd62ebce66c61b74d94e9370b9c32929f111e487bb6546f8ed/librt-0.15.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5500eeae393a184d14e1f35645962c27129d20c81afa4069e6ef826ebc2b3aaa", size = 496670, upload-time = "2026-08-07T10:47:03.675Z" }, + { url = "https://files.pythonhosted.org/packages/29/39/ab57cc2f5b276156da02bb7f5a8921bada1cb1993ffec99acf811c602c23/librt-0.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6ecfc32dfb46fb7b565bcd6abf9412acf978775a998273d22888a6d7953730dd", size = 513688, upload-time = "2026-08-07T10:47:04.981Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b9/bdbb0b648b5c2befb031f4c6f3b1dd857415e8fb492a25a3c764a6681e6c/librt-0.15.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cc46cfd15022e35084355478c9ac809d90b1152222706ac9a7655ec21df6fa", size = 531904, upload-time = "2026-08-07T10:47:06.211Z" }, + { url = "https://files.pythonhosted.org/packages/93/26/473c2e4b6c104e9e58e27ce95fc8005c8bd4fc36cae4f254371125a92db8/librt-0.15.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5f51401d102c885b9ca509e62c79b1dbff286e1b9b047fde6f763780789356d", size = 524427, upload-time = "2026-08-07T10:47:07.592Z" }, + { url = "https://files.pythonhosted.org/packages/26/60/03b3abb82b41714671b907bf6989b228e31e6a8af52dec82b5b0728dc250/librt-0.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cc30523e3f1a23fb7511cc659834a0d01a1042bb9de359bc1c131cc4ec6c9656", size = 543155, upload-time = "2026-08-07T10:47:08.866Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0e/9bb1f0a4affbd0a1888f4f79dc03ed2a299d9a2c26c59ab2a97dcbf11903/librt-0.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:59fe030d8ae4a57e3fb7756bf35a858de74e04066fc8555c53d0af979132af81", size = 546890, upload-time = "2026-08-07T10:47:10.327Z" }, + { url = "https://files.pythonhosted.org/packages/dc/84/6937a280d461f7de6e031ffb02edc2b7c3c90d49d630565ce8ff27cbc5f2/librt-0.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a6526a2a956bbb1e4ae3568c82e650fc99119c66bb011ea60715744955a2b4d", size = 555163, upload-time = "2026-08-07T10:47:11.798Z" }, + { url = "https://files.pythonhosted.org/packages/bc/95/2a2853c1ee014bf102116e7f897a04beeaeb2461b45b79af98bdfb95f1ef/librt-0.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:85ea21ec6730194d67156b0e0b5430ccb1d61f8b8b907e39b37f9812b74a13f0", size = 535812, upload-time = "2026-08-07T10:47:13.279Z" }, + { url = "https://files.pythonhosted.org/packages/c9/4c/cf9601c1b4c5f09280acd5d83abdb2e68527a2be8257136eb42304218622/librt-0.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e47b8ba865d7ede071a91a7163073bbaeb72541f1ef8a07d512c45c7b5007f2", size = 573688, upload-time = "2026-08-07T10:47:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/47/6d/9ac7cbec46189a7625af4b5acbd25f10d827f4141b2002181848c8418923/librt-0.15.0-cp312-cp312-win32.whl", hash = "sha256:a5207ec414d1c4a2a7231b2086970dc036f94293cdf338190984958a013a42f1", size = 106138, upload-time = "2026-08-07T10:47:15.973Z" }, + { url = "https://files.pythonhosted.org/packages/38/d0/2ae99c83be86ce23f925ac1aeeedc777e97f427c4a8d190c70d0a16e9a87/librt-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:73b30cfa976659b3917c8f6153bdb0591c6a9ec6583599fd24a689b690622022", size = 126974, upload-time = "2026-08-07T10:47:17.049Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ef/dd24f9635c730b86b87587967dda7516b1845e8b17684603d31607fed598/librt-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:a54cf9e0ef47b96af580849db5471142200568ce1e02cbf416addab551369570", size = 112292, upload-time = "2026-08-07T10:47:18.222Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/467b53a601b406ccd7b97c1fd54b59cb34f9185ad5ce7e9d5c3c4e8961c8/librt-0.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:db13ca398005abcbe538deda87b686d9bd08b7001cf40c4c06b444960ae10a26", size = 151029, upload-time = "2026-08-07T10:47:19.312Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e6/36c2299b7a94b84fdd01220d8a777a71be5be0925bb0dbdf71c0a06a34d9/librt-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa1f1995789dca3698bc550aaceb09a51bd5df0a057ff84ff15296cd1975b801", size = 155194, upload-time = "2026-08-07T10:47:20.398Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b6/ed5071f9325845e670bd36012757419767fbf56af77ed483077b9e4db541/librt-0.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55456ea87d8df21808446d03817be2f65e20391c1c615d9187440dff28cd08dc", size = 502568, upload-time = "2026-08-07T10:47:21.652Z" }, + { url = "https://files.pythonhosted.org/packages/7f/81/6450c67c3615d87704bcbc21323fafc69c799b06a044c447529f725d4b01/librt-0.15.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5a86a5a08c2235316bdb359d5dbb6ce0abfca7fac06363103e2c5af571d92f95", size = 496153, upload-time = "2026-08-07T10:47:22.925Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d6/5f52b722bc75076954b3bfd49be15ea362df4d580c6fb315d0f617100d30/librt-0.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e56b6a368529bed262da40ce13f8fef590db0479819cca84f16a1f01ac356d0b", size = 513336, upload-time = "2026-08-07T10:47:24.213Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e2/c08fd1d36ce63ea5a12b85c5d37f4550b5f86a692167e41e5a74222607ae/librt-0.15.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:234d8d394721fa0d786af15ebf1f3fb7f3ed82fd1cd0cde45c2f247b5d4281d2", size = 531661, upload-time = "2026-08-07T10:47:25.507Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d8/d9482fcbeb177b9eb87bb3899eeb3b42be690313c652f9e146b1d0681fb2/librt-0.15.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d8363d7accb0286ac3a0e633f396e93800dafb8150494505daf9515bbda591f3", size = 524487, upload-time = "2026-08-07T10:47:26.79Z" }, + { url = "https://files.pythonhosted.org/packages/10/cc/075171517b41f861753034fbb151b42cfc83bcc853849f24f5e66fd60ccf/librt-0.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0f0ee3644d951f31055ad07d77d92520e84505dd7a432cc4cd501dd70ee06785", size = 543201, upload-time = "2026-08-07T10:47:27.999Z" }, + { url = "https://files.pythonhosted.org/packages/b0/03/42c2330f37eeb475b6affeedd06518f60035f323af3a839335e3fc9fef2d/librt-0.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cfd1a81a648806e6a7717be4cc4d1bb392fa229752bf8444ba365e381e984d6", size = 546467, upload-time = "2026-08-07T10:47:29.396Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/1ad4c5638f7e64d8560328bd25c54b409a661bdb6ff254b38ff90744288d/librt-0.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6cd22c9da0d866558e46a041f1cc0c2bbb26b61b137b2347fa834c332e1d101", size = 555139, upload-time = "2026-08-07T10:47:30.815Z" }, + { url = "https://files.pythonhosted.org/packages/49/41/39fa7d15db1204cd1cbe6514680fbdc243adf754a0885061308f43afc013/librt-0.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6d5225ef8801e4ea5e482fa9b5dfb891dd9ef6f6d870f1f25d449ca2c70ac218", size = 536050, upload-time = "2026-08-07T10:47:32.222Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/c6dcf0dd8e26dc0c9a499a2abab8646c86dcaf9ecea9524cb46d3686331a/librt-0.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d28a05796b99f749bf8794f17ba9ba1612d0076b802e9cfc62c554634e9ce3b", size = 573700, upload-time = "2026-08-07T10:47:33.527Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9b/ab54c71a7918a7c34fa5327fb61390a77446a07a146fbfb1165250a61035/librt-0.15.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:2067ff438048cead9d223ca5675bae2a25e520a7c3e6c1498bf9c6892d22caab", size = 82194, upload-time = "2026-08-07T10:47:34.835Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b2/4f9a243bb892395f3becb80789ade13771701091f9f07ab8230247953ba8/librt-0.15.0-cp313-cp313-win32.whl", hash = "sha256:1cd3b721f24c206398b9e26da3c3a9c011e6e89d06f318ba8ebefc30f1003890", size = 106231, upload-time = "2026-08-07T10:47:36.251Z" }, + { url = "https://files.pythonhosted.org/packages/bf/af/64aff4885a40b93132382f2c314647d722574605416504379184ef3045ea/librt-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:f395a4a9a03ac062dbe9a9f82e0c720502e590a38feee6a757bc82e9c63afbd8", size = 126996, upload-time = "2026-08-07T10:47:37.453Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/335bccf6c7cb9028cb0b54aead27d9ece3f01f83bc6baa2abace5da655c1/librt-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:0a15cb554761247d84a3ec0cbdf4078d70725384f0e4662c0fa3b26266eb60ad", size = 112188, upload-time = "2026-08-07T10:47:38.729Z" }, + { url = "https://files.pythonhosted.org/packages/a8/93/949053fb462eecc4a9a5ee770a81f4b40be7b79538b245545d4aebc6b58b/librt-0.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f5de7feedc56337a088eb15cd9fafa9938367362221d8cc62c642b7f94821993", size = 149833, upload-time = "2026-08-07T10:47:39.86Z" }, + { url = "https://files.pythonhosted.org/packages/61/ca/8281aa6cd560a3420e4497729f6b704b53be3eeaaef82d5aeadddaf7441f/librt-0.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c0eb900c0e91f4aebe680845242e614f1864edfd44106380d0752ac29522bf8", size = 154088, upload-time = "2026-08-07T10:47:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/dd/02/1a1662dceaba6a086360891448d5ce9a7d3555976cae59a31a39d744b9c7/librt-0.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8c9a650a188e38bac005048cbe6342e81407782944d01934540ab75e417df21", size = 494215, upload-time = "2026-08-07T10:47:42.388Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/99211619dc656370a3740c33d2b0b6d5a3fb1e73689314f6ed477a397dc4/librt-0.15.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:92bfed8deec93df30286b9fe9e3b1dd17329cc076a192b4ee5ec223841d54953", size = 491173, upload-time = "2026-08-07T10:47:43.683Z" }, + { url = "https://files.pythonhosted.org/packages/d4/aa/5448d0b05f4579b635d3899176817ebf561af0e57bacd425b5b1887264c1/librt-0.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec4b19788f835711a2072f9dbe6b03b3bf32ed1f0fb30cf399bdd59d9f0c33fa", size = 505512, upload-time = "2026-08-07T10:47:45.314Z" }, + { url = "https://files.pythonhosted.org/packages/95/82/01940e40b83c43a546c4a3c896cf34ca272a9690899d55914e4827b3dcce/librt-0.15.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4c7bacb70930f3d0a56f4ecf1be474a1f0d941b01dd73b756f3c256d42cb879", size = 523073, upload-time = "2026-08-07T10:47:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/88/fa/759c0030f3ee371439eb26de34fc745807caf0abb878af7af4b8b7c3dd3d/librt-0.15.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e79f05e4a08b4d880342673312bbc895b56df7765605796f15902eb5367d3ae", size = 515080, upload-time = "2026-08-07T10:47:48.319Z" }, + { url = "https://files.pythonhosted.org/packages/0b/27/894e072228fcb159703c655da69f8cd10dbed489c36e3df7dd032a2483be/librt-0.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a417149c0cba4d50b61e992e5a15e69eaf96746609b461cc4ed168aeef6b79dd", size = 534164, upload-time = "2026-08-07T10:47:49.875Z" }, + { url = "https://files.pythonhosted.org/packages/98/a3/0078e91c1f36f8815db17827de15650b9a3fe56c55fbf998c854b34e40d3/librt-0.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:da7a94d6a3411f579d72aa3e3bc5fbca7ed4549f3dbd7e5de3aa567333374285", size = 540616, upload-time = "2026-08-07T10:47:51.408Z" }, + { url = "https://files.pythonhosted.org/packages/86/33/81a29b796dd52a45e9ef7974c7732926e8f10f15b8d2be505665979f896d/librt-0.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:856f743ae607f2c1380eccb566c0038a9fb3eabf0fc2be2704d76d9f73557239", size = 545890, upload-time = "2026-08-07T10:47:52.818Z" }, + { url = "https://files.pythonhosted.org/packages/05/82/8be1baa1350e5d30cfd70ae79d0a6f4dc5862ef47f7bb2808aabc9bb86e5/librt-0.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:779a6e7c894737e5983e7790a9c78c4000c30e23c9aada08081bdbea53b0fa60", size = 523287, upload-time = "2026-08-07T10:47:54.165Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4f/d1be6a01a35c20ef734e0e44113f87d4af756a9354a89dcfbe3b4f8af5e1/librt-0.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:96bb17dbe8bab3c0954fbebfc69ed395599de75b6bbc35e3270a878e15d4dd65", size = 565868, upload-time = "2026-08-07T10:47:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/67/88/649cfa33f5825927b160610f670bdab012a64d627eddb94fa795ea4292fd/librt-0.15.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:7220697efaa6e5348fc3d18ee7f8563d4bfecd9872b37ffb915bfc1d08840622", size = 81619, upload-time = "2026-08-07T10:47:56.886Z" }, + { url = "https://files.pythonhosted.org/packages/22/31/8e88a8d5e48fc8d1a817787fb6811dfff6499acd6c8683dd83934aa6ede0/librt-0.15.0-cp314-cp314-win32.whl", hash = "sha256:f54598964d357b1c5ab77cf5d92f21e598fe0e23cdbe9618480807f81b4eba15", size = 100138, upload-time = "2026-08-07T10:47:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/80/92/20fd6c4b6a1b1a564b076d55cd3d427d8428217d7638dc25a654cc4791d4/librt-0.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ff5893a2c23d886aa9ce786de5ac6ddc74aeeaf90743682b74d920e117d2e28", size = 121258, upload-time = "2026-08-07T10:47:59.564Z" }, + { url = "https://files.pythonhosted.org/packages/fc/28/6af430b44d9ebb897b865a3c363b6dcace51357be2347cc0f8f869656a86/librt-0.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:3722a099730704c9a3d70c879fc0f51daec25fe5f1555672d97bc595abeafb95", size = 106467, upload-time = "2026-08-07T10:48:01.097Z" }, + { url = "https://files.pythonhosted.org/packages/7e/aa/b42bb798942ced219f6d63b27e07f91237887a8d0bd0921666db79a13790/librt-0.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:38c0c7d4b6fc06c3324b3f9162c8391bfc4fd9dde53afe1033ce7edb48d5a714", size = 159523, upload-time = "2026-08-07T10:48:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/75/03/1b53cd4ef904e73b1d828a5f90143bf94a2967d7cfff0b9ccf93e12aa9b4/librt-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8b2fdd7ead3c995c37940a790690660d0ca006c302db26cc51933f6766866fc3", size = 161638, upload-time = "2026-08-07T10:48:03.725Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c4/9f9c9fba097d49e9e694c2b4dc331df31884645ecbc58a93b4b5fc69d2c5/librt-0.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fde98cf1fc4bac144ce23c2c4c017b924ba714509ea9334977b0b27050c837d", size = 701795, upload-time = "2026-08-07T10:48:05.135Z" }, + { url = "https://files.pythonhosted.org/packages/4c/05/0966840bda0380c8ae167b9043c6230202941cc90ea29c48e096964c765e/librt-0.15.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:e3b461183c5fa7681b48560f91515f53a953122fb30c71e07abc67d7ddf58c38", size = 682147, upload-time = "2026-08-07T10:48:06.555Z" }, + { url = "https://files.pythonhosted.org/packages/18/af/1c47ca573c30ea47d195aec26133af522fea1104afaace028d7b32247ea8/librt-0.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4bbcc257e3babea20a91715c361b24554ec4e8f51aa578568afc230799fe1a19", size = 696397, upload-time = "2026-08-07T10:48:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/2e/0f/1aed6223d4f9f9d1171a8596ff100ea4c3f7699fea7a4ba657c3e60daa6c/librt-0.15.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b845b8d48088fad0cadc84be4b8fda63203be7e9237b71015b3925443c1f35ab", size = 722542, upload-time = "2026-08-07T10:48:09.569Z" }, + { url = "https://files.pythonhosted.org/packages/c6/22/9e3a929aea456c97d69e6ef3884efea56d4807f97399471cc946baebd8af/librt-0.15.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b30e600e8f337b9bd7f39b86d9fdfedc73cc46e3d0f745931a23a234220bb7e2", size = 729709, upload-time = "2026-08-07T10:48:11.129Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1b/c327ef6018e3a9ca0b8e7c5eddeeb331ba8f9b76c24e126d37d0f6d62faf/librt-0.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:64b0c8c35aa4c4ed79896359f3e0b285cbe4e610042106500da4811c322cc108", size = 752891, upload-time = "2026-08-07T10:48:12.558Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d1/d5f1ea02c56930087009e39db9b70660a663e76c730b27b925d786718457/librt-0.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0da0d94cb802f32a0524653e7201f2cef72d5f700a5407678f5290483d4fcd08", size = 745301, upload-time = "2026-08-07T10:48:14.55Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3c/5f7c585d15ebb2250c73e7c0ee4e9e47be72c65d520c07ddbcdc62037674/librt-0.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4a6369168d371207339b1e50d4532b06a7121586141f82599505a3f315751d47", size = 747921, upload-time = "2026-08-07T10:48:16.453Z" }, + { url = "https://files.pythonhosted.org/packages/7f/52/1443a446486eba966bcbca1696b472e4f210320ec42f490a47f48fbf0fdc/librt-0.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c434e072557ade9cbc642d052c89d031efe47d5c9614523619d0d74a02378e81", size = 727561, upload-time = "2026-08-07T10:48:18.089Z" }, + { url = "https://files.pythonhosted.org/packages/79/91/2270a9380f11725cf83ce1925a5e32dd1dde2be9bba597f25c10a38644e7/librt-0.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7eec6a42018bc1d45763b1c162d3d2bf7c3b9a1b0ed30d3e91dcba390efefcc", size = 774417, upload-time = "2026-08-07T10:48:19.611Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/f4b1548d4f5b99186737fe27aec238e9823e8d5d23bf4df007c030689dc5/librt-0.15.0-cp314-cp314t-win32.whl", hash = "sha256:6912fa5e635d74529ac7cdb1bdf6ca3af4453da8d1edbe0110ee1cb4ad407ebf", size = 104381, upload-time = "2026-08-07T10:48:21.048Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/134afad262def1de04c0843c376d02135f1168af43f22e09a52bd8394727/librt-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8e11699ed745931c395acd3621b07062e0f840efa6935aad87a64ed0995f0915", size = 127034, upload-time = "2026-08-07T10:48:22.561Z" }, + { url = "https://files.pythonhosted.org/packages/99/5f/1b6846b20572bd699c9e9ec321a5f781845bee477df2aa2a43b28bc40119/librt-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5d2a91724463bfed4f573cd7a9fdc856d2e230d0c0e5a61416a93481dccd8605", size = 110827, upload-time = "2026-08-07T10:48:23.804Z" }, + { url = "https://files.pythonhosted.org/packages/c6/44/4de9f4ddadb009a55c7758eb5736d62534a7daaf27bd71bc50e64b606b06/librt-0.15.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:8443e38dcfcfdbcf5add5118c623efd788d65ac2e25756d6251a54a06a4d0aca", size = 149843, upload-time = "2026-08-07T10:48:25.148Z" }, + { url = "https://files.pythonhosted.org/packages/1f/eb/5d9ab71e30119c44094e0275f38b47dd327aea0f843a080396677029d508/librt-0.15.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6d15a29033c57490cfe2069097c6fc4049e4e65ffbb749be7dc453b7c4c68965", size = 154510, upload-time = "2026-08-07T10:48:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9c/8505d1b8f5e8c19587bd03f7429993b3e9ce5c06819d856bfb11d919374c/librt-0.15.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2c05c729b589e734c09578bf5964be48a911765484840d017bbc84f49d4c4ad", size = 497543, upload-time = "2026-08-07T10:48:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/1d/9a/3a8390775cb095765aded027ac9c63e7c8ea74e731498607544c6505de0e/librt-0.15.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fa60887537e1d0cd2d9982269d33a709bf54b195cd2b9364fc0a758022af5bd9", size = 480452, upload-time = "2026-08-07T10:48:29.531Z" }, + { url = "https://files.pythonhosted.org/packages/e7/40/258a4a7117ee915d66de5cd9b8ade65a440993161107ce3a686f1859955c/librt-0.15.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d8bc24219b24c0af375718942ab75e3544b2763085f40f965be4326734ae8328", size = 507768, upload-time = "2026-08-07T10:48:31.007Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c6/2f4dd296c97a0b85b98894519b279408ec9dd602d4f692b1ea0e25dee670/librt-0.15.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86a21a7bd3fe3a419512ef424cc1c020f6771d0b29cfddff36d1635a855e63f0", size = 525122, upload-time = "2026-08-07T10:48:32.7Z" }, + { url = "https://files.pythonhosted.org/packages/49/dd/29eab42be13b2bf0ea8cb227135a45d44693e30a7e8b92871981ff56b82b/librt-0.15.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dbab647e88d90b3167b91efe7091e248653688ed4337e4f90907a722c7361bb9", size = 520371, upload-time = "2026-08-07T10:48:34.294Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/4bad71adeca8fe208b775c2a35417fa5a2584c8f4791daaf89a89450fea1/librt-0.15.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d8edcf6f550e918dca779c069b9e156385c60b406f99fc7641f32c52f7193659", size = 537258, upload-time = "2026-08-07T10:48:35.88Z" }, + { url = "https://files.pythonhosted.org/packages/4c/63/59dba6143fdcc7240c54458b629f3250000a61b8945890fc9efd451b19c5/librt-0.15.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:8b62076030baa2d8b1501a46bf0e19c27a489aa90671c55665bff7887f7660b0", size = 527432, upload-time = "2026-08-07T10:48:37.466Z" }, + { url = "https://files.pythonhosted.org/packages/ec/21/21a24c6a2327d8362580efebe77286bf47b0f4062ec5ea41766e609d3c7d/librt-0.15.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:d00d20d1818e82a07a0ee0aa89a98b17ed7916b92441090b683719cb20a59b6d", size = 548108, upload-time = "2026-08-07T10:48:39.384Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6d/fc68c89a7971418b41f9a873623ff935cb864097544c6a2f8ce491c8ef5d/librt-0.15.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4e6ee93fc3cf848dcbf0cce2eca73d8e7dcd0cc2b6df3a529d57750b30a4c55c", size = 529681, upload-time = "2026-08-07T10:48:41.392Z" }, + { url = "https://files.pythonhosted.org/packages/65/7e/c2d98766124400d722063a630b0fde38a9fc768705d37eecca15c47dc192/librt-0.15.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:32896a0af72508ea979e0acb4e4c04cbeeae04938167950d535c83c45597167d", size = 567736, upload-time = "2026-08-07T10:48:43.124Z" }, + { url = "https://files.pythonhosted.org/packages/55/6c/f8c34a95e3a515c6e1c192b89511e7253c89a7760c6b500d57ffdb8d2dc8/librt-0.15.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:ec3ba415afaf951f6951b1dd16d3c8e4f540065fc382d7e70b823a79567ca374", size = 81673, upload-time = "2026-08-07T10:48:44.645Z" }, + { url = "https://files.pythonhosted.org/packages/c9/9e/e23fa8e78679ec45728188650b39e8ff476c83b691c96f749217df3b1b7c/librt-0.15.0-cp315-cp315-win32.whl", hash = "sha256:d2813ba2503764f0450680c533d13df7cff9b49df1411062eded5f67db4195b9", size = 100081, upload-time = "2026-08-07T10:48:46.171Z" }, + { url = "https://files.pythonhosted.org/packages/e1/dc/3eb4c5e297343f0620a55532cd7c8d764d3001fa2159212dadf480464827/librt-0.15.0-cp315-cp315-win_amd64.whl", hash = "sha256:b87d67e33afaf265262f2a66db578284b88ee2e6fcd224579cb5c15518677ad8", size = 121228, upload-time = "2026-08-07T10:48:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/97/70/43abce19f04e49762f8ec834c8fafee13cc40fd6b94a72a24e534febfcd0/librt-0.15.0-cp315-cp315-win_arm64.whl", hash = "sha256:713bd7df21170b982e729e46870f31d6b437bd1a9b4648cffb529bd3c2ec5c4b", size = 106487, upload-time = "2026-08-07T10:48:49.095Z" }, + { url = "https://files.pythonhosted.org/packages/de/15/83f2deddb9368b8951ec8c9477269b5b9b8bd9bbf15e57402d0f38817dca/librt-0.15.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:3de789c82752730f94782a5ee518baf9c05edf85733aeaf73bb6e518755cdf54", size = 159448, upload-time = "2026-08-07T10:48:50.649Z" }, + { url = "https://files.pythonhosted.org/packages/06/bf/043097353f9b3c73b583d07f6b8e552795463f4bfc8caf85e42eee50c26a/librt-0.15.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:e0b5deec9a8664eb722c797241970fd4aa1894d25fda36a1ddac0f7407606bd6", size = 161686, upload-time = "2026-08-07T10:48:52.174Z" }, + { url = "https://files.pythonhosted.org/packages/f4/2a/8ae77f9719d42ce71cd708560a3557b38ac3c17a0383e57f87084de45bbe/librt-0.15.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5563302a8359bc2295bb7084d1a8ed1519df96afb30eb2aa4e0bff7b54228988", size = 710668, upload-time = "2026-08-07T10:48:53.782Z" }, + { url = "https://files.pythonhosted.org/packages/61/34/c0436ea134deb9a0d6da80a396a2739a81cb31e0418f7227239e23140898/librt-0.15.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:22d6263b9d39d7bbb286fa791945646e3218f1be2d693e36fb630f1d0e59cd13", size = 679396, upload-time = "2026-08-07T10:48:55.645Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/001e0d99aa9250d5cd5715a9081291a20656083459f9019cda15255329e1/librt-0.15.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39ffd14646190c454f0d86e0d256b33f00a87a26ab410e619773b841d0e41416", size = 704313, upload-time = "2026-08-07T10:48:57.46Z" }, + { url = "https://files.pythonhosted.org/packages/2d/53/b34fa9d0ff00f136f4d58ebb4c411ff634baed1eb412bb602a2bc8dcafcb/librt-0.15.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c47318cd3a61401452de11282242937e3e057c4fd3dbaf601e269d0928a06c0a", size = 729847, upload-time = "2026-08-07T10:48:59.231Z" }, + { url = "https://files.pythonhosted.org/packages/86/ac/fa4d7a424665040e95baf480a6d523446057684b6758624c85338e8a23b2/librt-0.15.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a56a1d4f859a82ca5b99fc4b82c9b027b15e3c455c5cd99e7d0719f27bb20b6c", size = 742736, upload-time = "2026-08-07T10:49:01.151Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/e17a9bb5de6fb8c3186ed1a7d68d21618b027ac2d3633e03d3b6109c67ae/librt-0.15.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:077471b3182db4e17c36ae91555f36a4d2c00080b267f749bcad34a478a9a302", size = 763454, upload-time = "2026-08-07T10:49:03.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ec/ecd02cd30935b931b9cdbfed6ab5a099c51b280b4e7baa274da80978ed27/librt-0.15.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:411ca4d1b905b860ceba7570dd6717a71dedaddcc4b0f77ece710aa41ee11f8d", size = 743296, upload-time = "2026-08-07T10:49:04.941Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b5/b3c2b8353ce820a4854f78d19321344242f89fa71c975b71132ba9bf242a/librt-0.15.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1256589e0b0adb31751d685a68bce29d73407ddf4ef05d4188f49d5dcf9566d9", size = 756217, upload-time = "2026-08-07T10:49:06.825Z" }, + { url = "https://files.pythonhosted.org/packages/3c/52/6cc22542ba59146b05cca2a656f9ff8bb67e38e63d12c3b0cc183d837bf1/librt-0.15.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:f42b74a53e5f26a0ba0007411a7455b66c67ce4022a39cc1f56fc4efd65bcbab", size = 741934, upload-time = "2026-08-07T10:49:08.839Z" }, + { url = "https://files.pythonhosted.org/packages/40/32/a04b72b1aa86e3be23b2ecff8c1aad2dcc955bd3956d6d26e7e34267e57a/librt-0.15.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:291bf73caf78b9e88d6fae9bfd693207ff7d832e2fdbe2cf8e746bc13f5f892b", size = 783763, upload-time = "2026-08-07T10:49:10.661Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f0/89eb11dffbe9279ff37144dec786927314502ae0b114f1449dc78c458aab/librt-0.15.0-cp315-cp315t-win32.whl", hash = "sha256:c16d15ee371643ab48dc8248a3e680ebbeca573a13af2c3dd0c985b142d77162", size = 104313, upload-time = "2026-08-07T10:49:12.305Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4a/1f1978c200f563beda63c36adff2d65bbecb81e365e8e69e572f5f70fbc6/librt-0.15.0-cp315-cp315t-win_amd64.whl", hash = "sha256:dbd605739f228912dc49027cb764456b9757750bdc2b6b7773164db7096c6fd1", size = 126889, upload-time = "2026-08-07T10:49:13.881Z" }, + { url = "https://files.pythonhosted.org/packages/38/a6/800800bfed7b1fb10fc3f3d557785c3854e80d3f7a9800d784b176a1fc2d/librt-0.15.0-cp315-cp315t-win_arm64.whl", hash = "sha256:84d244b00604d17df3fc7736c327892d6bba66181254aa4087be807b6c342bdc", size = 110700, upload-time = "2026-08-07T10:49:15.499Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c1dafb7c59e685692a2eeafce83245b7c5f46e05881fdb77a0cbb7c19c74/libhxl-5.2.2.tar.gz", hash = "sha256:3a74d9f23561bfcefd20e5229c574bc68dfc114fdb6ba1ba684d9e9d7ea52483", size = 127736, upload-time = "2024-10-25T09:19:11.202Z" } [[package]] name = "license-expression" @@ -782,150 +1151,205 @@ wheels = [ [[package]] name = "lxml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, - { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, - { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, - { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, - { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, - { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, - { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, - { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, - { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, - { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, - { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, - { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, - { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, - { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, - { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, - { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, - { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, - { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, - { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/a9/970b8fa0ecc4fbf1dfaed0d89bbc1fc1421b25ec26a2038c91e872dc6c8e/lxml-6.1.2.tar.gz", hash = "sha256:1055241852f2b02068af4a625a5d32c087db193c12251928af2562ecd2239f18", size = 4210626, upload-time = "2026-08-19T04:58:15.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/a4/55eb54507073089ab27743c5da2113c84f0d0b1715b33175fdd943c9652d/lxml-6.1.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7d506bdba580ecb1a6ad2e2b5c49445e66d3e1f95894885739094393a1aad237", size = 8602111, upload-time = "2026-08-19T04:58:28.017Z" }, + { url = "https://files.pythonhosted.org/packages/bc/bf/6332f45d78da385bb01d5cac3fe4acda19f025d1307cbc7ad538355fecbb/lxml-6.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12acd337d2821cb8b9247dfe4b7aa2f2769a3df5ae8511b7e550df42b8f4d3c3", size = 4638376, upload-time = "2026-08-19T04:58:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/68/e0/21fba0fe74d417fbe976903ae6bc77e92cdce01aae7b636abd87756f4588/lxml-6.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5078ff51e6316c0f75ea8127c2cd24374747fb351f62fb93d1761f8ae5a04a40", size = 4939689, upload-time = "2026-08-19T04:58:48.526Z" }, + { url = "https://files.pythonhosted.org/packages/de/e5/ce3e885264fdd0bdcb6b49c1ea1842f94281b39e4ff956099e8d57532c60/lxml-6.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9477e14217c212e6023c994a71a1a349db19b0e10fd5bf189666b281ae63b1fd", size = 5105185, upload-time = "2026-08-19T04:59:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b6/990a8446c488c70fa25681e150de94b7bf2eaaf387e374d195ab3c8faafb/lxml-6.1.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:261d98065326676d7253882db0198d0aa06748d7ee0443367acf10b148273f99", size = 5011863, upload-time = "2026-08-19T04:59:50.58Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6a/f70f41363dae27e3bfd6224b128f5ba150874bd32ca4938552930ffa33b0/lxml-6.1.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0666943ee1576fa890a6dc6316ef42e8241b5dd56f67bc5475acb2ac298c6ca9", size = 5638234, upload-time = "2026-08-19T05:00:00.802Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/a65b64f34d556925faef2c4f14167d58c571bc15a3e1f2bba71138830562/lxml-6.1.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04cf9e3f4ee9cab9d9ba05401bef8668840fa9620fcd4d8e85a2d2fd0b0fa960", size = 5244532, upload-time = "2026-08-19T05:00:07.516Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a9/471552e015e954fc9d960aa27c3d67ebf489683d03f033399a790417c67c/lxml-6.1.2-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:9429d2371d406344ed1da5b5686d9412e74137c07b0171278368ff704f470ed5", size = 5358194, upload-time = "2026-08-19T05:00:22.747Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0f/bc6248fbec2cc416f102b1267f1567e07510f6fa909bbe8cd2a22d6fb78e/lxml-6.1.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:eff128ffdc093cc6317955934ad9751105d37ed8dbca3ff4ccd751af6be37185", size = 4704432, upload-time = "2026-08-19T05:00:51.115Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3f/cec859f50e63f1fa338fab43d2362d7543e1237f2475960d8ab0769de0eb/lxml-6.1.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ba58574d710b82ead7cbedea01cac3e110bc3ef82d4731519b74a2c11f7cf5e9", size = 5255038, upload-time = "2026-08-19T05:00:58.895Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d9/2ced0cf2967115f92a1b8b3ae6bd18763abc3ebef88c98cf25145fda396c/lxml-6.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:52f6d4dff133c9778a24e9a2cfc1608930b15869866171aacc5131b5a418a003", size = 5054481, upload-time = "2026-08-19T05:01:10.096Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f5/4f07386d3c88673daeec3b8cc09a2a4d39fa01c1fc49009791b0746d97fa/lxml-6.1.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:8807998c1023d1e9d60e02500f90e85a0752dbc0b670989806bba87b82dd5b42", size = 4785535, upload-time = "2026-08-19T05:01:18.909Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5a/f4fe3ecbc189f48fba2547c5db5c940a10151d3e86b856a60a533a77e816/lxml-6.1.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2170d0a280c877b6e2dc6738217db947be35dd8cf09ca458b355aa1bab2a9e70", size = 5655337, upload-time = "2026-08-19T05:01:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/f586aa1bf27bfbace2dfdbb704da5c52f0bdece8ee440c8fb4946c940b2e/lxml-6.1.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c67f3c1278f942e97d8665c2a690324aaea5137de16f056583a21f0ac706177f", size = 5245778, upload-time = "2026-08-19T05:01:45.227Z" }, + { url = "https://files.pythonhosted.org/packages/18/a1/677494bbaef4d6db5e4633af817414f478865850b55c03ae4bf70fa7b8ca/lxml-6.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093fbf547d0f3ca02705381f795a050fbb58988be4aac7f79f99f280c4082313", size = 5267274, upload-time = "2026-08-19T05:01:57.687Z" }, + { url = "https://files.pythonhosted.org/packages/5a/71/b71425b8764d4cb7c92eb970483be7d5610dce2a6316242b5aaae7d260be/lxml-6.1.2-cp312-cp312-win32.whl", hash = "sha256:be365ce8d2d411cf2fb573747684b4fd470fa6224e0094d9d5a21155acc369d3", size = 3602563, upload-time = "2026-08-19T05:02:01.837Z" }, + { url = "https://files.pythonhosted.org/packages/1b/fb/909584e16d2148c1a252cc2c32dd99fe0e2682459c586d3d7a192e74a0ae/lxml-6.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:b97153ca609b434b712ddfb92cd6af101a7045a7724c542258bd4727a344472f", size = 4005965, upload-time = "2026-08-19T05:02:07.157Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8d/41207c9212caad0b52749e34739fb9bfab67486729f52a8fe9bd9266fee6/lxml-6.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:7feb72424f19a893ae4f3373c7aae821b1aacb6076b708915c651f0683a97c49", size = 3666641, upload-time = "2026-08-19T05:02:11.3Z" }, + { url = "https://files.pythonhosted.org/packages/61/2a/e9651f47a31a60b5cae031abc23391ed9aa30c8fc07571d1a38f58d6d770/lxml-6.1.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:351318f5c0eb7fcab5b4fdb507c6f88fb2c4b5e67784c7e5911448c91fffb5d4", size = 8590165, upload-time = "2026-08-19T04:58:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/61/87/a8098abaf35118767d1703b84c98940a5d833064e0eca39a00ecfe9840ab/lxml-6.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0edde95e4b4278dcc0175eda06dc8aa2631ad9f83ae5dbdbc4f0925e200b0b0", size = 4632474, upload-time = "2026-08-19T04:58:47.465Z" }, + { url = "https://files.pythonhosted.org/packages/93/cc/fe74d1def7f4fb967c4a825608a074d4dbdbb871b0d6bd59c6ed07d67868/lxml-6.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8326e24ae6c3a6bfb03fa8b4793f9a5d804c125228aa067f652b0428e31b87c", size = 4936196, upload-time = "2026-08-19T04:59:03.477Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ad/b96e6ca926e26726a99aa643602aac7411ecc1731ddb1b25af8cc57edfcd/lxml-6.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7c534ed898413f439b048130011e99a4245ee13d62d431f6b4f7f2484d02a93a", size = 5093290, upload-time = "2026-08-19T04:59:17.498Z" }, + { url = "https://files.pythonhosted.org/packages/d2/84/616f5d3b7cd086fcfba3e5add6fccda67f976c1c753ae9ed7bbd317cb9be/lxml-6.1.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e37fe49fe2d5aa40a2cb1cc8176673ad7de0d124e6f4a509d9318f5979c7871", size = 4998767, upload-time = "2026-08-19T04:59:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/80/88/d5b453a8d083483c9442ad7f5ac5c560796022eb5c80d60b65d75e449236/lxml-6.1.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9b52ea73a37fc64aa3357ff8607801d46dd170506d3cf8253a91a1d91639d4f9", size = 5626717, upload-time = "2026-08-19T04:59:40.045Z" }, + { url = "https://files.pythonhosted.org/packages/71/45/31e5aa4d4bae024908ba1d03480c7425cf027a28b7e5c88d1b7202bd80cc/lxml-6.1.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8b9a92652e75e7731309ea51db5dee892eef414ce70a6ec3441e5d36bf5189f", size = 5232330, upload-time = "2026-08-19T04:59:46.175Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5a/2627912420df8b2d31ba3014da5539f15ec85add01d42048864ffefda516/lxml-6.1.2-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:9088da25ecd609965f838d89fda0465a905b48f4dd90331db9845518f2177372", size = 5347054, upload-time = "2026-08-19T04:59:52.762Z" }, + { url = "https://files.pythonhosted.org/packages/16/86/54ac0f529b22a8f12313726dd49e12961bb46471d9028cc28d2a29408f0b/lxml-6.1.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:0349321a0537d4fdbebb2af06dd1b64676132c72e2ae250de8cdb58f8c43019c", size = 4707275, upload-time = "2026-08-19T05:00:04.836Z" }, + { url = "https://files.pythonhosted.org/packages/3a/42/ffcdc6e4519be90df907cdae7e88409efb25d823ae4de8846f737dae1884/lxml-6.1.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b20440e578d269c5e8a722ab602ddd0f0cedb8b080006b3f936da9991a593d3b", size = 5240071, upload-time = "2026-08-19T05:00:19.604Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/5b1d7ab35f013f1127ec48f3108319f58b65b00d5cb26f215adbe86eadfb/lxml-6.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7766e525282dd38fd89567311323e441996eb958e8e816d16b38f782e3aecd2a", size = 5050356, upload-time = "2026-08-19T05:00:27.968Z" }, + { url = "https://files.pythonhosted.org/packages/b0/57/1cf049d054189b55c8fe8012269234f6602256949b69cd3ba80608a88219/lxml-6.1.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9221442682c27417f10fe11184ea4cce174b25ab52465570b1f3ee3f85f320fa", size = 4780394, upload-time = "2026-08-19T05:00:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ad/064488a8fa60e639fd773e421a18bf17541d02a95fbf36238ad7c65f69d4/lxml-6.1.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75530642d8471327e691ab9b0513a5f9c77f38871014ceda40f51bb51765c0a1", size = 5645854, upload-time = "2026-08-19T05:03:42.697Z" }, + { url = "https://files.pythonhosted.org/packages/85/bb/120e56f3cf1c149bb3b014278fb86d0a6dd552403981081f0ee0a0a57be7/lxml-6.1.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:678e35f1cbca98f55107511ee21a60568535c950f3c2371819bd64504c980d20", size = 5231132, upload-time = "2026-08-19T05:03:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2c/7d49aab893c128671a3276580074cce4c002896145b8dd2893da79633bca/lxml-6.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c2bae42b3a09f977330a08f4a8fe72aec58c4bdb89069d3fe7272a71d885881", size = 5256076, upload-time = "2026-08-19T05:03:48.092Z" }, + { url = "https://files.pythonhosted.org/packages/72/28/ddea3aa1fa9acfd384fe34d4a2a93eecc07541dd2d922fa9b140c60d8014/lxml-6.1.2-cp313-cp313-win32.whl", hash = "sha256:5848f3de6a8de8a93cff9f068134393ff5fa69ac2a04399f7d49cd67c61c348c", size = 3602177, upload-time = "2026-08-19T05:03:50.571Z" }, + { url = "https://files.pythonhosted.org/packages/1b/7a/96bac167538748cae2544335855f812fa33e49a9a67bc8b8520dcbd592bd/lxml-6.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:6cb0c87421946030b92b558be416852780a912454e3dcba0998e4497c9c588d5", size = 4004117, upload-time = "2026-08-19T05:03:53.074Z" }, + { url = "https://files.pythonhosted.org/packages/0a/24/9498fa3c84135956e5ef55ea4d8bd11e999e381f7f210fb6f8c6a980ef03/lxml-6.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:648861c19b775b89ebefa14586f85090b10163367476d77f242c4131c835ce73", size = 3665412, upload-time = "2026-08-19T05:03:55.621Z" }, + { url = "https://files.pythonhosted.org/packages/27/b5/728b0578791b397ace8d1b101c8b3fe10f36043542f7bb85f82d8bdc3f50/lxml-6.1.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d50a44113fe6800dcc8a859332b823a4735b1e6ae1b0063882e4cca569ec3e29", size = 8609651, upload-time = "2026-08-19T04:58:42.42Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6b/49209fa6225c15c48a30061f03d3aba75e3c19634813b88bf83b88c525ed/lxml-6.1.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fa813b0247d0543a563b993ac3dba6168eef59e3a61448432cf5453300c2412b", size = 4639588, upload-time = "2026-08-19T04:59:01.501Z" }, + { url = "https://files.pythonhosted.org/packages/20/86/80bae4e8bc2eed9d6f017701a3d86fdea56936218efa738911d0b76aa7f4/lxml-6.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d858e718b94033ab4b67e4a58fe3114c65bae01ae2314a62fb39ae8897ed4324", size = 4964846, upload-time = "2026-08-19T04:59:08.59Z" }, + { url = "https://files.pythonhosted.org/packages/70/ce/4782caee7a22959c1ac67cb46495e03912c22a4ba7d20c163496a519e815/lxml-6.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e3b666f57a5d81562f38c766c762416b0f6eb58a00590546911514b48412abd", size = 5099288, upload-time = "2026-08-19T04:59:18.649Z" }, + { url = "https://files.pythonhosted.org/packages/32/21/f120967cc43b54e05512dff0c39726b832c836195d30f41f88733ef36ac8/lxml-6.1.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26ff164c6629e5c4d11c9e55d5ea3d6eed0be2a420eee1f55cbce6e2c23e231a", size = 5036837, upload-time = "2026-08-19T04:59:47.217Z" }, + { url = "https://files.pythonhosted.org/packages/61/ba/8005e9f47598e3ec5c18312c77f94e889580027616678848405c6aeba5de/lxml-6.1.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:962c12b51d0b164f12569af225dea57568477e24a845b96eaccbef6c07e4cc03", size = 5658569, upload-time = "2026-08-19T04:59:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ba/add33b3c7ce51462cf7a4637bcfec2eaa258364d6015b989dd7d1216e6a6/lxml-6.1.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47e367dfe341521426692819803e260d0673899c0ff611f14af978d725e2c999", size = 5246003, upload-time = "2026-08-19T04:59:59.764Z" }, + { url = "https://files.pythonhosted.org/packages/05/b3/a43012748fb861c914c5eac1c1a3bad44282e767499cd02280d4d1edf092/lxml-6.1.2-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:92c2b366028ac01e90399e6d17734ce6e4f4aeddd8ba75fbaf80ea11d6c6d645", size = 5354047, upload-time = "2026-08-19T05:00:21.657Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cb/813021d9a445713b8d758b9e5eae2ed392cd598d9f119d9b053b37c2ab93/lxml-6.1.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:7e81fc065ede5d58dd0bf0912025aee1bd04c52c2affd61fdb93226a97ce2fc6", size = 4704382, upload-time = "2026-08-19T05:00:47.067Z" }, + { url = "https://files.pythonhosted.org/packages/17/c9/1155299f4577bebf3c280497534a73e4b8ad8cab3b96074731ad10949d4e/lxml-6.1.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:633ac039cb32366dd5935868e041e385875c017b8cd54ea56aeee3fe29ca5935", size = 5258530, upload-time = "2026-08-19T05:01:14.893Z" }, + { url = "https://files.pythonhosted.org/packages/25/6e/d76e58384b378b877e140e25b9a9835da00035f81ff70cbe943a3749bf27/lxml-6.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f3194777c0d05945ac91d8594be25d2679d1d826e01e1fc90bae568ff3a547b", size = 5089919, upload-time = "2026-08-19T05:01:33.602Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b7/898013c0f8891481d0624ab3bd5dd8c8ff827232dfee2a5d1f8bf970a7cc/lxml-6.1.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1133bd969f2bfcc6b0c0cf7cdf5f2631e62b23fa2471ee8bd44f6ab73554ee9a", size = 4741972, upload-time = "2026-08-19T05:01:38.18Z" }, + { url = "https://files.pythonhosted.org/packages/c3/47/efb53c4d7b655831c03317a450d9da439b0829c61f34d9d4fe7c863445d6/lxml-6.1.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1edca8f4a92b94e873093df959f141d388f2141fcad0c47598442fb4730ef57a", size = 5683241, upload-time = "2026-08-19T05:02:00.731Z" }, + { url = "https://files.pythonhosted.org/packages/da/0a/0ff36a584cbba14a71326ee8a5300694400f0b97927d1f90a87d95b17d4a/lxml-6.1.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8512b3775d68994dd1d6d533161e0a214f2ad9c634659d34a99c98e86c6c3d68", size = 5245892, upload-time = "2026-08-19T05:02:06.108Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9e/303717a1aa56d4bd775c91936717d3c9e8d999a8e8b68b00979c4c1f93d0/lxml-6.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5005c0c9e4d749a76a2ff8bd5918a8bb248df8e08e73a55654b9f79c9cd1e2b", size = 5269528, upload-time = "2026-08-19T05:02:09.883Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c2/2ae7cb97089eb86bf0689516db3cf280a007b6145853d2a0235a1f01683d/lxml-6.1.2-cp314-cp314-win32.whl", hash = "sha256:e17e2c30e27f56da5551e7a425888b45f013e940b99ab07d125a1c33f77a4605", size = 3662743, upload-time = "2026-08-19T05:03:02.513Z" }, + { url = "https://files.pythonhosted.org/packages/77/13/a3d483230a09201e211ceb1aa208b1374d27d23b8b180d74dba14b30f6b3/lxml-6.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:87e9673cd8a3445024fe38e7f91b55fa3428437eec9b7a7ff7d81979520c0d2d", size = 4073942, upload-time = "2026-08-19T05:03:04.864Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f1/c1445d4b6ad7c51e39d4e2ebbf015a4880f5b297a4ab0e77e4d0e5b70110/lxml-6.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:878e7c8ada8f92c52f13f35a2ab98ef0adf7fd0211d164fc2af589e4c3cfed63", size = 3749235, upload-time = "2026-08-19T05:03:07.239Z" }, + { url = "https://files.pythonhosted.org/packages/9d/eb/598c76f4ce19a67c635e86a46d880cc854f308f39a6f1fdf13bbb01813ec/lxml-6.1.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:94162456ed0a64fb1c06915df5bd06af4675ae3966d6048fcb73b0906e0e0222", size = 8860315, upload-time = "2026-08-19T05:02:14.39Z" }, + { url = "https://files.pythonhosted.org/packages/da/c7/1f9fac7b566a86ad0da13dcc0259164266469c0ad86744c740ccd5c2a081/lxml-6.1.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4b0fa7109b1d0bc1747d8241a0853e135eefb1c978685241b544c46937383efd", size = 4755176, upload-time = "2026-08-19T05:02:18.705Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1b/cfda9307388d496e7eeb7493d9455896b8137ed95f51f3d6ae6ddcc14a47/lxml-6.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:604f4778632588d7c000e7e19430639dc12fca58b5b6e99edffba7631725ef0e", size = 4979444, upload-time = "2026-08-19T05:02:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/e5/71/f732c8919c45b7f29acf443288c6e90036877a67bfeeb1acceb0fffa011b/lxml-6.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a096d6a5f96b776a5b020cb45c17c545effd2a3b6639e6fa97bc95537600923", size = 5115887, upload-time = "2026-08-19T05:02:23.62Z" }, + { url = "https://files.pythonhosted.org/packages/30/00/121d52b944f41e33ea86c62875f902d24982842dc7231ab154ac5a6c6593/lxml-6.1.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6454d184d556eaf4cb3d6f69e405d21602d6fdcf08b8d57796824275986c6595", size = 5032418, upload-time = "2026-08-19T05:02:26.114Z" }, + { url = "https://files.pythonhosted.org/packages/70/19/cadb73c7fe48c7563dc8ab62ea53d5b920c8911bfb808507a6daa82e78d2/lxml-6.1.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b68f2548259bb04e0b3d5df0c397abe8b0080f5e1ffe4019fb7a8bf01a9339e", size = 5603304, upload-time = "2026-08-19T05:02:28.694Z" }, + { url = "https://files.pythonhosted.org/packages/13/32/9de126a14d5a5db8c371c5ec869178417db226707b62a47273a95ae6df7f/lxml-6.1.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c9cc4b6532abe154dbdebb42aaba8d52c852919591e45067f5b7d46a0405e88", size = 5228938, upload-time = "2026-08-19T05:02:30.99Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9b/22dd9e843629ed04652591fb220eb2bf2394d97be3be377d60d8083405d7/lxml-6.1.2-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:57188e441ab24f906bd5a5c14eb55363ab51aa6c0de549f3dd320043721cc118", size = 5317790, upload-time = "2026-08-19T05:02:33.301Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2c/b12a1dc121f81c280635c721c7bcaa341441fcbe37397f60b8915048aece/lxml-6.1.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d0bfd719c254bbe60ea022cff0e6ffb799a6fa7d4d72852cebe0257957b32d68", size = 4646468, upload-time = "2026-08-19T05:02:35.504Z" }, + { url = "https://files.pythonhosted.org/packages/57/41/fd87a41edc531e7969c25ab1d6b52b5b041eb108b88f6394d6afb4374396/lxml-6.1.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:be6f87cd224254a8f81324e34cc655508b83f1d70458a1a39857ad2aa9925852", size = 5240607, upload-time = "2026-08-19T05:02:37.805Z" }, + { url = "https://files.pythonhosted.org/packages/6e/30/713ba813b6e6673c6dc34733746516017efcd17949b767b154cc50bccf20/lxml-6.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:074a88f70a7360a4a0c5be5d898062cd26f898c25b459efb1bdd43ae700c5a1a", size = 5086495, upload-time = "2026-08-19T05:02:40.099Z" }, + { url = "https://files.pythonhosted.org/packages/33/f8/6532ce0fecd9c326d06b08274ee075cc28dbc9f5e9285355db8504689114/lxml-6.1.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:9031f5f01452681abf39fdd65f84a70cb01a7572a1bbf570042e826b1232d07b", size = 4758801, upload-time = "2026-08-19T05:02:45.434Z" }, + { url = "https://files.pythonhosted.org/packages/74/b6/5a1f7833ebaa0dd33c28f6f9755ec6ff3891bf63f097634b44e6da1bb65e/lxml-6.1.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:cfeac14425fc7a6fca7864b774d4ee63547926158f4a18c67d77b2c9a948acf1", size = 5626977, upload-time = "2026-08-19T05:02:48.092Z" }, + { url = "https://files.pythonhosted.org/packages/e6/20/6ae0fc1b45e20877cdcfb1168ceeaf9abb0fba5ed36bd639a260e7b2101e/lxml-6.1.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8ec111ff8067325f85c08aa9c2b26179ec0537bb89c003fde31127139f85f82d", size = 5235036, upload-time = "2026-08-19T05:02:50.726Z" }, + { url = "https://files.pythonhosted.org/packages/47/b4/2bc7b37fbb990ccfb7d30393660741592177224a94e07d842c8da70638e8/lxml-6.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:48e912f37c99a297175ba955f55a47c0e1c834b506ef162e52a6e4fe276e6e45", size = 5252270, upload-time = "2026-08-19T05:02:53.454Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0b/07fb8e1dee29a78e2c5fa5c6c914218be76a6406baff27907429566e90ec/lxml-6.1.2-cp314-cp314t-win32.whl", hash = "sha256:7c444c3a6e8e75334879980eed96568f0e12064c8b1913424eac1805e976736b", size = 3902666, upload-time = "2026-08-19T05:02:55.607Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/3371527bd9820aae6f511697c93032ed197b0d8dab0f17818f18d3099637/lxml-6.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:7f35ba7667004ecdafebbe08da7c9fa06ee6195275bb7ef7a29ee1901e69519c", size = 4401011, upload-time = "2026-08-19T05:02:57.899Z" }, + { url = "https://files.pythonhosted.org/packages/e6/bb/e6de9b2546a4e6df4fb52fb18921906a8b7a041aba06570995759a4d6d8b/lxml-6.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d117f39b28ab8a330a74abdbe61c2255b51973b238db25fd6c2448de1eb2a02d", size = 3823384, upload-time = "2026-08-19T05:03:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/0e/83/7ff98683e14a148191278728d11ba782c3d5137886d49fd95ab4036efa1b/lxml-6.1.2-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:1e3c67b817867c484794d7fe0d73045d7d0c67460c78a0a1249a9e92266e6a0e", size = 8609183, upload-time = "2026-08-19T04:58:32.19Z" }, + { url = "https://files.pythonhosted.org/packages/24/39/c39f05e8240e98009dd3d4ceb248319d0f36467babc5f90a909ed0c5b68a/lxml-6.1.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:d3e97ac4353cca3fbbfa829bc0c6a913771573d1c6d46932d4335c46f2b7796a", size = 4639898, upload-time = "2026-08-19T04:58:39.017Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bf/25e26b089510940a0777ab334357874569255e50930224c8159cd649e754/lxml-6.1.2-cp315-cp315-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:827438bf6c8292d22a409bb7990d7cffce410f33e7664e46ca74d2ecc26975ef", size = 5037527, upload-time = "2026-08-19T04:58:46.224Z" }, + { url = "https://files.pythonhosted.org/packages/65/6d/aed3a58a3d662f7367a537fabe8c549f1446dbd043719e0ae8cd53f47819/lxml-6.1.2-cp315-cp315-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c470d192e27f97842a068cf12a1c1296b20ca716c56a9249715c6654bc192d19", size = 5661918, upload-time = "2026-08-19T04:59:02.534Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ca/706d32b6957c0c2e005a9833e8fc528449196b38d5cfcf9e0fd86a96fb00/lxml-6.1.2-cp315-cp315-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef0b8ba6e13597f681b2b4924ca9c4e8c88420bf0e21d9a9006c757f2fc39d1f", size = 5249359, upload-time = "2026-08-19T05:04:01.956Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e9/445ff43f56fcffa06f6f3a7189920c216f3eacef68ef834d4111cdbd86ba/lxml-6.1.2-cp315-cp315-manylinux_2_31_armv7l.whl", hash = "sha256:65c32ddc5d0750129c7b119fb57d48192b76d334c21e6b690d19dfb06b34af79", size = 4704548, upload-time = "2026-08-19T05:04:04.57Z" }, + { url = "https://files.pythonhosted.org/packages/69/78/20b8b7e79a1b1d9cd4465c332d62962858562b446692f16a27068fa54b85/lxml-6.1.2-cp315-cp315-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0aa07065497f191ad26c4b587ce5dbb5a7105285a3789aafd0661750e8bac537", size = 5261170, upload-time = "2026-08-19T05:04:07.336Z" }, + { url = "https://files.pythonhosted.org/packages/54/ca/84a0e1148bf511e12e0d99732a4e136a3bf1b91622f0a1b197796e2ff984/lxml-6.1.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:cde6b8db7d2e5135129eb5e74b7b44dd2053aa767cd5023541fccedddc262453", size = 5090576, upload-time = "2026-08-19T05:04:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f8/1ef6fc7070bed8753315f2e4ea66bc0d37620e1444d014db7f0267b8faaf/lxml-6.1.2-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:b28842b30c4bc2e6afe137d98a5d2071a62589471e76d053bea55b0e53298af9", size = 4744614, upload-time = "2026-08-19T05:04:12.717Z" }, + { url = "https://files.pythonhosted.org/packages/87/f6/3a4824cd1c1b81d996d2d75bbd176ba13fbe9b5d89489290d93ff9558486/lxml-6.1.2-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:11f529062255209a421ae4de5b1bb36b2f0a2e1a700745e675a4bf4084d13c00", size = 5685792, upload-time = "2026-08-19T05:04:15.367Z" }, + { url = "https://files.pythonhosted.org/packages/64/9a/f133bf16a67149e00ca5d8a8f1ae662c30a86c303aa242693b67f8e19856/lxml-6.1.2-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:f8b89b3be75a37509602b03f9cfa1a28298d4eed4625748148307aeb907901b7", size = 5248972, upload-time = "2026-08-19T05:04:18.491Z" }, + { url = "https://files.pythonhosted.org/packages/50/63/273e7e8a73a5d183d8552dfdaa131dfda0292ddab7bcddc5a66a0ae525d8/lxml-6.1.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:1a2331da06dd55a8184985306eb2afd72d708283ce7e85d67bba77317b785060", size = 5271809, upload-time = "2026-08-19T05:04:21.448Z" }, + { url = "https://files.pythonhosted.org/packages/49/eb/614117c36a28909e79ff7cdec87008f0bd996478f35cf72309189cf398b1/lxml-6.1.2-cp315-cp315-win32.whl", hash = "sha256:442766b326d9892585a64e8c6c4b5ab81d0e6c0538c9f0fc11a84dc101a5d97f", size = 3662854, upload-time = "2026-08-19T05:05:07.141Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e9/06aee6107cf8e7b870f10f82539f366cba10dc6053144cca80e838caf8c8/lxml-6.1.2-cp315-cp315-win_amd64.whl", hash = "sha256:a7fd1dd6faa3df9dcd8f1765237362cd885ca62cdf77a7c5f5ea383ae5b6048b", size = 4074590, upload-time = "2026-08-19T05:05:09.697Z" }, + { url = "https://files.pythonhosted.org/packages/84/bf/dad9b6baf9b26d79584834e15cef2a5dd0a13c7b1df08831e8f18244b494/lxml-6.1.2-cp315-cp315-win_arm64.whl", hash = "sha256:054175250531a5fb102d485743ff16412279c93add12385b3b1c3d7b16d8deaa", size = 3749336, upload-time = "2026-08-19T05:05:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9d/cd0c43d45e2eb52df7735c6558f24054ca633499191899b0cb9040fbbc3c/lxml-6.1.2-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:84a2a46b93b789d8acb44cfcb3d967ce9dbe29884ddb93fbb1a33f0e0c8fcd86", size = 8857688, upload-time = "2026-08-19T05:04:24.648Z" }, + { url = "https://files.pythonhosted.org/packages/0b/26/27093dc1a9edbdd8a54652f237a387f7e63ec0192efe708bc2576d8a1383/lxml-6.1.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:4aced3284e0353c798b060fe2c175eb81410e99b9a7e2ae6951be5333732b111", size = 4754422, upload-time = "2026-08-19T05:04:27.645Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ee/502f7c93507f57eb496744a64da8f4ca86855cf88e48d14584342f1bfd92/lxml-6.1.2-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47c92dc5167de16e27ace8332454f12ba172dcab04f7a78a9eae14e2e41b6a41", size = 5033396, upload-time = "2026-08-19T05:04:30.054Z" }, + { url = "https://files.pythonhosted.org/packages/bf/72/c4cbbe72f951650f2afe43a70e51687e111d82b9bec46e3310ea76419d46/lxml-6.1.2-cp315-cp315t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:40366c23a938008a3bedfcfd80709b3a857c188b4d710b083e978ef5d2c1c715", size = 5615298, upload-time = "2026-08-19T05:04:32.752Z" }, + { url = "https://files.pythonhosted.org/packages/14/83/a3df966d6d7b6513e9dfb6fbfb041c0619642170359c1b36ab20a83e59eb/lxml-6.1.2-cp315-cp315t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c4c6dc1b2485aaa4adfb6ed754f90dddcb2b96a66bbebc9e1ac242b5ce5e818", size = 5236282, upload-time = "2026-08-19T05:04:35.762Z" }, + { url = "https://files.pythonhosted.org/packages/4f/85/8692ec8173c9f8d295735b9bf410d202317e7b3ed11141e80a30f421f409/lxml-6.1.2-cp315-cp315t-manylinux_2_31_armv7l.whl", hash = "sha256:3a698fad6f122a9b3e2dc2fb598c1de7329c74a67c7a334c9109a440de2508e5", size = 4650647, upload-time = "2026-08-19T05:04:38.396Z" }, + { url = "https://files.pythonhosted.org/packages/11/e7/dbe3cece28a5bf82997a091d9dbb0fc49e725a5fa86550897ee2cf6412e6/lxml-6.1.2-cp315-cp315t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:14879fa5eb2b793c040bbfcb62011aa3015c65d6c9875e063ea98ce2029d51fb", size = 5243387, upload-time = "2026-08-19T05:04:41.247Z" }, + { url = "https://files.pythonhosted.org/packages/99/a9/81a2d27640db0d27200b2f32339a54e74c36d58feb5ad528b87d52a59ecc/lxml-6.1.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:b631174cd2e4d9f8a94ef17f911c6ded10ede93b5e7860dee7bbf85961d321e9", size = 5092624, upload-time = "2026-08-19T05:04:43.919Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f4/0b0304c70c087f618d95b0306738b070bd556afd09c2c92589b78dbe5eb0/lxml-6.1.2-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:ceafa5e0536c62a5cd9f65327fa0b57d6f0b0e3435daf2c98a78d0dde7ecbae1", size = 4758742, upload-time = "2026-08-19T05:04:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ec/f9fc45f1d01b632b673e11880e75292dff9953db9f426d1a38201b8eb5f5/lxml-6.1.2-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:7c482e87cc86bed78a50462560675bc2c348ef72c47596f9b933346d5a8e920e", size = 5649540, upload-time = "2026-08-19T05:04:49.777Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0b/d65e0458c2bcce0df68d5cc29ad0006e76446f02d9e50caf188fd1fb8bae/lxml-6.1.2-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:b1c0d2dde8a50520efc51644587f0fc4810e3af7d3e029d7af0be93bf39e2b5c", size = 5234869, upload-time = "2026-08-19T05:04:52.972Z" }, + { url = "https://files.pythonhosted.org/packages/ee/62/1fee828238badd3bfe9544f5cc9ce6ded421ef38e9634030445dedd78b36/lxml-6.1.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dd7ea3fa47154b9fff90591b961e41b3718bd7fcd5bc2d9bb47e9845c8ace088", size = 5259992, upload-time = "2026-08-19T05:04:56.028Z" }, + { url = "https://files.pythonhosted.org/packages/20/18/35fb14dd6baccbffa6daeb2369802f04a94e3f73db3c7bb405dbab009729/lxml-6.1.2-cp315-cp315t-win32.whl", hash = "sha256:87534cec6ea325435e4adf2326b0cf3110eee9a47abf73652eb155db639c08c6", size = 3901151, upload-time = "2026-08-19T05:04:58.671Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b6/07530896ca062bc3d2f09d5cb8a48e799c05b12c496205db03159ba13b6c/lxml-6.1.2-cp315-cp315t-win_amd64.whl", hash = "sha256:4e220a9c297e5d36895d489a08c9a3f1f6193b6414e702c5fb751e4a3767f8d0", size = 4395355, upload-time = "2026-08-19T05:05:01.651Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/237d8de1d77085cfd41d0c6049a044d8d01886f3afb7f1eda2f43d900a96/lxml-6.1.2-cp315-cp315t-win_arm64.whl", hash = "sha256:f16a407766bac51c65d605b06d900821751a79aa20e12185f273f14a17180e7b", size = 3822823, upload-time = "2026-08-19T05:05:04.63Z" }, ] [[package]] name = "markdown" -version = "3.9" +version = "3.10.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/6f/da4c6aea59b3001f2e8c0ec7497475aadaf3b021c10cab5b2858f0f32b26/markdown-3.10.3.tar.gz", hash = "sha256:3589362618f743188b4d955b874402bc814f4f83f544dc207719f4baa7d9c45f", size = 372596, upload-time = "2026-07-30T19:05:29.005Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/4a5af2bc115a9a33fefe51709749de8262be3f9ba063d1753a837cdbc49c/markdown-3.10.3-py3-none-any.whl", hash = "sha256:fa6c92a00a4a3c98b22728c64a935ae1928250ae65058a6ded814d2cc29a4cea", size = 110757, upload-time = "2026-07-30T19:05:27.883Z" }, ] [[package]] name = "markdown-it-py" -version = "4.0.0" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] [[package]] name = "marko" -version = "2.2.0" +version = "2.2.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/6a/32545d2379822fb9a8843f01150011402888492541977a1193fe8d695df0/marko-2.2.0.tar.gz", hash = "sha256:213c146ba197c1d6bcb06ae3658b7d87e45f6def35c09905b86aa6bb1984eba6", size = 143406, upload-time = "2025-08-08T09:47:05.396Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/6d/671a18bb386adca6311bca6c2fe6bec873947ee501cc5f8f509ec06bdde0/marko-2.2.4.tar.gz", hash = "sha256:c042c66f835425673123d7536b39b4660de3b68e30078c70fd26245b31170683", size = 151013, upload-time = "2026-08-12T03:20:11.772Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/b1/87f54d8842b2aafdbb162301ac730587e04f30ad0fe9aabb12fa29f7a6f7/marko-2.2.0-py3-none-any.whl", hash = "sha256:d84f867429142627e896322c8ef167664f3a6cd6ea5a2b70c6af055998041bb7", size = 42683, upload-time = "2025-08-08T09:47:04.175Z" }, + { url = "https://files.pythonhosted.org/packages/d3/78/751d49c8bdfa0b30147c99235516433af6b63eca367ff28593c7346a0494/marko-2.2.4-py3-none-any.whl", hash = "sha256:d80510506edba096ec49d4720a09645fa0bb78e7b7b88697f20032fc19730aa9", size = 46753, upload-time = "2026-08-12T03:20:10.811Z" }, ] [[package]] name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] @@ -996,55 +1420,54 @@ wheels = [ [[package]] name = "mkdocs-autorefs" -version = "1.4.3" +version = "1.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, ] [[package]] name = "mkdocs-get-deps" -version = "0.2.0" +version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mergedeep" }, { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, ] [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.4.7" +version = "1.5.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, { name = "gitpython" }, { name = "mkdocs" }, - { name = "pytz" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f8/a17ec39a4fc314d40cc96afdc1d401e393ebd4f42309d454cc940a2cf38a/mkdocs_git_revision_date_localized_plugin-1.4.7.tar.gz", hash = "sha256:10a49eff1e1c3cb766e054b9d8360c904ce4fe8c33ac3f6cc083ac6459c91953", size = 450473, upload-time = "2025-05-28T18:26:20.697Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/43/7c2f67a2ab0f9d2627d52a5a0a12b4206e4468a109ae7a091eeeb45f6825/mkdocs_git_revision_date_localized_plugin-1.5.4.tar.gz", hash = "sha256:07a785522008e881ff4c307e3259ad3ce00931b2d2147a22cdfbb532ff25e4ab", size = 452896, upload-time = "2026-08-21T06:54:47.302Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b6/106fcc15287e7228658fbd0ad9e8b0d775becced0a089cc39984641f4a0f/mkdocs_git_revision_date_localized_plugin-1.4.7-py3-none-any.whl", hash = "sha256:056c0a90242409148f1dc94d5c9d2c25b5b8ddd8de45489fa38f7fa7ccad2bc4", size = 25382, upload-time = "2025-05-28T18:26:18.907Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7c/a19cdb6e1c6f033cd35df847688f99c4f9b80b626fad87483f2069a6dc5a/mkdocs_git_revision_date_localized_plugin-1.5.4-py3-none-any.whl", hash = "sha256:b5e6b4b9e7d169750b6eb078fd91151bc855e65c019a065accce537ec6e69e05", size = 26155, upload-time = "2026-08-21T06:54:45.673Z" }, ] [[package]] name = "mkdocs-material" -version = "9.6.20" +version = "9.7.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, { name = "backrefs" }, - { name = "click" }, { name = "colorama" }, { name = "jinja2" }, { name = "markdown" }, @@ -1055,9 +1478,9 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/ee/6ed7fc739bd7591485c8bec67d5984508d3f2733e708f32714c21593341a/mkdocs_material-9.6.20.tar.gz", hash = "sha256:e1f84d21ec5fb730673c4259b2e0d39f8d32a3fef613e3a8e7094b012d43e790", size = 4037822, upload-time = "2025-09-15T08:48:01.816Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/cd/c05d3a530ba7934f144fb45f7203cd236adc25c7bdcc34673d202f4b0278/mkdocs_material-9.7.7.tar.gz", hash = "sha256:c0649c065b1b0512d60aad8c10f947f8e455284475239b364b610f2deb4d0855", size = 4097923, upload-time = "2026-07-17T16:21:33.156Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d8/a31dd52e657bf12b20574706d07df8d767e1ab4340f9bfb9ce73950e5e59/mkdocs_material-9.6.20-py3-none-any.whl", hash = "sha256:b8d8c8b0444c7c06dd984b55ba456ce731f0035c5a1533cc86793618eb1e6c82", size = 9193367, upload-time = "2025-09-15T08:47:58.722Z" }, + { url = "https://files.pythonhosted.org/packages/ad/21/17c1bc9e6f47c972ad66fb2ac2568f99f90f1207eeb6fc3b34d094dba7b5/mkdocs_material-9.7.7-py3-none-any.whl", hash = "sha256:8ea9bb1737a5b524a5f9dcf2e1b4ebda8274ae3008aa7845720a97083bef708f", size = 9305438, upload-time = "2026-07-17T16:21:30.017Z" }, ] [[package]] @@ -1099,7 +1522,7 @@ wheels = [ [[package]] name = "mkdocstrings" -version = "0.30.1" +version = "1.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -1109,55 +1532,86 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/33/2fa3243439f794e685d3e694590d28469a9b8ea733af4b48c250a3ffc9a0/mkdocstrings-0.30.1.tar.gz", hash = "sha256:84a007aae9b707fb0aebfc9da23db4b26fc9ab562eb56e335e9ec480cb19744f", size = 106350, upload-time = "2025-09-19T10:49:26.446Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/71/f85bdf13355073ae15a7375f09879375a830553552e58c1c4b7e0bbc5c8b/mkdocstrings-1.0.6.tar.gz", hash = "sha256:a0b8c2bdd29a6416c80d717aa369bbf7831946bd9f23c2a66db1b1dbe7693dbd", size = 100649, upload-time = "2026-07-11T19:38:05.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/2c/f0dc4e1ee7f618f5bff7e05898d20bf8b6e7fa612038f768bfa295f136a4/mkdocstrings-0.30.1-py3-none-any.whl", hash = "sha256:41bd71f284ca4d44a668816193e4025c950b002252081e387433656ae9a70a82", size = 36704, upload-time = "2025-09-19T10:49:24.805Z" }, + { url = "https://files.pythonhosted.org/packages/5d/5b/4c1902e8bdd5c4db63284e9d101dece4038d4025d6d88850ffe0a1578980/mkdocstrings-1.0.6-py3-none-any.whl", hash = "sha256:2703708697487d1b6d6d7b412e176fa436edf120c1bf81dc9e126b12d00893c7", size = 35787, upload-time = "2026-07-11T19:38:04.417Z" }, ] [[package]] name = "mkdocstrings-python" -version = "1.18.2" +version = "2.0.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "griffe" }, + { name = "griffelib" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/ae/58ab2bfbee2792e92a98b97e872f7c003deb903071f75d8d83aa55db28fa/mkdocstrings_python-1.18.2.tar.gz", hash = "sha256:4ad536920a07b6336f50d4c6d5603316fafb1172c5c882370cbbc954770ad323", size = 207972, upload-time = "2025-08-28T16:11:19.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/65/0db919b7c91bf033b42d04f15ff16a56f4edd6afb26e84d448359660ece3/mkdocstrings_python-2.0.8.tar.gz", hash = "sha256:34545b54681cf0b212aab95394d37b0f5326a93b102f6ad1df3d965c79384c9d", size = 201771, upload-time = "2026-08-31T20:16:06.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/b7/a5a854d4e44853f26decc0c5e0d68df052399f3da344a313da4178f00816/mkdocstrings_python-2.0.8-py3-none-any.whl", hash = "sha256:e555d9ef53b0febdeae4dd603144d4f86ec90fef672276645ea3bb61232c3d24", size = 105443, upload-time = "2026-08-31T20:16:05.25Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/8f/ce008599d9adebf33ed144e7736914385e8537f5fc686fdb7cceb8c22431/mkdocstrings_python-1.18.2-py3-none-any.whl", hash = "sha256:944fe6deb8f08f33fa936d538233c4036e9f53e840994f6146e8e94eb71b600d", size = 138215, upload-time = "2025-08-28T16:11:18.176Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] [[package]] name = "mypy" -version = "1.18.2" +version = "2.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "ast-serialize" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" }, - { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" }, - { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" }, - { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" }, - { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" }, - { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" }, - { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" }, - { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" }, - { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" }, - { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" }, - { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" }, - { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/6a/878cc1097d4035f82bd516658d0c528d2a9955bc7b363afcbd0b07fea11b/mypy-2.3.1.tar.gz", hash = "sha256:47c1b1207258513a9d93495f69c8be9de73916186f0e52703e8c461b7a623419", size = 3992554, upload-time = "2026-08-15T03:03:38.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/da/d6effc4f808a842d91edc22535dc9e799d2ff6e91449168b7f47a0771f54/mypy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a32bbbb940af990d3be0b8af321c7b6815bb1b3b48142fe7459b9cc5f58959ff", size = 14047547, upload-time = "2026-08-15T03:02:57.707Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e6/478229701dab76f26485fc8ff5d6f241f393da22447400bbc56f6946aebe/mypy-2.3.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff715e45b2231a8e85de1d163d1b42791e4d7aab8f5145f85fee1b710b735aff", size = 14216515, upload-time = "2026-08-15T03:01:26.496Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fe/7c42327a3b21e84681f691982cbfe43f334a3685f3b683b72c376476c4fa/mypy-2.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:858fc57d3d91fa728e33e7ad71def60fc6272694607b306cd3292db53ae39080", size = 15307789, upload-time = "2026-08-15T03:03:31.62Z" }, + { url = "https://files.pythonhosted.org/packages/59/f4/7e597edbe01b5a56fa958ce541302dcaabfed979966f1dffedbea0ea0fc2/mypy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:851833db876e7b650f93719c74b7879a08e338979c96054fdfc3bfd90a486355", size = 15548831, upload-time = "2026-08-15T03:03:15.55Z" }, + { url = "https://files.pythonhosted.org/packages/a3/52/cb31e084bc0314a1e384bdd677a4b80e55af04ccac077545e2238b9d320a/mypy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:4c5095a327483591c94e0c8d3ef9e50d4ab1369b541eae007c1f23bc2a41f6bb", size = 11226359, upload-time = "2026-08-15T03:03:29.002Z" }, + { url = "https://files.pythonhosted.org/packages/7a/47/88fcf6217b43fa2da81a8c2611370af18141536a4f0294bbf98b457d456d/mypy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:bbfe022634a2a195406bd469e888d2eaf193b02ba7e607391cd7640374aaae3b", size = 10214707, upload-time = "2026-08-15T03:02:48.807Z" }, + { url = "https://files.pythonhosted.org/packages/de/cf/862010ee800ca9c2bd0c4c0dacf0f092e5411824a09b8f97ad4be8fe250e/mypy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:114dff494000f18bd10d5d95d84b8567b26da60279ecbe838131841df20e635d", size = 13964542, upload-time = "2026-08-15T03:02:21.43Z" }, + { url = "https://files.pythonhosted.org/packages/75/5a/3f3a2107b41e3e92e617e25daaee121413b91e9784bea733131ed4fecc5d/mypy-2.3.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8637731bb5eee3671eb2c3200827aa3564ed8a9309ecee4d1afe77e6d031bdb", size = 14168922, upload-time = "2026-08-15T03:03:00.351Z" }, + { url = "https://files.pythonhosted.org/packages/8b/41/04dc4fe7e63d7820fa4eff272e95157d30cbea921388f3ab3fe77794cd0b/mypy-2.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c80fbc405ed8020f5ff3802dc18cf060197bcdd3fbdd6a26ef2fd34dfdd5226", size = 15244791, upload-time = "2026-08-15T03:02:31.089Z" }, + { url = "https://files.pythonhosted.org/packages/96/fc/c3053b26b9054949285aa868cb6af8c10e7591541cacd79c5dcc06a1fcf9/mypy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:84081f538ce27375045c02e3d7f81bd11d853400621ae245d87ce7b6c420ec74", size = 15501627, upload-time = "2026-08-15T03:03:34.128Z" }, + { url = "https://files.pythonhosted.org/packages/70/4e/d77daab008bbc4e5001374d7928f4a260d28f0e6747af444fc4763f7a310/mypy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:e9144ac16fde007096f9563eb2041b4433c2d705c4218edeb79e7e9d01035ee6", size = 11243961, upload-time = "2026-08-15T03:02:11.952Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f8/7eb68c136e4abd30569fe31ef2bfcb7eceae9952cab80017c04cd09f5d0c/mypy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:77ad9529e67dca28e511f5cd5671436584ce91f6d3bac159a353158187b986ac", size = 10213219, upload-time = "2026-08-15T03:02:26.361Z" }, + { url = "https://files.pythonhosted.org/packages/be/c4/42a49d44aeff804edf1b19acce0b49e8bd1a9c57dee9605dd8d980aa43d7/mypy-2.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:192abaedf75da1bc0b1cef104927e70ec49c1ef0031cc4825c7ee10a438ed24d", size = 13986778, upload-time = "2026-08-15T03:01:33.69Z" }, + { url = "https://files.pythonhosted.org/packages/45/13/9331fd2dfed7194d66c5304072894a8be3e51e9deda6863c1eceaa35a43d/mypy-2.3.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf678dffd16efcda2c15cbd30e9ecc0081388e29ea23687a88e686ed92638dc3", size = 14188467, upload-time = "2026-08-15T03:02:40.554Z" }, + { url = "https://files.pythonhosted.org/packages/78/f7/f4a34edab45667c5465855dc585a20e87978ffa8aee711445b7239d120c6/mypy-2.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e036f06b41630f4c8a1d48f9ac6aa26acc65f8be089973f5519da643318f03f", size = 15225538, upload-time = "2026-08-15T03:03:09.761Z" }, + { url = "https://files.pythonhosted.org/packages/40/05/534b3590757bd05794f73e07f6666c2a77b8597ffed795c94ce570096aa0/mypy-2.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71af9c8a894e862b58e92abb08e53b05a384a1e5e5d6dc7cda59126211a53d82", size = 15480805, upload-time = "2026-08-15T03:01:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/55/da/bdfba852e2562f599624af5bb7d29e36b0b4f526f2b8bac85efe0dd1803d/mypy-2.3.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3c80cd23d85368bdd9f37d5231dfd97d35bcbf5bf41af96ef3a9b078ad1957f9", size = 7761712, upload-time = "2026-08-15T03:02:36.008Z" }, + { url = "https://files.pythonhosted.org/packages/98/31/60fc64a74cdba4f2a5d642d32317993e479163e1ac7d91b695e5d15e2264/mypy-2.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:4956f34d145e145562a0a0bf367f642bbc85c04ec2baf47ae015947c3169a85d", size = 11423968, upload-time = "2026-08-15T03:02:06.931Z" }, + { url = "https://files.pythonhosted.org/packages/a9/23/eb5950b24cd26ba3b78f87707a275568d633c77dae8e61c9661be6055ca6/mypy-2.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:cfb12e360242d23d91f5e978d94f58ea66acf5804c4fb6f2f794a20d4cb1b595", size = 10399323, upload-time = "2026-08-15T03:02:33.671Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/f80f4e46c0b9a00eb5f78a79d49dda8bdf56a5230f7257fb33e76be04da7/mypy-2.3.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e5f1c50bb05b64e2026b52867e8d21106f01313c744a2c4ecc34c90d12e8d6e2", size = 15121308, upload-time = "2026-08-15T03:01:46.053Z" }, + { url = "https://files.pythonhosted.org/packages/5d/74/9b04f17c7074cc5188f02fb63a2ca1d43fedf479e84fe3091c39061a1d7f/mypy-2.3.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:667196b352f4cf304ded4c10f90cfc179263a1acfb3cdcfa984bdfd340d498bc", size = 15536590, upload-time = "2026-08-15T03:01:35.941Z" }, + { url = "https://files.pythonhosted.org/packages/26/04/c837ef6208e567774e2ed1f863f8ba6ec4817b1b6dd426315e5d559b6ec9/mypy-2.3.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9c53e395c12cad2c6d4b67d5da7c6057638a132d85c08b73646b18f802a0045", size = 16791074, upload-time = "2026-08-15T03:01:31.073Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/48730230afa45192d5bd429a6a2ff24a6f8dedda90fdf2b221792b54518f/mypy-2.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:18162b128c3f9c703cd35f5537446900b0d21a2549aa7a95d21380d2ef643fb0", size = 17069183, upload-time = "2026-08-15T03:02:28.566Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ea/ca23fc9c20eeda09a15c9cbcf50015d0e73f409f6ead059e42aa69a608ff/mypy-2.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:30c0477d4aab7b7f39c8397dc877f2c96b9fe5588ec379f372c56eb63d599f63", size = 12154679, upload-time = "2026-08-15T03:02:04.809Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/8d982126034990869466f73b8db80dcb2234a7ac39b4dad093e047a79835/mypy-2.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6941ab3619377bc3f32ca02876b07d27f216f5201604b664d3937ea0fdd23bb4", size = 10969159, upload-time = "2026-08-15T03:02:38.152Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f7/41e7f2d8117fbc7a7587286162ffe2f688984b69c46ed63cf5f2e4fc3bae/mypy-2.3.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6f041a6de52c9217ca125e78ba0a335cb7fd98a1c0580978e49ab2b126f70b57", size = 13990694, upload-time = "2026-08-15T03:03:21.919Z" }, + { url = "https://files.pythonhosted.org/packages/06/85/8f665811a0c8f3bf6fa1d9acd665ec2d97a2bcc453ae68dcd92340941cd6/mypy-2.3.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5159ae60f5dbc3a498af5ba8365505808ac8031bc63f9e00304ad545d40bdd9b", size = 14203518, upload-time = "2026-08-15T03:01:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/2d/82/91b866c8546b120bff83b73a439d90d2d63ef3aff113599e6b8e4d566848/mypy-2.3.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47a8a7a0a7f6f6e63995c0ac36fa0c07b127413fdc81f0439b7f3dccafd33561", size = 15220224, upload-time = "2026-08-15T03:01:23.577Z" }, + { url = "https://files.pythonhosted.org/packages/c8/78/c226c99208ee40de7c768369fa533f933afa003dfdc606ff021450724e91/mypy-2.3.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2329c0501293d4e1f33bc15d04d6304d65a1cdda967ee93a05c1e681a3923133", size = 15501512, upload-time = "2026-08-15T03:02:09.453Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e7/7cfb3f106c393979f4cc37ad6c0586044d50401e3c35b0c003e4f3ba6bc9/mypy-2.3.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:bb26deed807bdb0457cf3e3f1cd7c4a1cf9d66864eaf1b4a61e06805d4c6b1f9", size = 7761913, upload-time = "2026-08-15T03:01:55.65Z" }, + { url = "https://files.pythonhosted.org/packages/99/3c/52affefa273b97939a1f474ae4a349c8718635c15b941112dfab4291b0c1/mypy-2.3.1-cp315-cp315-win_amd64.whl", hash = "sha256:375d7013876a8233b2d05be185bfa09f689696cd999ce8b1cfe6acac5c80e8a3", size = 11422533, upload-time = "2026-08-15T03:03:24.101Z" }, + { url = "https://files.pythonhosted.org/packages/2a/b7/75643e70c72a5b346d8a9b1543c967ea8824df2ee3fb7ccba652c272b7bb/mypy-2.3.1-cp315-cp315-win_arm64.whl", hash = "sha256:586b3612214cceabb3c0f588c97e7d1e535393f06a60e912e994f6b3ace97523", size = 10397931, upload-time = "2026-08-15T03:02:55.265Z" }, + { url = "https://files.pythonhosted.org/packages/10/ce/53be21f2d4adfcd26f63f1184a13ed797015ab463853f117e2e11e4d726f/mypy-2.3.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:ef0c6335cda9d807f8193d8ff6204a72bc909fa9882aacbca14f43cdb7188306", size = 15118669, upload-time = "2026-08-15T03:02:51.479Z" }, + { url = "https://files.pythonhosted.org/packages/62/43/20de757cd42989d291a17fad607742c4c74e875ce5cea00e5a5225020ac1/mypy-2.3.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e598c8c66401d26b150872154a286e6d484cf2789c3bb28a7556806298423021", size = 15545627, upload-time = "2026-08-15T03:03:05.132Z" }, + { url = "https://files.pythonhosted.org/packages/7e/fc/092bdf77ad280eaf501422f0f3b966012b528076cc13e41a774861c907d1/mypy-2.3.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eda22fd4efa9dcd39331d1dede9b5b8b8a7fd69af07592e778433da98610d29e", size = 16764157, upload-time = "2026-08-15T03:02:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/94/5c/c94c4d62d909b07f552d0d9356d7acc943825558e602a64822ffa2231536/mypy-2.3.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:2a0ba2e57847849fb0d1fcdabb32786d223095ed8bc121dfe322bcdb3d9c46bc", size = 17073258, upload-time = "2026-08-15T03:02:14.573Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f7/511a88b89e478053c02d22039bb8f3ce4183efe8fd7a4f0a5910a8bb0a32/mypy-2.3.1-cp315-cp315t-win_amd64.whl", hash = "sha256:3f7e865dd51f235f60a2dbcd8728a1c095f5ca28f095d48a725b84cd935735c4", size = 12135505, upload-time = "2026-08-15T03:02:16.714Z" }, + { url = "https://files.pythonhosted.org/packages/71/bf/02573b56964ecb0f7c644f915f53c325ae15c3faec521c5adf11599a32df/mypy-2.3.1-cp315-cp315t-win_arm64.whl", hash = "sha256:8ad80807dc3ab8ea978b1b2b6e4a657194ace1d4ef03e0e731aff1abd517da29", size = 10962647, upload-time = "2026-08-15T03:01:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/8e/41/9675c7a1e78edecfba0b79e587a52594c56e189368261dc7b3a7fffb9527/mypy-2.3.1-py3-none-any.whl", hash = "sha256:6ed5c7e3419083268e5c9258bd1c1ef91af44a9e89374dbcaf37b775716e72eb", size = 2754338, upload-time = "2026-08-15T03:02:53.4Z" }, ] [[package]] @@ -1171,93 +1625,104 @@ wheels = [ [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" 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, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] [[package]] name = "numpy" -version = "2.3.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload-time = "2025-09-09T15:56:29.966Z" }, - { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload-time = "2025-09-09T15:56:32.175Z" }, - { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload-time = "2025-09-09T15:56:34.175Z" }, - { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload-time = "2025-09-09T15:56:36.149Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload-time = "2025-09-09T15:56:40.548Z" }, - { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload-time = "2025-09-09T15:56:43.343Z" }, - { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload-time = "2025-09-09T15:56:46.141Z" }, - { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload-time = "2025-09-09T15:56:49.844Z" }, - { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800, upload-time = "2025-09-09T15:56:52.499Z" }, - { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615, upload-time = "2025-09-09T15:56:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936, upload-time = "2025-09-09T15:56:56.541Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload-time = "2025-09-09T15:56:59.087Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload-time = "2025-09-09T15:57:01.73Z" }, - { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload-time = "2025-09-09T15:57:03.765Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload-time = "2025-09-09T15:57:07.921Z" }, - { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload-time = "2025-09-09T15:57:11.349Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload-time = "2025-09-09T15:57:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload-time = "2025-09-09T15:57:16.534Z" }, - { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload-time = "2025-09-09T15:57:18.883Z" }, - { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250, upload-time = "2025-09-09T15:57:21.296Z" }, - { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269, upload-time = "2025-09-09T15:57:23.034Z" }, - { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314, upload-time = "2025-09-09T15:57:25.045Z" }, - { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload-time = "2025-09-09T15:57:27.257Z" }, - { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload-time = "2025-09-09T15:57:30.077Z" }, - { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload-time = "2025-09-09T15:57:32.733Z" }, - { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload-time = "2025-09-09T15:57:34.328Z" }, - { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload-time = "2025-09-09T15:57:36.255Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload-time = "2025-09-09T15:57:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload-time = "2025-09-09T15:57:41.16Z" }, - { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload-time = "2025-09-09T15:57:43.459Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776, upload-time = "2025-09-09T15:57:45.793Z" }, - { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281, upload-time = "2025-09-09T15:57:47.492Z" }, - { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275, upload-time = "2025-09-09T15:57:49.647Z" }, - { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload-time = "2025-09-09T15:57:52.006Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload-time = "2025-09-09T15:57:54.407Z" }, - { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload-time = "2025-09-09T15:57:56.5Z" }, - { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload-time = "2025-09-09T15:57:58.206Z" }, - { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload-time = "2025-09-09T15:58:00.035Z" }, - { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload-time = "2025-09-09T15:58:02.738Z" }, - { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload-time = "2025-09-09T15:58:05.029Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload-time = "2025-09-09T15:58:07.745Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload-time = "2025-09-09T15:58:10.096Z" }, - { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload-time = "2025-09-09T15:58:12.138Z" }, - { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload-time = "2025-09-09T15:58:14.64Z" }, - { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload-time = "2025-09-09T15:58:16.889Z" }, - { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload-time = "2025-09-09T15:58:20.343Z" }, - { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload-time = "2025-09-09T15:58:22.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload-time = "2025-09-09T15:58:24.569Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload-time = "2025-09-09T15:58:26.416Z" }, - { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload-time = "2025-09-09T15:58:28.831Z" }, - { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload-time = "2025-09-09T15:58:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload-time = "2025-09-09T15:58:33.762Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload-time = "2025-09-09T15:58:36.04Z" }, - { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload-time = "2025-09-09T15:58:37.927Z" }, - { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload-time = "2025-09-09T15:58:40.576Z" }, +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/6b24738a0ef4557d189b150046cd07823c50e4273e8aebd651222e24306f/numpy-2.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8e4cb9a754c8a0c62eaa88273a5fba3391f4a610d1dee893c0755da31c083f15", size = 16886595, upload-time = "2026-08-09T13:45:27.323Z" }, + { url = "https://files.pythonhosted.org/packages/65/60/f2d208d366f263f39c6e69ed309290717aab41078b6d04c9be2a84fa2a07/numpy-2.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:52c808f96484f5571a5cc863775ce50247c17dfb3b0361f8ed6b4b0456f80080", size = 11896845, upload-time = "2026-08-09T13:45:31.638Z" }, + { url = "https://files.pythonhosted.org/packages/3c/79/81e0bf24f4d020a2b1d5cd297a9f60c3f24eeb116f9bba5870443f7b6a4a/numpy-2.5.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:29d81e97f668489cba8ebfd796b9bdd453525d35dd9e162e2daec94bf3fc7740", size = 5343880, upload-time = "2026-08-09T13:45:34.373Z" }, + { url = "https://files.pythonhosted.org/packages/ba/cc/e3141cf06d1a8a2c7e107543fe1269c1d1af760d4d683c0794a4ee1127c2/numpy-2.5.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afb3f0632d6b2e3ba04dbce8d1e48d321b369138b73830b5ca371a0e8d479d56", size = 6682264, upload-time = "2026-08-09T13:45:36.7Z" }, + { url = "https://files.pythonhosted.org/packages/29/f1/2a64a307d92c5d98f5255a4014eb43bb6103ee477087b61ecae44a3aa9b9/numpy-2.5.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0aadf13b60048d501e05fa699efaf7734e2494f3498a4c2a5521d822640324f3", size = 15609566, upload-time = "2026-08-09T13:45:39.518Z" }, + { url = "https://files.pythonhosted.org/packages/7b/44/59a1eb68e773c4098d107ef34a0dbdeca501d72ffcfbff9a7707343921ce/numpy-2.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29b86ff8a6cc556b47ec6b64b194815cc80e6bf5eedcc6cddfd65318cb0b4eee", size = 16709995, upload-time = "2026-08-09T13:45:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4c/3e54d4ddbc359a1295f8b633e8106bcd4d7d4a206e82df051bdfb3058755/numpy-2.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6950c4b7dd562453090548ba7f5da7e59f57f85663f15d5dcc60e249192f7e59", size = 16972511, upload-time = "2026-08-09T13:45:47.094Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9f/02e371638ebf19b66d46231e4be52999e87f32d1961b113bc45656608b22/numpy-2.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9727f472d2f3888053b8a75ab0cb94745a9de224bb5846dbadc0092101bc71d", size = 18465609, upload-time = "2026-08-09T13:45:50.808Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/ad6645abc7a3510fe48e8ea1ab4598166f500057ef4ebf38bfad4f1577de/numpy-2.5.2-cp313-cp313-win32.whl", hash = "sha256:4f9744f9fbdcea0bc552e8f19e1f141f811a3f9bc2be2cc6e86d982cab23e3f4", size = 6070204, upload-time = "2026-08-09T13:45:54.111Z" }, + { url = "https://files.pythonhosted.org/packages/15/20/f3489f86d81ea460b2bcdceaed094142ca6579f6be0ec527b781d39afe68/numpy-2.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:85aaccb24182c25df891ad0ec333585967e115269d5f1b17f2c9ae005bc96657", size = 12460532, upload-time = "2026-08-09T13:45:57.167Z" }, + { url = "https://files.pythonhosted.org/packages/d5/21/35b31dde1b283b79de828b80f876afd8c94e28fe1e9c375f89e261cc4c0d/numpy-2.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:bd68ece1553d2023c09a4226d9e41c586ad2d20594d1a456186c33513d2cb3f2", size = 10396725, upload-time = "2026-08-09T13:46:00.478Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f8/c3b222bf075b50afd8e949a07a15c4b312a4a84bd8102a332bcd953cbbb4/numpy-2.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d787cf769c3baeb5f6235e778edb52c08dfa923789b5958f28e6450f96107cb1", size = 16885180, upload-time = "2026-08-09T13:46:03.939Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/2c1d4b1987795a92b5bbf7c24fe249ab96aa2573ab0d7604802c189d7b86/numpy-2.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:24b9dc2e3d84aa58523798805194e23e736f3f6ce2d1a5b92583ae734e6dbda8", size = 11907878, upload-time = "2026-08-09T13:46:07.045Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ee/d08226fc858044355983a6e5b94f08ff6f3969e0a2b160a4a89f0ddb3445/numpy-2.5.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:9e9413326d726c2545bfa65d2c0876871e8d8386e77f992c1d426e180bbd4323", size = 5354922, upload-time = "2026-08-09T13:46:10.04Z" }, + { url = "https://files.pythonhosted.org/packages/94/f0/6d3d933056440ebbc5e6bad92065fc6c26a48a84a36b1208580e94eea76c/numpy-2.5.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:60e902ac295855348a5ca2ea4c89108989a9f5fddfad3dfc0a8f36b10358567e", size = 6679168, upload-time = "2026-08-09T13:46:12.275Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3b/ecd49dd90033cceb2704d88ca905d4d7d89b0e8c739608754ffd325fa820/numpy-2.5.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e500dc868e9313530ce12ba470fe50ff3afe3d62993ed6eff652dacd555b65", size = 15624501, upload-time = "2026-08-09T13:46:15.322Z" }, + { url = "https://files.pythonhosted.org/packages/c7/99/461bd36dbdfac6c1c53efa370bd55a83227542d0d118f1677dbf1a3dacd5/numpy-2.5.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318b9a4c845dbea06708a29c84ee429cc3065048db34cdb799047643492050ee", size = 16713701, upload-time = "2026-08-09T13:46:18.949Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9c/2b251df9e8a5d647b62b0cbc1b90a91850c1cf4859ecb532fd0b4eacff6c/numpy-2.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34c319e2963be042673fb46570501b2f06c41924e17e3563d58646b4380dfb68", size = 16986065, upload-time = "2026-08-09T13:46:23.006Z" }, + { url = "https://files.pythonhosted.org/packages/8f/25/20de43f53ff1390534a124475055a19f01fe10c920a0fd11b8e18d6d6052/numpy-2.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f06571a052127dc1b4e8b83029b4d1b20daa2b64a31cdd181fc6bc774e9000eb", size = 18470031, upload-time = "2026-08-09T13:46:27.102Z" }, + { url = "https://files.pythonhosted.org/packages/56/5e/0c577ca308d6da5eb79b546ba10bbe5b60148192194e2da060913b1de4f1/numpy-2.5.2-cp314-cp314-win32.whl", hash = "sha256:2cc779226e476d1e1f08c74068c419e60f41a9e0e069c92f6671d31d5c985e98", size = 6121028, upload-time = "2026-08-09T13:46:30.046Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/7bcbd5b11f94199073320410cddcbb80cee62415bfeb540874b265c2d922/numpy-2.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:7587f53dfbd5edc0f7b87c6217b4c6d2d1f2ef9c3da70bc1315e7db5f8d7ec9d", size = 12597627, upload-time = "2026-08-09T13:46:32.886Z" }, + { url = "https://files.pythonhosted.org/packages/87/bc/4d0b06fba0da90ccc75af62823cb9dcedb6c9ea0cffa058cb2c9ee773a77/numpy-2.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:3e4c367352d3747784248a227fbec218e193b56f7e6692e3b64fc805478ecfdf", size = 10680414, upload-time = "2026-08-09T13:46:36.036Z" }, + { url = "https://files.pythonhosted.org/packages/cd/17/f429aac9dc08833a0d0f188eba38c532a751b1a1f2ca6018a37b455cb321/numpy-2.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b879fb674276e331513fb136b78dbc6bd3c848309e0d841cfd63be3896c4cfc1", size = 12026967, upload-time = "2026-08-09T13:46:39.084Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9f/d0849de96a2a4ceaa16662f18ee13eaa9c0aa418269fdc8c4857c56b11da/numpy-2.5.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:fd0d703772bba096843785bd38371e31bb4a0c1151497ad5739d182114a73f7f", size = 5473874, upload-time = "2026-08-09T13:46:42.075Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/8df216d4a4a5422a3de045301cf7df8ea47286d76f5cb7160b0128ac26b7/numpy-2.5.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:3a2f061cebd9e3d23bdcfaaded5e2293a4c6a5b60fa42df85d410a725ce621bf", size = 6789276, upload-time = "2026-08-09T13:46:44.387Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3a/20d7e9891c4ddfadd6ff8d95bf4b29f353d8e1770553de2099880551dfb9/numpy-2.5.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6df895598c0edcb41030126c89e0f353b07d93238116143b7405e937359736c4", size = 15659154, upload-time = "2026-08-09T13:46:47.538Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d6/f3aa3d2688bf501b858835c6bd087ae9b51a56ae6fca8e2b0990abd177af/numpy-2.5.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ab3d4a901f844ea836c3e80bf463c6a27d7f3c14e8e292fcf28d348b25b9bce", size = 16748909, upload-time = "2026-08-09T13:46:51.442Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8f/1c5cae8d2baf86ab802ae97a00be55bc7e21ebc11b12bbc33376c5f05342/numpy-2.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cebc2d6dbb605a7703d59751dea4bd6b0ab127a5a4338a6f432df1936fef8b26", size = 17027685, upload-time = "2026-08-09T13:46:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/5c/27/71d3467404aedc1c24ce79610f91b52b0b0f466c43a701aa56fc75c145ab/numpy-2.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eaca7ff36f0f52e2111ec71f169d8fd3e889e7ddc0d2592e0d703fd8d3ce8fac", size = 18501181, upload-time = "2026-08-09T13:46:59.09Z" }, + { url = "https://files.pythonhosted.org/packages/14/2f/42921d27c40aea7e077f4a423ae509fd9220b028cd787bafefd8ab2b3a5f/numpy-2.5.2-cp314-cp314t-win32.whl", hash = "sha256:ddf47472af2e4280d79bac82304f5e80150211f1b9e614b760061d5fdfbb6eba", size = 6271085, upload-time = "2026-08-09T13:47:01.903Z" }, + { url = "https://files.pythonhosted.org/packages/75/e6/bad5f5d56de9b1971bac959963dda276d35c40f1854475005434bbe08692/numpy-2.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:44ef9675d908e65f9953063837c3277730f3f4437615a4cdab67b366cabaf884", size = 12787971, upload-time = "2026-08-09T13:47:04.963Z" }, + { url = "https://files.pythonhosted.org/packages/df/05/f608795cb34391acd67e38d94a3c36abd8d8576293a3a80727d7595c372c/numpy-2.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:eaa088384c46f519dacb93b7ec483a6d6b19a4a2085ae4f25ab9b1c43d387d1e", size = 10750306, upload-time = "2026-08-09T13:47:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/33/c6/28de0191c5f82b7d42a0a51390ba98587048aa93a39fafb05bdbe6e8d00c/numpy-2.5.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:078f9b027b478c9379b9677babbf0f8b8f1ecfada27636d7b9a93990c638739f", size = 16885274, upload-time = "2026-08-09T13:47:11.439Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/973ca116000d244897e468ea1aff30b589e5022e3c8744b71706fe33bd57/numpy-2.5.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:50a68f4bacd8a2b33d8da3d2269d0d78500f86ea582e4786dc10f5ef2c2c6842", size = 11907846, upload-time = "2026-08-09T13:47:15.128Z" }, + { url = "https://files.pythonhosted.org/packages/78/d9/8c4b3937ef204cb2fd88d389ccd0f265a2ffb11f35a01d2064cf46714bd6/numpy-2.5.2-cp315-cp315-macosx_14_0_arm64.whl", hash = "sha256:e79aba74ffaf5f78a050d777c184cddf8fdffabab38acf5f3ef1fecbc17895d6", size = 5354892, upload-time = "2026-08-09T13:47:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/b6ee65ea2999fdb7023935e108e6fb776ee4082aa15f159acfa857e578c8/numpy-2.5.2-cp315-cp315-macosx_14_0_x86_64.whl", hash = "sha256:9a0731745a72a184490a582fb4af2533512bd071ace67785b5fdffc0ae58dce8", size = 6679309, upload-time = "2026-08-09T13:47:20.456Z" }, + { url = "https://files.pythonhosted.org/packages/43/f3/acb18d8b137a393c8e7803a8c994c9e64bde3930692a69d826993113a159/numpy-2.5.2-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ec954036759bcee3aa484f8603bd9c14f3e776293b85578b8734c2d72777c69", size = 15625850, upload-time = "2026-08-09T13:47:24.365Z" }, + { url = "https://files.pythonhosted.org/packages/a9/bf/a8e9bb0db815a0e265b5744ebedd3af0bd5faad8604e5b50a1cd012f3c91/numpy-2.5.2-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc649493697006bc90614a5f0bbc8cb3cb1866715c474e473694968d7e6b99ab", size = 16713664, upload-time = "2026-08-09T13:47:27.965Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/6e913736b3dd6582344af32418b5fb9dab34282e8a8174ae1d54ceb0fc13/numpy-2.5.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:cf7de32f486e4ac9e2d93b810f9e9ac72a728dd46a32a0bb403222f27f653514", size = 16986749, upload-time = "2026-08-09T13:47:31.541Z" }, + { url = "https://files.pythonhosted.org/packages/80/09/7d3b23eff5c7428ef6c01e6f7052bb60d504c4d33e317b36b8959c24ad97/numpy-2.5.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2ffa7bacab3e2ee1b19ed31766bb60bb380b68c23f051e199c5cc598afd68710", size = 18470495, upload-time = "2026-08-09T13:47:35.364Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a4/68a321d825374f6eb677ffe8ef8c6b9a328304e6fd2e39d9530822776607/numpy-2.5.2-cp315-cp315-win32.whl", hash = "sha256:6b588cc8f902d6bff201c19fd00c43ab8545671e3554d014e12e14139e5e8617", size = 6120696, upload-time = "2026-08-09T13:47:38.561Z" }, + { url = "https://files.pythonhosted.org/packages/c8/23/deafbb1700f79fae9cd1e91220f133d124cc267de1b584da3fbf6db2f6cd/numpy-2.5.2-cp315-cp315-win_amd64.whl", hash = "sha256:07d4e89f3a9ab0a9ba24264ccdb642b3dd951b2281e8883a5481a4aa79cc31a7", size = 12597324, upload-time = "2026-08-09T13:47:41.401Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/3272ba105e3bbbdaeb11357eda31e7a6825ffe159e8171665660299a948f/numpy-2.5.2-cp315-cp315-win_arm64.whl", hash = "sha256:a610dc7e3c52edd39c2bc2375ff9c3fd59cb3ad00e4472d36f83bc1457145788", size = 10680466, upload-time = "2026-08-09T13:47:44.873Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0e/58370637b1bb70a5c9ce2b43f4b521ccb224e36ccb76a6596b17ae4b447c/numpy-2.5.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:40f4d451aed46a8046a1aae41c4e55fb3612273df9c502480135e1501576a34b", size = 16993947, upload-time = "2026-08-09T13:47:48.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/93/2abcb807712b289d6d60fe4cf30532f98974a8396d885650f3ba5a13026e/numpy-2.5.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c081cbe16ba1ab53078e5ff29013621e33c509eedab055775d956427712c236e", size = 12025331, upload-time = "2026-08-09T13:47:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3a/2898e003a5fbaf87e76c039b4ee1f5eb390471b4ffe74887c1f34c4e791e/numpy-2.5.2-cp315-cp315t-macosx_14_0_arm64.whl", hash = "sha256:0090ccdd57ec2703e9b49d0bf554767370581c1dd0a6b2bb2b2d9def317d042a", size = 5472336, upload-time = "2026-08-09T13:47:55.403Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/23f69d07c544597b29758b31b55c27dc9d541012a2c1496189fef702aec2/numpy-2.5.2-cp315-cp315t-macosx_14_0_x86_64.whl", hash = "sha256:6a9bb119fb8dd21ba30b3f0e555b7e2b081bd9883af21ec9c1c633d161cda3a8", size = 6788387, upload-time = "2026-08-09T13:47:58.192Z" }, + { url = "https://files.pythonhosted.org/packages/15/ea/c0dbdbcf22f43782510a3e492dd3da73c6112b69cac8929d16d127536fc4/numpy-2.5.2-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a839318485284a6fb31be4f8f2c91c8f2cb22f4543c4a8903f12b0671ffe07cc", size = 15667096, upload-time = "2026-08-09T13:48:01.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/5e/29c73c31748cdb0f7566642125ba17fd5b56780cddf891b085dab27e4466/numpy-2.5.2-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba0a474801b8dc67b66bf465548abc90e82b44d2611b5770f33008dcabffe8ec", size = 16751730, upload-time = "2026-08-09T13:48:05.706Z" }, + { url = "https://files.pythonhosted.org/packages/47/95/02501e8454796bb58dadf7a99d3181e0b464bf264e1003039572f9779fac/numpy-2.5.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:0a4035ae1129ff8777f08bfbd44f1e5d8e9c049ce0c2dd78fc0d92c13e7251c0", size = 17038686, upload-time = "2026-08-09T13:48:09.627Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b5/53a681d91b5c82687067d8ea5035e02d917b5509d6f334cb06484a954714/numpy-2.5.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:77843ca236b777e67f8d6b3660ea116e499612703a0ecd7093f316201eb9d8e2", size = 18507727, upload-time = "2026-08-09T13:48:13.744Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/6e11443f7b64ee376c860506091103bf68f92d2cab9e8d96d4501babf07c/numpy-2.5.2-cp315-cp315t-win32.whl", hash = "sha256:7354826bc6f8f69402e9b7fe28d15fcd34feebd74f856f111585c5b0c9fb0251", size = 6269775, upload-time = "2026-08-09T13:48:17.543Z" }, + { url = "https://files.pythonhosted.org/packages/f1/18/195d6b86cd72dbbc501edfa778005fa6b87afd34c153e46028cd3a0938f4/numpy-2.5.2-cp315-cp315t-win_amd64.whl", hash = "sha256:e5651f3f87add730ee6608d915009e19c911fba0cb000c7e3ea994b7d768eb12", size = 12782559, upload-time = "2026-08-09T13:48:21.023Z" }, + { url = "https://files.pythonhosted.org/packages/b4/07/458c344f0f0c178f4481dad5cca790626ffe4c34eabf9467069d06ee4999/numpy-2.5.2-cp315-cp315t-win_arm64.whl", hash = "sha256:5f8e00be2ec6f45f4e8a41a527f68d44a7d96fee92a650e4d8b1326f77f61e6e", size = 10748103, upload-time = "2026-08-09T13:48:24.21Z" }, ] [[package]] name = "oda-reader" -version = "1.3.1" +version = "1.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, + { name = "inflate64" }, { name = "joblib" }, { name = "openpyxl" }, { name = "pandas" }, - { name = "platformdirs" }, { name = "pyarrow" }, + { name = "readerkit" }, { name = "requests" }, { name = "requests-cache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/b9/4ac1d7304001bf702d4835beeea0ef3a6fb60c8034ecb047c3141b2624ba/oda_reader-1.3.1.tar.gz", hash = "sha256:2201595bffbe72f7719e0f362db36a0a40968be252adefbe932f2fd284f5cf17", size = 43135, upload-time = "2025-10-27T14:10:45.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/58/62590d770b582a43cf42fd62e4b5000a79816158e948a15d278572d423a6/oda_reader-1.10.0.tar.gz", hash = "sha256:166b3ec53866d3e60a5637400da1b4cad15e367477ed9ffcc16177eef3d45cef", size = 115818, upload-time = "2026-08-13T19:30:19.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e8/abbd6b6fb8678adc0d83d0c537a55e84b1798fd3322d3e6edc9acc7a9dd8/oda_reader-1.3.1-py3-none-any.whl", hash = "sha256:57c8fbe5dda303689fb538f01fb0735e34f733547ccc24665f2632a67b93814d", size = 59216, upload-time = "2025-10-27T14:10:44.832Z" }, + { url = "https://files.pythonhosted.org/packages/48/3b/0cc68b4304b143b0b57ca4f9181acc5fab00ccd2d1176972bb1c1751b195/oda_reader-1.10.0-py3-none-any.whl", hash = "sha256:d18a87bc21cbb820a8019f84a1c88fce883dc04827aac19cf7a3872745897ad8", size = 137829, upload-time = "2026-08-13T19:30:17.841Z" }, ] [[package]] @@ -1272,13 +1737,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, ] +[[package]] +name = "overdue" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/28/7a099f4f699c23b0b7701a9901325b4fd1c3812bb45be9438f97a16d25ed/overdue-0.1.5.tar.gz", hash = "sha256:6781da739f802d904f4a0d404824f315c5cb1911b309f7a6d4b5f465374cd2da", size = 13240, upload-time = "2024-12-17T19:20:19.272Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/01/2a14f0d4e9777452f444fbb96dabc8abedf482ae140a1e22a05baab05813/overdue-0.1.5-py3-none-any.whl", hash = "sha256:3ece13e9f7ef8636b9c906143b9573a333ef81953e38d870b4e0732c0d7ce063", size = 3523, upload-time = "2024-12-17T19:20:16.977Z" }, +] + [[package]] name = "packaging" -version = "25.0" +version = "26.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, ] [[package]] @@ -1292,41 +1766,53 @@ wheels = [ [[package]] name = "pandas" -version = "2.3.2" +version = "3.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/79/8e/0e90233ac205ad182bd6b422532695d2b9414944a280488105d598c70023/pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb", size = 4488684, upload-time = "2025-08-21T10:28:29.257Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/db/614c20fb7a85a14828edd23f1c02db58a30abf3ce76f38806155d160313c/pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9", size = 11587652, upload-time = "2025-08-21T10:27:15.888Z" }, - { url = "https://files.pythonhosted.org/packages/99/b0/756e52f6582cade5e746f19bad0517ff27ba9c73404607c0306585c201b3/pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b", size = 10717686, upload-time = "2025-08-21T10:27:18.486Z" }, - { url = "https://files.pythonhosted.org/packages/37/4c/dd5ccc1e357abfeee8353123282de17997f90ff67855f86154e5a13b81e5/pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175", size = 11278722, upload-time = "2025-08-21T10:27:21.149Z" }, - { url = "https://files.pythonhosted.org/packages/d3/a4/f7edcfa47e0a88cda0be8b068a5bae710bf264f867edfdf7b71584ace362/pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9", size = 11987803, upload-time = "2025-08-21T10:27:23.767Z" }, - { url = "https://files.pythonhosted.org/packages/f6/61/1bce4129f93ab66f1c68b7ed1c12bac6a70b1b56c5dab359c6bbcd480b52/pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4", size = 12766345, upload-time = "2025-08-21T10:27:26.6Z" }, - { url = "https://files.pythonhosted.org/packages/8e/46/80d53de70fee835531da3a1dae827a1e76e77a43ad22a8cd0f8142b61587/pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811", size = 13439314, upload-time = "2025-08-21T10:27:29.213Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/8114832daff7489f179971dbc1d854109b7f4365a546e3ea75b6516cea95/pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae", size = 10983326, upload-time = "2025-08-21T10:27:31.901Z" }, - { url = "https://files.pythonhosted.org/packages/27/64/a2f7bf678af502e16b472527735d168b22b7824e45a4d7e96a4fbb634b59/pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e", size = 11531061, upload-time = "2025-08-21T10:27:34.647Z" }, - { url = "https://files.pythonhosted.org/packages/54/4c/c3d21b2b7769ef2f4c2b9299fcadd601efa6729f1357a8dbce8dd949ed70/pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9", size = 10668666, upload-time = "2025-08-21T10:27:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/50/e2/f775ba76ecfb3424d7f5862620841cf0edb592e9abd2d2a5387d305fe7a8/pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a", size = 11332835, upload-time = "2025-08-21T10:27:40.188Z" }, - { url = "https://files.pythonhosted.org/packages/8f/52/0634adaace9be2d8cac9ef78f05c47f3a675882e068438b9d7ec7ef0c13f/pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b", size = 12057211, upload-time = "2025-08-21T10:27:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/0b/9d/2df913f14b2deb9c748975fdb2491da1a78773debb25abbc7cbc67c6b549/pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6", size = 12749277, upload-time = "2025-08-21T10:27:45.474Z" }, - { url = "https://files.pythonhosted.org/packages/87/af/da1a2417026bd14d98c236dba88e39837182459d29dcfcea510b2ac9e8a1/pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a", size = 13415256, upload-time = "2025-08-21T10:27:49.885Z" }, - { url = "https://files.pythonhosted.org/packages/22/3c/f2af1ce8840ef648584a6156489636b5692c162771918aa95707c165ad2b/pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b", size = 10982579, upload-time = "2025-08-21T10:28:08.435Z" }, - { url = "https://files.pythonhosted.org/packages/f3/98/8df69c4097a6719e357dc249bf437b8efbde808038268e584421696cbddf/pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57", size = 12028163, upload-time = "2025-08-21T10:27:52.232Z" }, - { url = "https://files.pythonhosted.org/packages/0e/23/f95cbcbea319f349e10ff90db488b905c6883f03cbabd34f6b03cbc3c044/pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2", size = 11391860, upload-time = "2025-08-21T10:27:54.673Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1b/6a984e98c4abee22058aa75bfb8eb90dce58cf8d7296f8bc56c14bc330b0/pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9", size = 11309830, upload-time = "2025-08-21T10:27:56.957Z" }, - { url = "https://files.pythonhosted.org/packages/15/d5/f0486090eb18dd8710bf60afeaf638ba6817047c0c8ae5c6a25598665609/pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2", size = 11883216, upload-time = "2025-08-21T10:27:59.302Z" }, - { url = "https://files.pythonhosted.org/packages/10/86/692050c119696da19e20245bbd650d8dfca6ceb577da027c3a73c62a047e/pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012", size = 12699743, upload-time = "2025-08-21T10:28:02.447Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload-time = "2025-08-21T10:28:05.377Z" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" }, + { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" }, + { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9a/ffbd852d58bd74a617fe2f8ee6a58a96982271ce41cf981eab22190b4a4b/pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce", size = 7197652, upload-time = "2026-07-22T22:18:22.502Z" }, + { url = "https://files.pythonhosted.org/packages/70/b5/d2d3e9ae73362ba4229651b0ee1455cf78073a1ce585f6ff693782ce263e/pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41", size = 9831691, upload-time = "2026-07-22T22:18:24.534Z" }, + { url = "https://files.pythonhosted.org/packages/52/51/dea1e89d6a6796b9c43f85a09b484ee03edb8a4c4842e73e200a8c11301c/pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49", size = 9105796, upload-time = "2026-07-22T22:18:27.064Z" }, + { url = "https://files.pythonhosted.org/packages/bf/09/7b95c4a0025227d6f118c4039b423412ac6a982db02864166185d812fbc7/pandas-3.0.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c1c05a767fe8e5b4fe9e1c29806829c582052eaedb9120a3da83ba3f69e24a5b", size = 10385742, upload-time = "2026-07-22T22:18:29.346Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0c/dc78fd8c4da477b4b5e8ad37295af352190d21ef63a9ee1bc071753074cc/pandas-3.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b86765f268b56f7e665b93bce9d5df69dee7f99e595cf8fb839483ab315942a3", size = 9932067, upload-time = "2026-07-22T22:18:31.833Z" }, + { url = "https://files.pythonhosted.org/packages/3e/71/3592c055cf44df9808550f9368ceda80ff2b224d355ef73fe251dcda1802/pandas-3.0.5-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c597ecf5616b5c420372c1d4d4c00dbbfba7398bea857dcc984347e1ea48417b", size = 10466756, upload-time = "2026-07-22T22:18:34.195Z" }, + { url = "https://files.pythonhosted.org/packages/e3/70/4363150359f95b4cb4bcbb34ca23572bb5495749a621a8f3d5a1ddfd293c/pandas-3.0.5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b11c36e218331d0387cbe3a0a5f75162357a1d92d57b2b08a336ff94b19b2be", size = 10938525, upload-time = "2026-07-22T22:18:36.81Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d0/317e7a0c67c0e69fa905a0161409397a7dc2d46ff611f6ca4803352c042b/pandas-3.0.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf52e1f61d229496da17dc7ab54acdee627357e7008fd4fecba3d0ba2937fa58", size = 11489303, upload-time = "2026-07-22T22:18:39.287Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8d/36dade89b49e4f9d5cbdbe863772581f98c0c6d78fc39ad4c557f6f2e17e/pandas-3.0.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:db172144bb56422bd157812f3b021eacc255451470b31e2c633c349490a1cfee", size = 11989004, upload-time = "2026-07-22T22:18:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ba/18c4ec8a746e177da05a9e7a7963781d8ea195780724f854601b6ebd6b78/pandas-3.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:0d298e951f23016ce4699951d044ae6418dbc91bf68cefca0f77666fcbb4e5c6", size = 9826896, upload-time = "2026-07-22T22:18:44.539Z" }, + { url = "https://files.pythonhosted.org/packages/de/ec/28a57266b753799a87b8bc79e7887ac6fd981b8c6d2978a0b7e7b6bd708c/pandas-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:66266d3442a5e8b3c90274c2b8b230bee42dd1c286bc822cc2f9f2c7e12b883e", size = 9094790, upload-time = "2026-07-22T22:18:47.468Z" }, + { url = "https://files.pythonhosted.org/packages/51/2f/cf6aae281264f4463f0875bcbb15fd2bb6d291cc535187dad1732475e4a9/pandas-3.0.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2f264fc46911cc8131a7322a16199bbf8e353d27c10bb211f5bd0c814324dc36", size = 10390034, upload-time = "2026-07-22T22:18:49.818Z" }, + { url = "https://files.pythonhosted.org/packages/06/ec/5189518c7a7659c4bdcc6b1eb32c46c6f3c86b0661ffd84143d1112c7732/pandas-3.0.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:53730687fcd161883b24e10411c06d6a4c0f2275d2faf3bb2bc25deb4ba8007c", size = 9980065, upload-time = "2026-07-22T22:18:52.249Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/598503ce8d7e3c35601e0747ba288c7864baae66380725bc12f13f884dfe/pandas-3.0.5-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:960d3ebcf249f75206899fcd2c6de53f736b7265759ced0d3e559df0b8b709b0", size = 10545532, upload-time = "2026-07-22T22:18:54.813Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/ceae2adf7034e07e9910299fe412e1819c4f0dd520700a888bcb03625448/pandas-3.0.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e94c2c5ca43bd3ca32bf64d32308887b65e5f9bfd8023ea52755107a999f93b", size = 10963120, upload-time = "2026-07-22T22:18:57.42Z" }, + { url = "https://files.pythonhosted.org/packages/66/25/86e0f4451874eb79e688deeebe3c451fec4557f8952005818d800ee8ac7e/pandas-3.0.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e819dd5f62966b481a8cb649d3299ebd886a1ea91ed5a99bf7ce77c98d18ab94", size = 11563178, upload-time = "2026-07-22T22:18:59.729Z" }, + { url = "https://files.pythonhosted.org/packages/f3/45/8643daa3b4147e433adfcccefdd0380d3aad79d86b15d8999730fe1944d5/pandas-3.0.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3c5ed2e7c06e91d340dfd091d7934f9bc82e4a36b95f647f090b9d1c9ac649da", size = 12028708, upload-time = "2026-07-22T22:19:02.164Z" }, + { url = "https://files.pythonhosted.org/packages/96/58/ad979ae617615576e8aafd569c9d4b62f1191d896e38f51d66ba06f3b89a/pandas-3.0.5-cp314-cp314-win_amd64.whl", hash = "sha256:cd8f7c6dc98527058ee6264219343f5392240a6f1bfa654fc5d79023020d0c92", size = 9951806, upload-time = "2026-07-22T22:19:04.596Z" }, + { url = "https://files.pythonhosted.org/packages/69/32/7ac03886b304049a9d2625ee88f59af760d8a93bd30ed9239bce7b9869a8/pandas-3.0.5-cp314-cp314-win_arm64.whl", hash = "sha256:5183427f5a8156d480f30333777bc978be93650a49a7c01db26adffe95b31e85", size = 9238297, upload-time = "2026-07-22T22:19:06.836Z" }, + { url = "https://files.pythonhosted.org/packages/be/ed/1d1f2ee5547d5167face2376d11c8b2a4c7bfff5a416ee7a9046891fab1e/pandas-3.0.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:303da736987d481074ca720ada325f8bd80c64ebc2d45ed79b29df3aaa4a26ca", size = 10849690, upload-time = "2026-07-22T22:19:09.391Z" }, + { url = "https://files.pythonhosted.org/packages/57/55/17e17152e98fbb0c4b1e562bc65387a2f20a80db0f4a86bf8d3a0e4248d4/pandas-3.0.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3b2801bbb049d0136f6c213eae02b5fca969384fc2064dd728d8620552aa49da", size = 10509945, upload-time = "2026-07-22T22:19:11.773Z" }, + { url = "https://files.pythonhosted.org/packages/88/90/817d44dbf83facf9556f33576d9af0a241981e7bb5c00606c0bcb5df8dda/pandas-3.0.5-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cce3a9d11d2b1f82c69a27ec1f4948a170e2c403c4bbfa8cca62e3fdebe2ef3a", size = 10392197, upload-time = "2026-07-22T22:19:14.024Z" }, + { url = "https://files.pythonhosted.org/packages/f1/da/889f00c0a6f5aa1545add70abbf01502dff87ab577adb855bd631c54d2f2/pandas-3.0.5-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef01af4d8dc6cd2c8d6c7736f149574ef93fe043811eeb5e445f2647154b5040", size = 10862726, upload-time = "2026-07-22T22:19:16.351Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/f1e934fb3c98fce859c6147c6785816c7b5b9ab7821115c5d8c4de9842b9/pandas-3.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e2759e890db96dfcffdbd9b86c3c2cb6afaf58def482820317e06163ec1066cd", size = 11414864, upload-time = "2026-07-22T22:19:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/fe/be/d448af7d657d82e1888dd8551f79c6d6fb161080b5b9752d84d910ec2319/pandas-3.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b58b1b39d46a5862e3fb18f50d1a201398619d16a0f9f73f57eea5583cf0e63c", size = 11925105, upload-time = "2026-07-22T22:19:21.515Z" }, + { url = "https://files.pythonhosted.org/packages/29/c1/ccb4238212c8c4f496c584f3044d94e0c030ed8e1d68999db46c91c2242f/pandas-3.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:1c10461f6eeb35d8f05b6184c65c8b9991663b66c46b1d559b682cb34ae7c6ea", size = 10387612, upload-time = "2026-07-22T22:19:24.257Z" }, + { url = "https://files.pythonhosted.org/packages/d2/cf/6a51b2c38980e04c279fd2fa908a1b0982064e860444acfca4ec2e2c8359/pandas-3.0.5-cp314-cp314t-win_arm64.whl", hash = "sha256:3c5015fd1730fbf883647e88068176c839c102cea883ba1769a6f4593bfc1f8c", size = 9509776, upload-time = "2026-07-22T22:19:26.694Z" }, ] [[package]] name = "pandera" -version = "0.27.0" +version = "0.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, @@ -1335,98 +1821,103 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspect" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/9d/36af210c7cef275d646b8dded8cc555078a271514e34f8f8d1c056462dc3/pandera-0.27.0.tar.gz", hash = "sha256:83c66d5896b97b3a91c810621038d2495f56c83864493819e7587d2059e641ad", size = 567135, upload-time = "2025-11-25T16:20:35.156Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/4c/b0dfda992d31d37c9eca7232c99163d418d315a544f5caf2276aff448c08/pandera-0.33.0.tar.gz", hash = "sha256:6211f54c6d6d5f96a2130a5fca20e25d56cad108ea282e11bb5997bfb8b57ee2", size = 971822, upload-time = "2026-08-30T04:19:39.751Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/26/8e4a28ffbf3406c60d58eaa7f0529fb6197f5ae49f77b173dc84c057e1a2/pandera-0.27.0-py3-none-any.whl", hash = "sha256:e43b8062dfcde984300d798686815cc93feaae09645d3cddee3ab437f2d11ed5", size = 295880, upload-time = "2025-11-25T16:20:33.635Z" }, + { url = "https://files.pythonhosted.org/packages/4f/7b/fb328c9f947abfd62e30accb0f60a87608833c980eeadad2f0b3b15b4d7b/pandera-0.33.0-py3-none-any.whl", hash = "sha256:3c4f1f3236b34fbac5b3f366efab293f97f65d5ad992956ddad3a875c42b4b1a", size = 500324, upload-time = "2026-08-30T04:19:38.55Z" }, ] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, ] [[package]] name = "petl" -version = "1.7.17" +version = "1.7.24" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/07/16a40e30700f7c6975e62cba01c2f94afbb347dd8ed224a5918c686a47fe/petl-1.7.17.tar.gz", hash = "sha256:802696187c2ef35894c4acf3c0ff9fecff6035cb335944c194416b9a18e8390b", size = 424376, upload-time = "2025-07-10T20:47:13.523Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/07/f38bd30215b7734fffa87673593281f6380bd8ff94a81f5cfc63d9dd6d7f/petl-1.7.24.tar.gz", hash = "sha256:07a1da8a8c0fa3d12381dbc08a2d4b53f270e378212e52ae85cb947e15647a65", size = 437451, upload-time = "2026-08-19T20:56:59.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/5c/ea831abc18dd3268046d7d9a0119f1f8ddc69642e0a5245f839602b8114d/petl-1.7.17-py3-none-any.whl", hash = "sha256:53785128bcdf46eb4472638ad572acc6d87cc83f80b567fed06ee4a947eea5d1", size = 233093, upload-time = "2025-07-10T20:47:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/79/73f2d03d16cc32ee7a8da609b9e4295d8bf32bf2b31765bdce6fd9dd8da5/petl-1.7.24-py3-none-any.whl", hash = "sha256:77b9d9e9fbec073dee7c3b0a656e78182147f2aa601923aaa2c6572a4837d72f", size = 242106, upload-time = "2026-08-19T20:56:57.919Z" }, ] [[package]] name = "pillow" -version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, + { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, + { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, + { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, + { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, ] [[package]] name = "pint" -version = "0.25" +version = "0.25.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flexcache" }, @@ -1434,18 +1925,18 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/cb/e6ffaf3d019e8501b1264dac529bf829ac2f1fe1d488cfcf67f1fccadacf/pint-0.25.tar.gz", hash = "sha256:22911a30d682ee0540d656571c19a7b1806ce00b2be88a16f67218108b7b8cc2", size = 253010, upload-time = "2025-08-15T19:49:12.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/9d/b1379cdbd33a49d17d627bc24e2b63cca06a1c5343b38072d2889499e82e/pint-0.25.3.tar.gz", hash = "sha256:f8f5df6cf65314d74da1ade1bf96f8e3e4d0c41b51577ac53c49e7d44ca5acee", size = 255106, upload-time = "2026-03-19T21:57:08.72Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/cc/c528311d798e22ec884b816e8aa2989e0f1f28cdc8e5969e2be5f10bce85/pint-0.25-py3-none-any.whl", hash = "sha256:cc20ae3dff010b9bbea41fb80c2de008f683cc83512cea73633d55aead80aa1e", size = 305462, upload-time = "2025-08-15T19:49:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dd/a9fe6a0a09512da23951c68bf36466aeecd89def3183dc095edbc807ddc5/pint-0.25.3-py3-none-any.whl", hash = "sha256:27eb25143bd5de9fcc4d5a4b484f16faf6b4615aa93ece6b3373a8c1a3c1b97d", size = 307488, upload-time = "2026-03-19T21:57:07.022Z" }, ] [[package]] name = "platformdirs" -version = "4.5.0" +version = "4.11.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/1d/6e762a6b060e662208951aefc5c39f6a96a272c4a10c0c1f7b6113fc3c09/platformdirs-4.11.6.tar.gz", hash = "sha256:1a4016e373f89f8ec458431fe0e0c5c4285858ac623f3e20efdfcbc0bd862941", size = 35131, upload-time = "2026-09-01T04:41:00.6Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d8/2784c6eabb991b5b7494ff9e9888c74a0a72ad613c3ec5adbfcecc0724c7/platformdirs-4.11.6-py3-none-any.whl", hash = "sha256:b22d992e863bc651c26b16242041c7979db6e3286e548f9a76cc91238fac599e", size = 23938, upload-time = "2026-09-01T04:40:58.977Z" }, ] [[package]] @@ -1458,17 +1949,22 @@ wheels = [ ] [[package]] -name = "ply" -version = "3.11" +name = "pooch" +version = "1.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload-time = "2018-02-15T19:01:31.097Z" } +dependencies = [ + { name = "packaging" }, + { name = "platformdirs" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/43/85ef45e8b36c6a48546af7b266592dc32d7f67837a6514d111bced6d7d75/pooch-1.9.0.tar.gz", hash = "sha256:de46729579b9857ffd3e741987a2f6d5e0e03219892c167c6578c0091fb511ed", size = 61788, upload-time = "2026-01-30T19:15:09.649Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload-time = "2018-02-15T19:01:27.172Z" }, + { url = "https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl", hash = "sha256:f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b", size = 67175, upload-time = "2026-01-30T19:15:08.36Z" }, ] [[package]] name = "pre-commit" -version = "4.3.0" +version = "4.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -1477,52 +1973,59 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/89/1f3e8e1fc3e97de0fa963495832f581f025f29471602a309e48808244292/pre_commit-4.6.2.tar.gz", hash = "sha256:8f5d7bfb021ecdbcd9d49d89847082dd24172ccde534390081a679ad046e2441", size = 198670, upload-time = "2026-08-10T22:07:18.421Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, + { url = "https://files.pythonhosted.org/packages/45/e2/bbb7129c9e7999a6b8ee9cca3b66486c25c423ab5a75f34071798b74ce94/pre_commit-4.6.2-py2.py3-none-any.whl", hash = "sha256:e2dde9a75d3bce11bd3831c26d134df00a2803c1d818be6a0383c3dcda25dc4e", size = 226202, upload-time = "2026-08-10T22:07:16.942Z" }, ] [[package]] name = "pyarrow" -version = "21.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload-time = "2025-07-18T00:55:35.373Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload-time = "2025-07-18T00:55:39.303Z" }, - { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload-time = "2025-07-18T00:55:42.889Z" }, - { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload-time = "2025-07-18T00:55:47.069Z" }, - { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload-time = "2025-07-18T00:55:53.069Z" }, - { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload-time = "2025-07-18T00:55:57.714Z" }, - { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload-time = "2025-07-18T00:56:01.364Z" }, - { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" }, - { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" }, - { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" }, - { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" }, - { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" }, - { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" }, - { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" }, +version = "25.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/e3/27f57f80141379d60defe6703eb50a707325706f07fedfd1312c7a751995/pyarrow-25.0.1.tar.gz", hash = "sha256:9150a83248bfed9813ea3c3af74c3856c1984d444aa28e58bf7733b9750ddf6a", size = 1201653, upload-time = "2026-08-10T12:40:53.904Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/e2/9ab15b88cbfac28e16419ce5439ec29234c5172cb8259301b4ba639bdec0/pyarrow-25.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:df961f2e7ae9cf496459259d798652c70625f6c080650d6952f8c04053c58ee9", size = 35861559, upload-time = "2026-08-10T12:38:02.567Z" }, + { url = "https://files.pythonhosted.org/packages/58/79/a0036dbe1eabe1f73127427342f1d99982584c4a2cde2651d6c93499c6f6/pyarrow-25.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:cc4aa407fde9fc660be3939e49ea31f50f3e9fec17c0ec63159f7711edd3efc9", size = 37628383, upload-time = "2026-08-10T12:38:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/13/49/d93a57d375f4bf0cf82913dd6bb54acafde83dd993be2282c81ac5616cad/pyarrow-25.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:4340f0ba6c1d2e13f21658de1d7c662ca2545018568d0030a1e9afca159d87e3", size = 46820190, upload-time = "2026-08-10T12:38:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/60/c9/711ca85d79f1ec98f29a5eae2b051e25b4ecec5de3e3c0e2d5c5dcb15664/pyarrow-25.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5389cdf79447ed1515c9e31620e6e1e2302249564d603f2ad727d4f6d313e4c3", size = 50102437, upload-time = "2026-08-10T12:38:22.487Z" }, + { url = "https://files.pythonhosted.org/packages/80/53/8fb8359ff17cfb6263a1cf3ebf7caec9fe197de118719e84fcb1d0618026/pyarrow-25.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d51592cb7561e87877c506113e7adbf1342ab579e6c21f0ef44b8ba41cb74c80", size = 49942424, upload-time = "2026-08-10T12:38:28.755Z" }, + { url = "https://files.pythonhosted.org/packages/e8/83/4e5ae02a9341571b18a6fca380ac7a58ce6ddae7ab3c060208c0a1e79f02/pyarrow-25.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6109c94d8b9f3b17a041daca16cacb2f651ad8f1ef70a4232c2c0f37a23da2a8", size = 53144206, upload-time = "2026-08-10T12:38:34.862Z" }, + { url = "https://files.pythonhosted.org/packages/65/ee/197cbf47e49f83e6ebeb946a5259a48a638dea27ac774db42fe78022179d/pyarrow-25.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8858d7bfc22e3f51529aeaa4077225029724623e4595dc9eff8c793935c34140", size = 27953934, upload-time = "2026-08-10T12:38:39.808Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8d/8f271a7a034c834910ec925d56fa4b29733b1380f5289419f5aaa3b02777/pyarrow-25.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c7c534ec03c358a76ea3e505e74c1b6aef290af90c444dfd092dbfe23e755b85", size = 35855328, upload-time = "2026-08-10T12:38:45.489Z" }, + { url = "https://files.pythonhosted.org/packages/d2/cd/5bac242f4e841b9971d5eb94fdfe2577e2b70be983e27401e72055786037/pyarrow-25.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dda9470024204d7bbf2042b47c6e8a0e47a3eeb8e34405882dfaea6577e0c153", size = 37622415, upload-time = "2026-08-10T12:38:51.107Z" }, + { url = "https://files.pythonhosted.org/packages/63/1f/96d03b4e1506524f7087adb0fd6b2f69f0c9c7aaff1ec36d8030082e15a5/pyarrow-25.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:44a9120ce5bd81936b8ab9a88076e3fd47c2c6838e0e43630fed83626aca81d9", size = 46813813, upload-time = "2026-08-10T12:38:57.773Z" }, + { url = "https://files.pythonhosted.org/packages/98/d6/33a411115b61dbfc16ad6ad73e71730f6fea654ee3667673bc53ab0e2fe7/pyarrow-25.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0befcf816e45a1af33ac775a9970b749e4868a230c7372f0ae5e932bee27039f", size = 50104452, upload-time = "2026-08-10T12:39:04.579Z" }, + { url = "https://files.pythonhosted.org/packages/33/ae/b1b97c9ca87f9f9ddbb5230c798df94eccce61bd79b9b45458c69a478588/pyarrow-25.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f89685964f46e4216103c75483aac0c0692a5f72212d7ca835adba5ede56ce3", size = 49951343, upload-time = "2026-08-10T12:39:11.8Z" }, + { url = "https://files.pythonhosted.org/packages/98/9e/a112df5cfd5a68cb1d9fc31cfe38c28d5aec9f10865ce37ecef2e4450873/pyarrow-25.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6943e2fe7954d29d84de45d29d34c8dc36ce96570e67d89aa9976e650a4a9138", size = 53144784, upload-time = "2026-08-10T12:39:20.503Z" }, + { url = "https://files.pythonhosted.org/packages/31/24/97e8bd98f1e3b07e2ba08bcdff690674fbe16d69a7d2712cc3884665e615/pyarrow-25.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:31e49a7888fcdf3a835da33ae777f6bb9a866334e5a789282fc26dcf426f7f15", size = 27870159, upload-time = "2026-08-10T12:39:26.161Z" }, + { url = "https://files.pythonhosted.org/packages/36/4c/b525824ad3094076919273cd97db61fb3d78252dee76fa3b8dc8f76774aa/pyarrow-25.0.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bf0b672390cdcb640d7288f96b826d71ff4e9abb254a86c89890baf51a29cee6", size = 35885255, upload-time = "2026-08-10T12:39:32.366Z" }, + { url = "https://files.pythonhosted.org/packages/08/62/448bb0e940de41aec31d1a956e63ad9c54afdf122a103cc3ab20c2a3ce33/pyarrow-25.0.1-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:38a9a4b4b9613380e200641891495a56c3d5a98a092db4a870af9975e220471d", size = 37644461, upload-time = "2026-08-10T12:39:38.142Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9a/13587e38bd4806fd218f50fd13b8903fab60588a699ff0c406372e5b4043/pyarrow-25.0.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:0b726ad7e7b669be982b0c71c07fe4b037d654354130da79a7902a669e93a66b", size = 46877146, upload-time = "2026-08-10T12:39:43.722Z" }, + { url = "https://files.pythonhosted.org/packages/8d/61/1c5d1229fa21da4cff5365e41e57177aaac57c563c727f35419b8513d1c1/pyarrow-25.0.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:9171748cdf796972d85a4b60157c279913e242992e350c90c7450182a9838b2a", size = 50131616, upload-time = "2026-08-10T12:39:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/43/20/291e1d65cc0b09aa19f03cf25cf51a2f5fa94b5db315178f2d254ed5cad4/pyarrow-25.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b7a296aac7a71fa0886c08e155ddb6c636a50013f801f6178daafa0f9e726188", size = 50008879, upload-time = "2026-08-10T12:39:56.891Z" }, + { url = "https://files.pythonhosted.org/packages/8b/7c/1b7c9ec28e76576337e4f97b31141c9a181b89b6d1d6221e9d8205621a58/pyarrow-25.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0fe7c8b6c03969b49c8c66182e4a18e3819ab92d07cfab5d8370c531b9369ef0", size = 53170864, upload-time = "2026-08-10T12:40:04.918Z" }, + { url = "https://files.pythonhosted.org/packages/b7/75/f3d789dc06011a765d14d86bda799cf72ac1d715b6a6edecaa0d73d95062/pyarrow-25.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:f729cfdbd36fd99d543b67a914d2de044c84ebe45be8b34902b299b608c15c8f", size = 28620729, upload-time = "2026-08-10T12:40:51.41Z" }, + { url = "https://files.pythonhosted.org/packages/fc/05/647a8ee6f7c2662feb6921315617bc04dcd6034763fb61b1199720bf6162/pyarrow-25.0.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:59a2de54c0cbd954da861eee4d1d330f8e909c45b53455baef696380f2c55033", size = 36130288, upload-time = "2026-08-10T12:40:11.014Z" }, + { url = "https://files.pythonhosted.org/packages/93/f8/c9ee997554d7bea94520667dd1933f109ac1da3ee3556d2b49381e023484/pyarrow-25.0.1-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:35935cd5de130aa5cf4dea052a63e6bf2e17006c35c3a468194242b9b2bf5956", size = 37762187, upload-time = "2026-08-10T12:40:16.592Z" }, + { url = "https://files.pythonhosted.org/packages/a2/08/a28c01c7fe9e96e8233ce2d13df1d402f4f999f848f51d2daacd6bb4c036/pyarrow-25.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:f3831aaa25c67a99f99dc8b05873cb9d64560390372e2aa197ce9dd4a3f06a44", size = 46888003, upload-time = "2026-08-10T12:40:23.242Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b9/58612e977d28dc58c878448866838369ee8da2f1e7cc8ed2c84b952aafee/pyarrow-25.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6a1fdfc6659b6b19022f2e50627fb5cf7156a66c46bf4299379955cbe742382a", size = 50079036, upload-time = "2026-08-10T12:40:29.169Z" }, + { url = "https://files.pythonhosted.org/packages/72/13/66e1402dcc860e1dc2760b1e0292c9a569b62b3bccab69def1b3e907d006/pyarrow-25.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:169d3429d5be7c752125890620f75a60776d38b0035eddae939651640822332e", size = 50040226, upload-time = "2026-08-10T12:40:35.186Z" }, + { url = "https://files.pythonhosted.org/packages/78/10/3f1a5497a7ef732ab0f03ecca3e66d89d9c0f57fdc61b4794c456b781f01/pyarrow-25.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:119297a6dc197e45d9c6d4415f7814a67ffa36c180d26f68c154c58067ae782d", size = 53149035, upload-time = "2026-08-10T12:40:41.454Z" }, + { url = "https://files.pythonhosted.org/packages/93/c0/37d4a7e8e2f7a6076283673d5298018ca26478b934c6ee369e10505ab32c/pyarrow-25.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4288f27577352d608ca08553b0865e4a9b3aa14820c5d95b53337218d609835b", size = 28753071, upload-time = "2026-08-10T12:40:46.623Z" }, ] [[package]] name = "pycparser" -version = "2.23" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] name = "pydantic" -version = "2.11.9" +version = "2.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1530,60 +2033,92 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload-time = "2025-09-13T11:26:39.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/ef/fc4f868f4e2cee79f863883abffceff107875f569b848507319842d2a681/pydantic-2.13.5.tar.gz", hash = "sha256:51a9c5f7b2f8e636f04c6cada605d9b6a3bf1348fdf945a3d8869b19bba0ee08", size = 845750, upload-time = "2026-08-28T14:04:00.916Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855, upload-time = "2025-09-13T11:26:36.909Z" }, + { url = "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", hash = "sha256:346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", size = 472589, upload-time = "2026-08-28T14:03:59.136Z" }, ] [[package]] name = "pydantic-core" -version = "2.33.2" +version = "2.46.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3f/76358795aa7a8c6d4f36e2cb828ad1c90ee118e1393a9281664f5aade9d4/pydantic_core-2.46.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d", size = 2076516, upload-time = "2026-08-28T09:58:21.576Z" }, + { url = "https://files.pythonhosted.org/packages/db/50/26b091836076ce4cb2fac264186936acc069e0595772cfd02a563bc4761a/pydantic_core-2.46.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e", size = 1922874, upload-time = "2026-08-28T09:58:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/2a8ce3849e299d44e2d2c196b6082643a3235565a735cb51db7a6261f614/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29", size = 1951772, upload-time = "2026-08-28T09:58:25.435Z" }, + { url = "https://files.pythonhosted.org/packages/87/46/ac0dc8bdd9e6048183a14eb127764e7ad9240021c17513074a4711b0e31e/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4", size = 2031832, upload-time = "2026-08-28T09:58:27.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/339de5bef7be36301a2231eaa52e62163742c2281f11b5f4892bc79785cd/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a", size = 2208645, upload-time = "2026-08-28T09:58:28.948Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a0/9ff22b797724262da14427abaed4dd1d864a139693fc5e7809114376a716/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62", size = 2265935, upload-time = "2026-08-28T09:58:30.625Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", size = 2066284, upload-time = "2026-08-28T09:58:32.289Z" }, + { url = "https://files.pythonhosted.org/packages/c0/02/7f6156ffc926857f1c37c07d9a388682865a81830ab6a1b637082c25e399/pydantic_core-2.46.5-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869", size = 2105889, upload-time = "2026-08-28T09:58:33.986Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/e781d357ebe09fc929f995700f1b3503e8897f1cece183ecb1300d4d67e9/pydantic_core-2.46.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5", size = 2158006, upload-time = "2026-08-28T09:58:35.647Z" }, + { url = "https://files.pythonhosted.org/packages/70/0a/644597d84ab400e50609c192120b85c9681c22d3a20461b9060a79be0a7a/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3", size = 2158408, upload-time = "2026-08-28T09:58:37.38Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ee/ca3b7b3a4b3769ffe9ce9432a7c9be755de9593a46d3b0d54d0409323e44/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b", size = 2309609, upload-time = "2026-08-28T09:58:39.22Z" }, + { url = "https://files.pythonhosted.org/packages/ce/52/39fa1f451486019524ca685020390e7ca351832fd874530ba30c8628e6dc/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0", size = 2342618, upload-time = "2026-08-28T09:58:40.89Z" }, + { url = "https://files.pythonhosted.org/packages/81/5e/468fc630568c61dcef3cd47ad32ffbeed9af643f49208d1ea86ab4f890c4/pydantic_core-2.46.5-cp312-cp312-win32.whl", hash = "sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b", size = 1939475, upload-time = "2026-08-28T09:58:42.591Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c9/4c19f41b84cf6b622a72fbeed7665b25d47a187d68d47d0d430c07f23268/pydantic_core-2.46.5-cp312-cp312-win_amd64.whl", hash = "sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8", size = 2043140, upload-time = "2026-08-28T09:58:44.272Z" }, + { url = "https://files.pythonhosted.org/packages/af/dd/0c1a050299147c746e5256db16d645ab5efd4f78c59937d581a0524e74a2/pydantic_core-2.46.5-cp312-cp312-win_arm64.whl", hash = "sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084", size = 1997729, upload-time = "2026-08-28T09:58:46.13Z" }, + { url = "https://files.pythonhosted.org/packages/f5/37/5abe39a8372a61d3dc3c1338fc504281c01b32fdb3169cd7187153b56d3e/pydantic_core-2.46.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0", size = 2075885, upload-time = "2026-08-28T09:58:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/21/43/6323b1f8b217780454c61304bcd2b38ae4762f50754414124603ccc90bb2/pydantic_core-2.46.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff", size = 1922768, upload-time = "2026-08-28T09:58:49.58Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a3/c05ca796e1197618a774b01e596aeedfefc2f7d8c01ae3054e910b120e8a/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931", size = 1951241, upload-time = "2026-08-28T09:58:51.511Z" }, + { url = "https://files.pythonhosted.org/packages/68/32/33bc39ac705c52cffc908e8389f9754fdb208aea5c69cceddf4eb3ce99af/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f", size = 2031975, upload-time = "2026-08-28T09:58:53.166Z" }, + { url = "https://files.pythonhosted.org/packages/b0/70/2333e885c0f6a67bc105c5916965dac9b57f2718ee20d81d1a06a4ebdc13/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038", size = 2208542, upload-time = "2026-08-28T09:58:55.017Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ea/296debfb4264207bbda5936133892e027c0a58875ad53ebd512fba8ec3a2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f", size = 2264692, upload-time = "2026-08-28T09:58:56.767Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/9e4de77a6271e07a76d2d58b11c091a979c191ed2939bf80067568b369d2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1", size = 2066633, upload-time = "2026-08-28T09:58:58.531Z" }, + { url = "https://files.pythonhosted.org/packages/8d/db/f9e9d0c97445987b2084823d5c240de88087338f04fc2cfaa2df186b8049/pydantic_core-2.46.5-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761", size = 2105235, upload-time = "2026-08-28T09:59:00.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/c5/79169b047b3b2c3e99e04bc76372af9637e0bf6db638274fa927df96369e/pydantic_core-2.46.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5", size = 2157367, upload-time = "2026-08-28T09:59:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/26/b5/ba6057afb7c291bd449f51b867f95aef2072941c4ce4e5c31d6ffd132d3b/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e", size = 2158420, upload-time = "2026-08-28T09:59:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/2057abecaafdc22912afa819603a51f0a62d40643b7c4871c51721fea9be/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed", size = 2309588, upload-time = "2026-08-28T09:59:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/71/9d/881156dc404e27479c4246128d73538464cab4a239bec61995e227644c30/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519", size = 2341866, upload-time = "2026-08-28T09:59:08.539Z" }, + { url = "https://files.pythonhosted.org/packages/5a/38/d66f443a259f84d13babdceae568e572b0ed26da17ca5d0a649ebb110a67/pydantic_core-2.46.5-cp313-cp313-win32.whl", hash = "sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea", size = 1938580, upload-time = "2026-08-28T09:59:10.402Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/1d5371213f4cc9a7ed70c0bfcc7911de22311ee99a662a56077d7292d2ac/pydantic_core-2.46.5-cp313-cp313-win_amd64.whl", hash = "sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5", size = 2041980, upload-time = "2026-08-28T09:59:12.396Z" }, + { url = "https://files.pythonhosted.org/packages/5a/48/4222d90b1c67568bace4dec6dca6271449c66de3595d72b6d098f5fde597/pydantic_core-2.46.5-cp313-cp313-win_arm64.whl", hash = "sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575", size = 1997213, upload-time = "2026-08-28T09:59:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8a/14596f2a8367da50cf7cbac48169ee5d9c8e11d486a3b527082384630c72/pydantic_core-2.46.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355", size = 2074081, upload-time = "2026-08-28T09:59:16.141Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e", size = 1920497, upload-time = "2026-08-28T09:59:18.065Z" }, + { url = "https://files.pythonhosted.org/packages/8e/26/092079428f86e927e030b2c0ced87df69dbb1c875cdeaa67bf42ea2be746/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3", size = 1952130, upload-time = "2026-08-28T09:59:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/08/c3/8ec0e290a9ebaebd64047bf5fda94be835c6b1551b02437e4b76778fbcd7/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46c25dda9d092a06c08db76ffe0a197107904d0dfac653f7d5306bbcd6d6119c", size = 2026371, upload-time = "2026-08-28T09:59:22.227Z" }, + { url = "https://files.pythonhosted.org/packages/01/72/4fd20ad520fb8da0157f95b27a7eb05a72790ef08138e7701ac972c342ea/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37ea7b83c935e5b0d68c9449b82651accf78a10828b2c02b2f2d9e9496446c21", size = 2202822, upload-time = "2026-08-28T09:59:24.277Z" }, + { url = "https://files.pythonhosted.org/packages/31/b0/d16e0771206b29314f0d52198b720be21e8a99ab2bf11e3bc0d7c9cebdff/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64e88d5585bea9ce95861079de72006c7fa6d3df4e3a3b65ba31eb979c15c9f", size = 2262756, upload-time = "2026-08-28T09:59:26.608Z" }, + { url = "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f", size = 2068352, upload-time = "2026-08-28T09:59:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/08/7c/570abb1ad2155348dc754ea91be22e5aaa18eb6d69a6068f7c6f2679a6ed/pydantic_core-2.46.5-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a2a5e1d0ff29adddc9f6d6821a66302e4493f8ca898b715b6b1182c2c201ea0a", size = 2104777, upload-time = "2026-08-28T09:59:30.95Z" }, + { url = "https://files.pythonhosted.org/packages/8e/25/5bf74adc65a1ac5b7be3f6cb0bcb5433615c1598a801c19d830d84c98ded/pydantic_core-2.46.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03b9666e41e35d8909852ba191a0607520f81b74eaf12ccf8737005dbb313821", size = 2156312, upload-time = "2026-08-28T09:59:32.604Z" }, + { url = "https://files.pythonhosted.org/packages/90/6a/2ef38830675e050121040618135564ed56b860b45433b02d9b4ebece46f3/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:a91c17edf6eea2402cb5457b4c89e99bc5ed1004aa34c4adf1d4258c1a5c22c2", size = 2150067, upload-time = "2026-08-28T09:59:34.453Z" }, + { url = "https://files.pythonhosted.org/packages/90/ef/a7dbb03a14a64c2a4621f989c615ed9a892535a6cad938fc27079f919d80/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b49924c73a235e969511bf2aabdff3beebf9820931f646c80274d5d780010c47", size = 2304516, upload-time = "2026-08-28T09:59:36.194Z" }, + { url = "https://files.pythonhosted.org/packages/68/f8/6bb4c4b80e8a6fde1904c64a51c62a1d04fcdfa3ea521a66b2ddefa1d885/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2cbd9a5eff05e51c447c34dfa4632145b26b09120cf04bd0c871e44c1a5e1c9a", size = 2335223, upload-time = "2026-08-28T09:59:37.931Z" }, + { url = "https://files.pythonhosted.org/packages/2a/80/f46b8c681195190b2c1f1c7c0a81abce60663e987613e09ef64d433dd96b/pydantic_core-2.46.5-cp314-cp314-win32.whl", hash = "sha256:2d5d76654becf5efd62c9e51c3756c67b49498b0c9a40884934c40807adbd074", size = 1934827, upload-time = "2026-08-28T09:59:39.836Z" }, + { url = "https://files.pythonhosted.org/packages/f7/3c/60674207246bc0a4009d2391b7c7251c7159f279c8d2ab8aae8ef46f3dee/pydantic_core-2.46.5-cp314-cp314-win_amd64.whl", hash = "sha256:fa10ef4112775900e7a0661068635eb67b2ab824fbde764de6e0e21982a93db0", size = 2042648, upload-time = "2026-08-28T09:59:41.792Z" }, + { url = "https://files.pythonhosted.org/packages/69/0c/117c562c7c1babdf44576b72a5e496906506c93690387ecfbca7c729ae2e/pydantic_core-2.46.5-cp314-cp314-win_arm64.whl", hash = "sha256:045ab3b6d308439e32b81cc173bba5b9018bc6ed896afd0c65b3b009b1699af5", size = 1989652, upload-time = "2026-08-28T09:59:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/e8/66/9336ae58f9eb68c41d121894e52c4c89eccb07eb8f602a04ee9c3f37736a/pydantic_core-2.46.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8816f3d218beb4b787de5c9759c259b8fa61f9dec42dc7811f320a33771778b7", size = 2065829, upload-time = "2026-08-28T09:59:45.364Z" }, + { url = "https://files.pythonhosted.org/packages/c5/02/bc19b47a96c2d3109760711acf22369e56bd7e405ca52f7ade164d2ead57/pydantic_core-2.46.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bce57638e08ac148e5778cce7feb968307a727d66f8e2274a543d0cf0c9ad6a3", size = 1905716, upload-time = "2026-08-28T09:59:47.18Z" }, + { url = "https://files.pythonhosted.org/packages/52/a4/70b47c0509923dd98ccfed04fb3e32ea3849c82a0ff2205bb41009b43c00/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976e1128455aa595ea04c79ccfedff1aaeab96ee013fcc916bed120c4f0ad94f", size = 1934216, upload-time = "2026-08-28T09:59:49.241Z" }, + { url = "https://files.pythonhosted.org/packages/52/ab/aa03b65f7bb198585edf806b906c3223ecf1795543e39e23aec4cce27ad2/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b891faeedeafba41b2983e5001a81b6a915b69544c7e7570d1989ce1c36ac7", size = 2010635, upload-time = "2026-08-28T09:59:51.692Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8b/0da06343f30b84ec549aafd309c6456223d5dc8bd36af504c573faad561d/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f194189415698233dd1114a093a9b56e61e2c57e11b469be3b0506f46f0771c", size = 2209369, upload-time = "2026-08-28T09:59:53.582Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5b/844c4defaa34a3df66eb9257087d121d70c201298b96abdf9f492fc2f1bf/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a36973cf8a2ef5406f4fe2edbf8ed0c99629535d959e0b100c76a32535a111", size = 2253238, upload-time = "2026-08-28T09:59:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/f4/64/a4e536cb16d7f61a7fd3120b46c577fc7fa7325992f69c4f52bc786d77d8/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdbb78909f52b981d3b2d56b97328d71eb0b974c36bd77c920123a7ebb192829", size = 2065740, upload-time = "2026-08-28T09:59:58.038Z" }, + { url = "https://files.pythonhosted.org/packages/5f/75/aaa38c6bc2d085f6605b34eabdc6a8a4e0b2e61fc9c8e6e52b28e97b3125/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:52e24eacdb536cade636aa90fb851835222becff8484b7001fdc78cb0290f2aa", size = 2087425, upload-time = "2026-08-28T09:59:59.898Z" }, + { url = "https://files.pythonhosted.org/packages/55/ae/fcab4cfc39aba3689e1d20c8b5250ad280957022c09af2ed9cd585602a5e/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37ae34309d7bd8c0d61ab839668058f2a7962ea1fc51d105d2db228fe0618034", size = 2139306, upload-time = "2026-08-28T10:00:03.057Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f4/f1d03a4bc9d9acbc62f4d742b8a319af52f71885079868b2ff8e48a651ee/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:0cdbada856a1c69a7624a64d3d9aefe79300bd6ef827b43a4f265010b9b55184", size = 2144589, upload-time = "2026-08-28T10:00:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/83/f3/7a53bb1356de514a4cd295f25b6ac39237895620c0462d2592b76c16e114/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:545f26c504b27c3758439a5e6d9349931f0a04f855668d5fe323c89e82300a38", size = 2288882, upload-time = "2026-08-28T10:00:07.931Z" }, + { url = "https://files.pythonhosted.org/packages/cd/94/5a81583660c175c59d49ffb09f4b3a44debeaf86a19fca664ae1cdd9ee32/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ff218293c9c806138dca139765e3b067621be52bcd93cdc14c7711be7ddc90a9", size = 2335210, upload-time = "2026-08-28T10:00:10.177Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9f/5d685c2693b972d1a59c998586e8823712b66603aeff47ee60a4bdaafd37/pydantic_core-2.46.5-cp314-cp314t-win32.whl", hash = "sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9", size = 1921180, upload-time = "2026-08-28T10:00:12.35Z" }, + { url = "https://files.pythonhosted.org/packages/70/12/5c94ee16d65a37a15f9e869f5e6256df111154491173801a4c5e800ab548/pydantic_core-2.46.5-cp314-cp314t-win_amd64.whl", hash = "sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290", size = 2020515, upload-time = "2026-08-28T10:00:14.774Z" }, + { url = "https://files.pythonhosted.org/packages/63/19/67830dda664e6bdf9285ee2e40f355d0d7d6b92aa0c42e8d217bb8d33d36/pydantic_core-2.46.5-cp314-cp314t-win_arm64.whl", hash = "sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f", size = 1989276, upload-time = "2026-08-28T10:00:16.984Z" }, + { url = "https://files.pythonhosted.org/packages/df/dd/053c2e4303f791f3b8f8a14ab0b22008e8eb21d868c0c90b4f9be705b76a/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942", size = 2062540, upload-time = "2026-08-28T10:01:00.318Z" }, + { url = "https://files.pythonhosted.org/packages/d7/dd/a18df751a5e37dd51bfad7f68e766999125bebe68c9e1d10a493ad01bd63/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f", size = 1902040, upload-time = "2026-08-28T10:01:02.529Z" }, + { url = "https://files.pythonhosted.org/packages/b7/13/01d40f9d07ce8a779fd6e0bd8ad4fba91309500dd67b869e2e219d261a6d/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433", size = 1967479, upload-time = "2026-08-28T10:01:05.004Z" }, + { url = "https://files.pythonhosted.org/packages/fa/04/c81d4841331c2178b6fb09ae225425e110ed72d990c9fe556c4ec03d1013/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c", size = 2111034, upload-time = "2026-08-28T10:01:07.345Z" }, ] [[package]] name = "pydeflate" -version = "2.3.3" +version = "2.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, - { name = "hdx-python-country" }, { name = "imf-reader" }, { name = "oda-reader" }, { name = "pandas" }, @@ -1591,33 +2126,35 @@ dependencies = [ { name = "platformdirs" }, { name = "pyarrow" }, { name = "requests" }, + { name = "requests-cache" }, + { name = "resolvekit" }, { name = "wbgapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/cc/1661ca602d899247552cf851b3d48e95e152ce7ffd706f6c15afc918619c/pydeflate-2.3.3.tar.gz", hash = "sha256:298607a894cff9fb9786ba85924ff122fd72258b6802a6debf5ef66af1f33bf3", size = 39487, upload-time = "2025-12-07T09:41:36.937Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/6a/7b3ede2337b4b30d9cec645c8a4d7cc36e00e2487a39fc52edb1fc4c88b4/pydeflate-2.6.1.tar.gz", hash = "sha256:3a2d87e69d0221139bad5d95ceca07d4728b4f974070063252b6ebbb287b1d86", size = 55340, upload-time = "2026-06-15T09:01:13.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/fc/52a47b29d97d22fec1289602fe65346dedfffbc797fe3df953f484641a31/pydeflate-2.3.3-py3-none-any.whl", hash = "sha256:a19448158bd5cc17848336391d8461f860421dbf75c984b4685e14b93e8b88f3", size = 54114, upload-time = "2025-12-07T09:41:37.803Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e3/21f5fc03244d9168b71ec8b9ebec262fa50a8c721d3d799fcd4c5b0cb28d/pydeflate-2.6.1-py3-none-any.whl", hash = "sha256:e9f415645677143002f85627cb6e578c2ee0b5b9b8c97fa271a832b1ac5ce70a", size = 74717, upload-time = "2026-06-15T09:01:14.284Z" }, ] [[package]] name = "pygments" -version = "2.19.2" +version = "2.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, ] [[package]] name = "pymdown-extensions" -version = "10.16.1" +version = "11.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/17/2db4b414de89659144488e0d9c6c0bf0c8395841dc12d81d0532cc6ef310/pymdown_extensions-11.0.2.tar.gz", hash = "sha256:9506fcbe66fa355a775b768084334238dd6805020ac4b92bea0c0dda6f8f223d", size = 855419, upload-time = "2026-08-22T19:28:47.236Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/a6/43/9f45ec4d14e596efc32c925a78104934790438b0c0628b70d741016734ad/pymdown_extensions-11.0.2-py3-none-any.whl", hash = "sha256:259910762019732caa1dfd76f3faa62c59f191d46573e80bcb1d13c0f675bbe5", size = 269929, upload-time = "2026-08-22T19:28:45.389Z" }, ] [[package]] @@ -1632,9 +2169,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/dd/a7d0a860efd3d4335d538b4361b8e9af8311f2aba2e8c7e4c7a47d623b6e/pyphonetics-0.5.3-py2.py3-none-any.whl", hash = "sha256:e6b29671d0d624dda1cac59c0c5a8a7216d8db504bae4941bfc482e04a0621d1", size = 10729, upload-time = "2020-02-25T12:08:25.368Z" }, ] +[[package]] +name = "pyrate-limiter" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/43/48693393af06b9fffbaea6bb8fe03be3c3f17be5d1423dab347d1aad1dde/pyrate_limiter-4.5.0.tar.gz", hash = "sha256:098345fff3a52b84dee9bcf6973f184c8b3ef8d34e1f4f781ac0773e3984598b", size = 123240, upload-time = "2026-08-30T10:35:39.272Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/dc/02f88649feeabf4282c8c194a6f6060ca858041bab1204365b5d8ef8a95e/pyrate_limiter-4.5.0-py3-none-any.whl", hash = "sha256:e7320a715adf404cb7b2f399e05ceb59cae165275b21f7708eb1b9fd9608e91c", size = 57188, upload-time = "2026-08-30T10:35:38.069Z" }, +] + [[package]] name = "pytest" -version = "8.4.2" +version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1643,23 +2189,23 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] [[package]] name = "pytest-cov" -version = "7.0.0" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] [[package]] @@ -1677,69 +2223,66 @@ wheels = [ [[package]] name = "python-calamine" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ca/295b37a97275d53f072c7307c9d0c4bfec565d3d74157e7fe336ea18de0a/python_calamine-0.5.3.tar.gz", hash = "sha256:b4529c955fa64444184630d5bc8c82c472d1cf6bfe631f0a7bfc5e4802d4e996", size = 130874, upload-time = "2025-09-08T05:41:27.18Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/24/f6e3369be221baa6a50476b8a02f5100980ae487a630d80d4983b4c73879/python_calamine-0.5.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9a78e471bc02d3f76c294bf996562a9d0fbf2ad0a49d628330ba247865190f1", size = 844280, upload-time = "2025-09-08T05:39:19.991Z" }, - { url = "https://files.pythonhosted.org/packages/e7/32/f9b689fe40616376457d1a6fd5ab84834066db31fa5ffd10a5b02f996a44/python_calamine-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcbd277a4d0a0108aa2f5126a89ca3f2bb18d0bec7ba7d614da02a4556d18ef2", size = 814054, upload-time = "2025-09-08T05:39:21.888Z" }, - { url = "https://files.pythonhosted.org/packages/f7/26/a07bb6993ae0a524251060397edc710af413dbb175d56f1e1bbc7a2c39c9/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e6b68b26346f559a086bb84c960d4e9ddc79be8c3499752c1ba96051fea98f", size = 889447, upload-time = "2025-09-08T05:39:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/d8/79/5902d00658e2dd4efe3a4062b710a7eaa6082001c199717468fbcd8cef69/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e60ebeafebf66889753bfad0055edaa38068663961bb9a18e9f89aef2c9cec50", size = 883540, upload-time = "2025-09-08T05:39:25.15Z" }, - { url = "https://files.pythonhosted.org/packages/d0/85/6299c909fcbba0663b527b82c87d204372e6f469b4ed5602f7bc1f7f1103/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d9da11edb40e9d2fb214fcf575be8004b44b1b407930eceb2458f1a84be634f", size = 1034891, upload-time = "2025-09-08T05:39:26.666Z" }, - { url = "https://files.pythonhosted.org/packages/65/2c/d0cfd9161b3404528bfba9fe000093be19f2c83ede42c255da4ebfd4da17/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44d22bc52fe26b72a6dc07ab8a167d5d97aeb28282957f52b930e92106a35e3c", size = 935055, upload-time = "2025-09-08T05:39:28.727Z" }, - { url = "https://files.pythonhosted.org/packages/b8/69/420c382535d1aca9af6bc929c78ad6b9f8416312aa4955b7977f5f864082/python_calamine-0.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b9ace667e04ea6631a0ada0e43dbc796c56e0d021f04bd64cdacb44de4504da", size = 904143, upload-time = "2025-09-08T05:39:30.23Z" }, - { url = "https://files.pythonhosted.org/packages/d8/2b/19cc87654f9c85fbb6265a7ebe92cf0f649c308f0cf8f262b5c3de754d19/python_calamine-0.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ec0da29de7366258de2eb765a90b9e9fbe9f9865772f3609dacff302b894393", size = 948890, upload-time = "2025-09-08T05:39:31.779Z" }, - { url = "https://files.pythonhosted.org/packages/18/e8/3547cb72d3a0f67c173ca07d9137046f2a6c87fdc31316b10e2d7d851f2a/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bba5adf123200503e6c07c667a8ce82c3b62ba02f9b3e99205be24fc73abc49", size = 1067802, upload-time = "2025-09-08T05:39:33.264Z" }, - { url = "https://files.pythonhosted.org/packages/cb/69/31ab3e8010cbed814b5fcdb2ace43e5b76d6464f8abb1dfab9191416ca3d/python_calamine-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4c49bc58f3cfd1e9595a05cab7e71aa94f6cff5bf3916de2b87cdaa9b4ce9a3", size = 1074607, upload-time = "2025-09-08T05:39:34.803Z" }, - { url = "https://files.pythonhosted.org/packages/c4/40/112d113d974bee5fff564e355b01df5bd524dbd5820c913c9dae574fe80a/python_calamine-0.5.3-cp312-cp312-win32.whl", hash = "sha256:42315463e139f5e44f4dedb9444fa0971c51e82573e872428050914f0dec4194", size = 669578, upload-time = "2025-09-08T05:39:36.305Z" }, - { url = "https://files.pythonhosted.org/packages/3e/87/0af1cf4ad01a2df273cfd3abb7efaba4fba50395b98f5e871cee016d4f09/python_calamine-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8a24bd4c72bd984311f5ebf2e17a8aa3ce4e5ae87eda517c61c3507db8c045de", size = 713021, upload-time = "2025-09-08T05:39:37.942Z" }, - { url = "https://files.pythonhosted.org/packages/5d/4e/6ed2ed3bb4c4c479e85d3444742f101f7b3099db1819e422bf861cf9923b/python_calamine-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:e4a713e56d3cca752d1a7d6a00dca81b224e2e1a0567d370bc0db537e042d6b0", size = 679615, upload-time = "2025-09-08T05:39:39.487Z" }, - { url = "https://files.pythonhosted.org/packages/33/e7/14f2bec7b4bead0e71e78fa2549e22192c498a3204d931bd0e6522ec955d/python_calamine-0.5.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:90389cc459500644bbc1a1170b5e50a95160f34cedc8de7fe9a4bd1c08764039", size = 843906, upload-time = "2025-09-08T05:39:40.972Z" }, - { url = "https://files.pythonhosted.org/packages/c2/6c/8c6e7a8c9b421e99ad1a637c3b96d94fef25abad6bf790a7ce35bfc5a48d/python_calamine-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:221b64c0e126a1263a14d575c61a60177cad852829dca61dfb4f5a8fb9603251", size = 813859, upload-time = "2025-09-08T05:39:42.853Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/f6745016a431f10620b4e803f306d95c57e828dea064e32fb944c0260559/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49f3aa50d532c6639be851a644875d5c9cd63892cf545ee614a5c0593dc50c3b", size = 889212, upload-time = "2025-09-08T05:39:44.356Z" }, - { url = "https://files.pythonhosted.org/packages/b9/72/8de0af1823d587b2683eb25c6feef14c7ea917cfb975d094ad09f46245d0/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d8bf3b3542c771795cfcfa8a77d1373273311735517cca599aa7f89c34f38ae", size = 883584, upload-time = "2025-09-08T05:39:45.97Z" }, - { url = "https://files.pythonhosted.org/packages/5a/90/47b91cf573b6bd4e6dbaeef4f993caf26dc0d2b8117261bc965bd70b38ce/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8e452fc1335ab1f7738c3d4d5144f11719b9c5585f3cb5102d47293355067a", size = 1034378, upload-time = "2025-09-08T05:39:47.57Z" }, - { url = "https://files.pythonhosted.org/packages/48/f7/c75e5f0b0918f0f60b45fad4c313d159633615aa1c96a5170e3fe940862d/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4fc75ac97be47539465191a00de305c0e150465da8632c14fc1107a0b304f97", size = 934310, upload-time = "2025-09-08T05:39:49.059Z" }, - { url = "https://files.pythonhosted.org/packages/cd/04/8b5806bdbfabdb51fd2816deac6870d031560f0bbd90d9729ac86b903579/python_calamine-0.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1258368551e0b235d5b46c105137294cbb5ca683b2c13f5851f3ebec7f2d42b", size = 903602, upload-time = "2025-09-08T05:39:50.91Z" }, - { url = "https://files.pythonhosted.org/packages/75/4e/ec27837d5023b8db775db7798b3340eeb6bcb7f61ad64e892d4e1b14853e/python_calamine-0.5.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a7c51270e5ea518cb02cb531d84a2eb2de68da3cf48b26adae622f031dc5284", size = 948410, upload-time = "2025-09-08T05:39:53.286Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ba/8b5193637bfa0f363284974ae998f96fa1c8561a0a4d90378b0f202ac317/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e1d0df3d69b32da05e3e7648bb5802559d44979be721983f0d669b4128f920fa", size = 1067274, upload-time = "2025-09-08T05:39:55.469Z" }, - { url = "https://files.pythonhosted.org/packages/da/1c/506791e4c7078f2fed1ee2d69703d62c0acfd5b671db157bb755f47cff42/python_calamine-0.5.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6d674ae194744b6080f20a0b5a253a9976d632ee91dc00e13e539e968167cd35", size = 1073351, upload-time = "2025-09-08T05:39:57.685Z" }, - { url = "https://files.pythonhosted.org/packages/dc/83/e30e21484b1ed55668f67a63578d8a6ba70597a4d7ee8da23d759d3e1b3f/python_calamine-0.5.3-cp313-cp313-win32.whl", hash = "sha256:7a42ff0dae44457a4a3e65ea49357ffdf92e44f8b022ef1fb32c6498097d6d57", size = 669416, upload-time = "2025-09-08T05:39:59.901Z" }, - { url = "https://files.pythonhosted.org/packages/1d/8f/29c617e9548ed2704657ebaa7d79067cad06cbbf7dd432a6cacd4cc19d16/python_calamine-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:054aee805c2cd5ab9848c2b8459822f2581cf22af45ff60251c9f45585cc06e0", size = 712760, upload-time = "2025-09-08T05:40:01.799Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/d8117f99037100a28d17d9fbde121511c19d54ff4e5968d6aed693caeb87/python_calamine-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0e870f57651e2f76e7c1f009492aa342a7b1819f8b1131bf501240872777f944", size = 679372, upload-time = "2025-09-08T05:40:03.676Z" }, - { url = "https://files.pythonhosted.org/packages/d9/0a/61949009a354af9ff5dc19e6816ae68a56281c0765520c9db4ff0ed20054/python_calamine-0.5.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:e98c819cd43a7f0048f6d97c9d4ec23d72889cd722de1d6b68e0de24b1f8f037", size = 843418, upload-time = "2025-09-08T05:40:05.601Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/4cb7fa988d17c98a0be6e9f74561d8a2381f28a2b88adb89f16abe345d2f/python_calamine-0.5.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cf90ce46420545f922cde95004ea8d5efaf3864b5a380a5d1defc7abd219421a", size = 813611, upload-time = "2025-09-08T05:40:07.47Z" }, - { url = "https://files.pythonhosted.org/packages/01/34/4c2a6827da90f366be3fb9c7788f672f5e7d60808f9dbd01da5acc6f11ca/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e89caa6a1a55215be742cd44f6d94611fb6ab222a30325e772abc40566693e5", size = 888097, upload-time = "2025-09-08T05:40:09.256Z" }, - { url = "https://files.pythonhosted.org/packages/17/bc/ecf5f6ac95195dfd3e9d63ab8c60b78d6466009751dfb1cdacf71d5f5e19/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b13177e42dac8de57870995699b237ce5a7886d9bd7fb745a36f867e5d3d3e62", size = 880861, upload-time = "2025-09-08T05:40:11.637Z" }, - { url = "https://files.pythonhosted.org/packages/6e/55/8b60f99221a408f08db280b553aa4321c4cd9365e5c3101638249002d5a4/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:948e28b5f3246177440c70550661e0a27b414cb15535111fca7dbac2a63721b1", size = 1033023, upload-time = "2025-09-08T05:40:13.864Z" }, - { url = "https://files.pythonhosted.org/packages/05/c5/8c378d3c2c56d12606e20b59eee3538d3b1177fe00b103bb98ef15176610/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37fef2b67bcd66b5dfc65b0779da9522c82f1ef9f97fc6034848072ff60b3f7", size = 933097, upload-time = "2025-09-08T05:40:16.372Z" }, - { url = "https://files.pythonhosted.org/packages/26/04/cf14e91ac5c2d6d9795e1c39f3f53e0f173fcbaed4b00198e22a58265fdd/python_calamine-0.5.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddcef4e0e9d0479e027c90d9e1537bcf05de9bdd137cd7dfdbfc0034b1850973", size = 901917, upload-time = "2025-09-08T05:40:18.444Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2f/5b2065b9360bda792504fe3ac1cef6d9da51ceba6230ee7634886b44cce9/python_calamine-0.5.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6732b47f923102357bde348021a2892a41c2fb173958268c0a1ff8d5abb6b7e8", size = 943328, upload-time = "2025-09-08T05:40:20.302Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5a/45e4bd8473264b918d83297d15f160471029390cd06ed0056fc57e8f29eb/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:543db1b886cf994aaf7da0752022b37c42c05acb7605b56d09047023c8387610", size = 1065993, upload-time = "2025-09-08T05:40:22.528Z" }, - { url = "https://files.pythonhosted.org/packages/35/6b/2afd47608495f23408bdf2f1ff57a144700aed8b5bbe50285ac4864edf53/python_calamine-0.5.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:b79135dd96129253dc0e547778c700e1e3782e7671e7047c8b106b5501e33706", size = 1071801, upload-time = "2025-09-08T05:40:24.481Z" }, - { url = "https://files.pythonhosted.org/packages/f7/db/b06a15f25e63290c2efc5433fa8b395bfe870aacbf4ea6c930764d53eca6/python_calamine-0.5.3-cp313-cp313t-win32.whl", hash = "sha256:d84dc3b78adf038a2b452fc784523dcc90477f1631d33aabc0872812db5beb26", size = 669485, upload-time = "2025-09-08T05:40:26.818Z" }, - { url = "https://files.pythonhosted.org/packages/2d/40/e51adf1dae2002f189c83ae527aad017372d1a1b97a22172dc2e51ce502d/python_calamine-0.5.3-cp313-cp313t-win_amd64.whl", hash = "sha256:8a3fd541576fdf2708e40064ebaaf561a0a2afcab01de91c83ec212193bede34", size = 712636, upload-time = "2025-09-08T05:40:28.502Z" }, - { url = "https://files.pythonhosted.org/packages/56/fa/db4dc8d27a5daa14a153aebc0cb98bad6fd700befd9e67440a8017f0e108/python_calamine-0.5.3-cp313-cp313t-win_arm64.whl", hash = "sha256:b28a9c9318a5e7dabcead1803bfd48be5bf7c9f339d6e505a5989650a6102487", size = 678307, upload-time = "2025-09-08T05:40:30.797Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7f/a098680c9d6ad36fe850f2c2c28627ee3bc95aaa052f375806f69c075475/python_calamine-0.5.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b5cdcd85cc08a1805d267fc66aa100940712de6b4524951ab91ba47fa60d481f", size = 843921, upload-time = "2025-09-08T05:40:32.418Z" }, - { url = "https://files.pythonhosted.org/packages/09/ce/3de5d714779fac6e3333e7ea98ce4eae3b2479eb8a3d2f7d9e4487e16681/python_calamine-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:828cd5d49fe9eb9c1fc9219fe484b07f2ba9a1e5e3b8475d7f1415e0fa316df8", size = 814173, upload-time = "2025-09-08T05:40:33.982Z" }, - { url = "https://files.pythonhosted.org/packages/cb/14/ef98575838091b6b24274160d53607e78df94f0176af360bcb063512e643/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d3f4d0532ab4de422fc4b707cdbb93d57ca7ccf9be8bc4742fb9376dc68f861", size = 888958, upload-time = "2025-09-08T05:40:35.576Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b1/c999dd1f89f415ff06f88f37bce643ece3c4d51ae051e0a143ff16f44c1c/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89a9ba0a16e4335b676232ddbbea0fd09bfb94757ca6e4cf90ce1348aa843f3f", size = 880988, upload-time = "2025-09-08T05:40:37.264Z" }, - { url = "https://files.pythonhosted.org/packages/74/16/4984532280e4b2c81aa26ae57b37fc3eaeda414e46e2d9c6a9cfdb27cd56/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0928d0eb1cdea229464de280d0f7cd99314ba28cffd2c4d6c9ce6902f9d6d448", size = 1035685, upload-time = "2025-09-08T05:40:38.992Z" }, - { url = "https://files.pythonhosted.org/packages/cd/dc/91776b34ab09f36ea41449951148bef731f9b355a2d2b25d398eec774926/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7f9519dd3b8814ef6e801b9797f918fe7a59937fac4784cb280c8350fb1a2cf", size = 933865, upload-time = "2025-09-08T05:40:41.089Z" }, - { url = "https://files.pythonhosted.org/packages/01/97/12deaff5e608207398a9f0eaa06447ed69e8c4873ee953be553f9440881a/python_calamine-0.5.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954cd764c6b24735c749a447523b4ccf4b9d2b7c231ddd304ed42c15afca9516", size = 902310, upload-time = "2025-09-08T05:40:43.222Z" }, - { url = "https://files.pythonhosted.org/packages/45/da/45063eee203f6c9d9436d29dfc0f01db85c9264c86d1e438c3b452d7e97f/python_calamine-0.5.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3f0e9c59fece6bbf1a916947fba33e9b635327eb165784d05efed40027164d1", size = 948143, upload-time = "2025-09-08T05:40:44.874Z" }, - { url = "https://files.pythonhosted.org/packages/33/07/0b661166dd58367bd5d6cc2bf8441f61004dd5ef2555ab224da97b1ac5d3/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:63bb47cc080d8eb9bc654f0961ada385b58a57d4628b0a33d1003c8f62e6ae3d", size = 1067181, upload-time = "2025-09-08T05:40:46.598Z" }, - { url = "https://files.pythonhosted.org/packages/5d/80/58b107dc2c2e6bad581f58f54b3ccb07705094ff23734c8dd30bd8aef4e8/python_calamine-0.5.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:adb62aab9b9298b2fc378b2aec6dd5802f7ee199c3431abae29368ef046f8005", size = 1072683, upload-time = "2025-09-08T05:40:48.629Z" }, - { url = "https://files.pythonhosted.org/packages/4c/b4/667e40dbe7d4f19a2e69f9cd186e069cd3af0411a177aa2a90231e3e0b06/python_calamine-0.5.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1de68d2586df7a7a05a7779031dabd4c3d95d4738314ba82e943c8d3f36b5a67", size = 843526, upload-time = "2025-09-08T05:40:50.334Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f7/fb86da5920198a616583f07d1a395cb1241eafb930d5c33f597ae6664711/python_calamine-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c70033bbd59f05491743befec5e2a90784f4c8220e7379ce03e956bd1f475be", size = 811074, upload-time = "2025-09-08T05:40:52.168Z" }, - { url = "https://files.pythonhosted.org/packages/76/2e/5a5a618b351b75155fbb40ad88e166f17ccf202401dd4b830db05b2565a6/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f396a0e57b1a5462668fc247377714b5b4c061718c1863c00ddc64e770b0f1e", size = 887735, upload-time = "2025-09-08T05:40:53.86Z" }, - { url = "https://files.pythonhosted.org/packages/97/cf/3cfaa550eb1c9c5501728886c5e787c3ddeb34d8bf3e7e9fcaf9fc6fbd86/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce737cb19d3077cabe0acaecd6b55d5df75021a520c20b47e0c75b65b4bfa919", size = 882356, upload-time = "2025-09-08T05:40:55.624Z" }, - { url = "https://files.pythonhosted.org/packages/88/b8/97f56e337149d0ce53399be9bd583f735dc1ea9abb2745ac902a09e8c401/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e54b30802fe089cc0c67c67407203412ec7144e84e0960e69c529c7170c37dae", size = 1033195, upload-time = "2025-09-08T05:40:57.819Z" }, - { url = "https://files.pythonhosted.org/packages/94/45/59a21a18c8e073d2f930a4a9c0c038207b82c5c996b67146fb76f3da2748/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5efc94c2e4119dc0da1e84d036f7e840fb0dd0850f4c10d3d166d725af0751af", size = 931846, upload-time = "2025-09-08T05:40:59.93Z" }, - { url = "https://files.pythonhosted.org/packages/36/47/715e0c0bc37ccce035ef4be1aa8eafa1e5abb6687af725cb47d81a18def7/python_calamine-0.5.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e33191a01d52f66dd6b029e99b6eda0245771c4f116c87ff0d5edf922dbbca", size = 902871, upload-time = "2025-09-08T05:41:02.021Z" }, - { url = "https://files.pythonhosted.org/packages/ca/07/ac0cf8623765106794e297235d6dde3a728f18e61a536792189fca06f2ba/python_calamine-0.5.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85ceec02cb367cf87a72ba559db3279f3b4774edba9330eb77670587d4de95f4", size = 944438, upload-time = "2025-09-08T05:41:03.748Z" }, - { url = "https://files.pythonhosted.org/packages/88/98/c48c0b8be7fbae5f68b7c55a1ed4068d2c3dab64093e39733d43c23a7459/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:882400368f976ea489e47af04fde936b603c3efcf9ade1cd73e623c88fc4aa5c", size = 1066276, upload-time = "2025-09-08T05:41:05.408Z" }, - { url = "https://files.pythonhosted.org/packages/73/3a/bbf99531fec43bca2ab28948ab94d851db96c0364c76139dd746cab2f4f9/python_calamine-0.5.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ce2fe421d5564e5341f7a06b9c52b84603b48aa670426d44fffce705609a859b", size = 1073059, upload-time = "2025-09-08T05:41:07.75Z" }, +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/36/473a55063a6af3739cdf4b879869d3067e677f3dfb52ec8fadac23941a33/python_calamine-0.8.2.tar.gz", hash = "sha256:b2000c085722afd01d973af3d58325d26cfd798b3665bb0924e3a658351ebfad", size = 227187, upload-time = "2026-07-13T13:58:26.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/18/adfb951c33dedf37c3c9f5804af04eb8a18ba12dc0d3901c98563462f565/python_calamine-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0efea8e1fc617d43351abe7c9f8ce7585b3a546d08e5c26d87d1629369a4b6e5", size = 864109, upload-time = "2026-07-13T13:56:31.591Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5e/d9b2cee430feb7eeee2d84b19e61266cda0e2880d126441a7f19b31772c7/python_calamine-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a99eb1a74f9a93af4c5a5586e9fa72de1879721c47fd21aa9e042deb6832e30a", size = 846205, upload-time = "2026-07-13T13:56:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/de/a5/4cbd1a01279372a20319629ddc832806914827bd1edc8801ee7956c275fe/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96daed873be1f70d22795fbf197d3d833655aad6a149c15154651b7773d3a1ad", size = 923414, upload-time = "2026-07-13T13:56:34.952Z" }, + { url = "https://files.pythonhosted.org/packages/45/1b/9d646373c241082ce4488a0a297f8834a2513e17c6ce098506f91bb0f4c4/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17314a59fe01bb1bb7010240a578bf85e49b47af955622ae5f06f286d6d6954f", size = 918317, upload-time = "2026-07-13T13:56:36.467Z" }, + { url = "https://files.pythonhosted.org/packages/34/0d/73f4bcba43fc7a89ec48cbe1459d0436d6205a85ce720af54682bd14116e/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1396287f66a54ec2e68c6448f0c782173dbb3e8c2aca4089195d8c9a52b46c72", size = 1087802, upload-time = "2026-07-13T13:56:38.113Z" }, + { url = "https://files.pythonhosted.org/packages/47/54/b71763efd1c868d096fbad6f080de39ac83d832b456bc0ff285e74237723/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da1b26061783d2bc1d7aabc83cce63706cdacb6b03c6c6a37d3ea33ad34b7b4b", size = 986451, upload-time = "2026-07-13T13:56:39.743Z" }, + { url = "https://files.pythonhosted.org/packages/27/61/deb1b368933ddedeedbd7bef8aa71185eaff66dc058b44ca9f4a419925d5/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a148bf41efabb39ee99eac2552223c3605d29beaed6bd7a14a2990e07022e3b", size = 920176, upload-time = "2026-07-13T13:56:41.308Z" }, + { url = "https://files.pythonhosted.org/packages/c9/df/7645e4d3ea983cac1bfe2643661fd03b92db2736cd97ba1bda367d86a61e/python_calamine-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:21afb508d71f83c12c1c01fef21d9285f91820d052998e44706571bebd835cf6", size = 996879, upload-time = "2026-07-13T13:56:42.951Z" }, + { url = "https://files.pythonhosted.org/packages/af/b1/a88e1c7bc883f2767cc09247d395ce530c903a6bd2cc40e1f2000e6eaf85/python_calamine-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0cd1c5592b4a2cc7b0a92c5289f0eeef74e8ce3c5af9cc12361ae75625b14926", size = 1098763, upload-time = "2026-07-13T13:56:44.708Z" }, + { url = "https://files.pythonhosted.org/packages/0c/59/de0fb08a1745d30d85cbef6b474e975a92bb7c6daf6aa37fc63960ae4674/python_calamine-0.8.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:70e6e7aa5e74234254cae87e60a7ccb525e6962f73741f2b1927536aa7cb0093", size = 1192807, upload-time = "2026-07-13T13:56:46.379Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f5/d6956857490924ab9945d3be6624dadee1918d8630288009a2b7ef7700e1/python_calamine-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2c2d65dd0cff571ad9463fc964194507e31295387bc1bbc76c2604959d694c0f", size = 1136033, upload-time = "2026-07-13T13:56:48.346Z" }, + { url = "https://files.pythonhosted.org/packages/12/06/1992fa129dde6f7c5feed07d3b74df37a231782922af2ca6ff89917cc676/python_calamine-0.8.2-cp312-cp312-win32.whl", hash = "sha256:8938f66e6797d9d778504e0f827641d5067784dc68f18d2c2307abe615fcb85e", size = 734193, upload-time = "2026-07-13T13:56:50.546Z" }, + { url = "https://files.pythonhosted.org/packages/63/31/aed4b50630ba23bb3372b4cebe930a92201dfd2c1c072e2d1570a042542e/python_calamine-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:7a64237cc6b3d56b478686adff16502aecaf356543204bd6c70d754023a3d6aa", size = 774599, upload-time = "2026-07-13T13:56:52.278Z" }, + { url = "https://files.pythonhosted.org/packages/84/c0/23b910999d2d9e1b9145fc3be645add1e1cbc90cba4a39a9ca9d23ebe678/python_calamine-0.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:24607bde04b76f8329dae4963d22830a78f1eaa0622325217e53c5377143384c", size = 731385, upload-time = "2026-07-13T13:56:54.041Z" }, + { url = "https://files.pythonhosted.org/packages/0a/31/134e7b2ecdde486ec4e5fae763f84973fac6a097971aeb9648c0031ee365/python_calamine-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:923825ea049f7a16bfa0333e237909dfd109c7a44ad156c6d83921a768382020", size = 863158, upload-time = "2026-07-13T13:56:55.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/aa/36ec3c85c50b08c8f4df4adfb762a6978ef0da08264d5813ff3b55518137/python_calamine-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed9a48c892aed565e6250a9a38222806db49334868e174b30e6670caa4231c4a", size = 845854, upload-time = "2026-07-13T13:56:57.584Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/4ef12d9c4d3774410eec3a1b377542523ee18b606b91b0281f8db5ac8819/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f28ebfaa0ca306ec25df2cf6d5cef4838769ebd5536edd1eb0aa9a77935189fa", size = 923463, upload-time = "2026-07-13T13:56:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/df/a1/41db6b31011ac5c4ad3c05f4f8078a7d24d81f4288c756829cbdc941cbcc/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0a229632dde778a03d3c1ff159da4762e04d8b5e69be94edbf005da152de944", size = 916869, upload-time = "2026-07-13T13:57:01.063Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/b582691901b90b52884b8f525d4be7e27e423040b17ec4f50d0f8ac8f4e5/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b67798d130fe8c89891c3e75f9334e0e18c2c8e6527d276954c31c9dc426d39b", size = 1086769, upload-time = "2026-07-13T13:57:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5c/a05493fdcbf8aede4362150edd0dfde4e87db53c23f1668cc6aa4d4b40a3/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eebc266e7c40d337112a9cfc82f9c9d7587121fa4e86673da1e97f8855039c", size = 986561, upload-time = "2026-07-13T13:57:04.346Z" }, + { url = "https://files.pythonhosted.org/packages/db/c6/8c12291275f63d314723d1480be017f0c32d5fd4dea76b66205ebd05dee2/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe476889191a80b05a514b37f89a7d364e1ad19783918e93b0a053e2e2e9f08", size = 919538, upload-time = "2026-07-13T13:57:06.049Z" }, + { url = "https://files.pythonhosted.org/packages/cb/5d/dc12ce14a748b180cfa22d6a9e5dc372808050466666ab9776623f437c61/python_calamine-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:220b1a2962f5394edc0f5918d91e4dd3e9f3c6c521d0f2a4ccaf3d3ace980a28", size = 995727, upload-time = "2026-07-13T13:57:08.315Z" }, + { url = "https://files.pythonhosted.org/packages/ab/da/72986560b082a005d88e5b74cc89686fa8f767a5173436b9dd3d0f43a33a/python_calamine-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:02d52d6d7792f82d97f1b8e15001fc08f9ab75a57a62fd849313c0a6b64d38af", size = 1098601, upload-time = "2026-07-13T13:57:10.071Z" }, + { url = "https://files.pythonhosted.org/packages/00/9e/e5ca987e17e043079a391a1fff7c13f2b5ed6908a25b54baac2e41d2db84/python_calamine-0.8.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c55112b2b0f65f7e6757629e89d0b063689d8fa821736d9b81a1468db08d0085", size = 1191819, upload-time = "2026-07-13T13:57:11.758Z" }, + { url = "https://files.pythonhosted.org/packages/78/23/4cc7cc53d342ad7b74e3780aefd60a6af0e132f3e5d964a1847ccfe32ea5/python_calamine-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2e8f0753f1ec064704e256a2d5793f42f0cb256710501cf060f5f3a47e5dabc8", size = 1135376, upload-time = "2026-07-13T13:57:13.391Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8e/1a9649ffba117731b44ea57cd6c0b7925cc5a04b9d6f7858031cd9987f01/python_calamine-0.8.2-cp313-cp313-win32.whl", hash = "sha256:f276aa353f5be38e15968f861f7102abf53d1fe261638846e7e9c9913a124d7c", size = 733696, upload-time = "2026-07-13T13:57:15.028Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d0/55b921a2459e4b1cba914a2ed94d5ad0d711c2015e33ab201038f4b1627e/python_calamine-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:62b7e41046056bfba7d2957a8a1566fc22a010a2929f0c8174c7a911555d0cf9", size = 774314, upload-time = "2026-07-13T13:57:16.753Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ea/11d2d984d71673c6070a23d9a5fdd9bf174f83eb7e7c8909e27a4f9af740/python_calamine-0.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:024a367c90a61c02743f674025bcdd686a1cbe6466bb8fc67398ef5fbbfac4a2", size = 731178, upload-time = "2026-07-13T13:57:18.459Z" }, + { url = "https://files.pythonhosted.org/packages/c8/51/982cd7edc5e8886090adcc3b436e87a8ff8932a748269fba30ac6151551f/python_calamine-0.8.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:612904f321fa1c399f03efab0f4a557914d7b8a155d25f244cb816a051eec82e", size = 866292, upload-time = "2026-07-13T13:57:20.229Z" }, + { url = "https://files.pythonhosted.org/packages/f2/30/816181f86ec744c142e8efc6fdac49ab61221a1387fbd13798424a72995b/python_calamine-0.8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5dd0d8934c5b65392b7fe6f149c5b2eec0ce422ec50f35a389b579f53a3ad94c", size = 847675, upload-time = "2026-07-13T13:57:22.034Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/2c82689a076e438fa310fa8119e5e1d1166e2419a122f6137808a1a70a64/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccd41bed56ae3a7ff0de6f71860cd13edcf3ebc42eefb58eab201b5cc6ec7660", size = 923867, upload-time = "2026-07-13T13:57:23.739Z" }, + { url = "https://files.pythonhosted.org/packages/d8/3d/8e5da593780efb767f0d0fcaccec9f4bcc6f9beba9281969b2c51fee05f8/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:19c8d87444fe83ca0cebd95e01cb7166f1844455120319de4ef8581e03f63b22", size = 917529, upload-time = "2026-07-13T13:57:25.83Z" }, + { url = "https://files.pythonhosted.org/packages/f7/2f/56334bdb7c1bbdb2474ff927afeff72ebb558a301e2dfbb1691e6969e0e1/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5be7dca31f391cc2bc3d86a9e1ef88d51240565e9849b23642b3b95bd7ce29ad", size = 1089145, upload-time = "2026-07-13T13:57:27.658Z" }, + { url = "https://files.pythonhosted.org/packages/2d/99/908da083c1faa6ee215be079238f7d25022eaa577dd9fa3e88814f39dfec/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40f1c657eaa988a50638fc584226391e6897ba676ec3e35aaed0db7d8b02e3ed", size = 987785, upload-time = "2026-07-13T13:57:29.57Z" }, + { url = "https://files.pythonhosted.org/packages/52/90/f7a71c8991911a431ed31f83cd9f3a49bf0e0e3395a27d3a47f60dd55826/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3cfce465ce82eb9100e5e90673a5844fd46eb7b8148c5404c70f941fd8280b", size = 921563, upload-time = "2026-07-13T13:57:31.268Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2e/768d8686fa4d87d6bcdee21959845d767e4913066e562cddd048516f9edd/python_calamine-0.8.2-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3655c08901562d7c44853ba966a62104637f216a67aa5ba5628115067811b3f2", size = 998078, upload-time = "2026-07-13T13:57:33.483Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b3/12273f5ea9df335eeb896e8f8d54dfd888b52d57f03d0e6163c86be28ac1/python_calamine-0.8.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c72d5310e28a517cbb14812cd60a41c264d65b2424e6413c08f5f7160eebafd4", size = 1099253, upload-time = "2026-07-13T13:57:35.404Z" }, + { url = "https://files.pythonhosted.org/packages/02/64/3f222cc693eb6bbae0cf1bfa3c45300d6024cb515a8380779ca46ea096db/python_calamine-0.8.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:2e88eef40b2f39aa9c32cf6d2d7e6bf0c8669547f8a196883bae6d202458b358", size = 1193093, upload-time = "2026-07-13T13:57:37.147Z" }, + { url = "https://files.pythonhosted.org/packages/56/a0/91d06d24caa01cbb7d020155a0ba565d5acb15b873705c72c69dc36351fc/python_calamine-0.8.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8e9b57dc1553bf86e2793d86e0b9268855f5382391f01be78c9c06aa30bad3a7", size = 1138084, upload-time = "2026-07-13T13:57:39.059Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ba/279277863792e26982c6a9c9b9700c36b4319e7ad3424fc4e8164b6db5a7/python_calamine-0.8.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:74f5038df6c40316e7f1d20c7d478baf6a6bd227e91f17aae2723014156a895f", size = 515427, upload-time = "2026-07-13T13:57:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/5d/39/29677d6a4b5bffc78b35bb6a30e904ec0af71dc0bfc105a342150fdce70c/python_calamine-0.8.2-cp314-cp314-win32.whl", hash = "sha256:853e6789c781184998bc13c9a1affde29ef76d07112e339e379c45f4ffe0d911", size = 722761, upload-time = "2026-07-13T13:57:42.399Z" }, + { url = "https://files.pythonhosted.org/packages/c7/71/bd69ce8cc651d1db6a6c2051c1d34fa22fc6ea6bbfb3cbf1feb49fb2b25a/python_calamine-0.8.2-cp314-cp314-win_amd64.whl", hash = "sha256:408c60e8c5671c87dec3fda2268475bafcd05dfc7684c72ad15adb050ae5dc45", size = 776909, upload-time = "2026-07-13T13:57:44.451Z" }, + { url = "https://files.pythonhosted.org/packages/97/00/1da6c1d4a9a83be80273e2136b10a665da53012a86388895e9554d65a7e5/python_calamine-0.8.2-cp314-cp314-win_arm64.whl", hash = "sha256:16630004b39bf4a0dcce09653fd28390781a2db07e9d8bcb0f85d8e5d1814707", size = 746538, upload-time = "2026-07-13T13:57:46.195Z" }, + { url = "https://files.pythonhosted.org/packages/33/ce/a089dee93f684398101a807177cc9fd5c0f04ea98dbf1c6b12d761a3e0b1/python_calamine-0.8.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1d1db66f7043d13fd6f6c5d77c7b34598864ad14e613d02cc538ec3e9b46d296", size = 861568, upload-time = "2026-07-13T13:57:48.146Z" }, + { url = "https://files.pythonhosted.org/packages/64/ab/6f5a02a28d06070bcaefaa60f980097ea10ce1302912822e9cad976afc83/python_calamine-0.8.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3478b5f950e9722d284271b3cf7a7e83c43a0f93cb665474f8a158e12699a52e", size = 844446, upload-time = "2026-07-13T13:57:49.849Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9b/01bccf504edeb5419c4a138302004c7a3b14db537554f0da8b4b217c94d1/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c307f6e5f5c55a58a3a64b96dd3a7ca437570efea8e1b8515108b1cfd9adf46", size = 920817, upload-time = "2026-07-13T13:57:51.816Z" }, + { url = "https://files.pythonhosted.org/packages/d5/65/c555639d38376908a2258ad7c06e8f12ffb774343531dddd5acce1a7be9f/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7dc9d63b44b0681a3ff4be1810bf63042d3492bba3e4dbf0273318170fb82e59", size = 915360, upload-time = "2026-07-13T13:57:53.576Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a2/ba37bc638ecf4dbf651cb0e9db4fac495881739434c7eb106653bc686f8f/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd903b60575bf8ec45c5797a64d1960e46cafe0d5ae479131d739aba6f094775", size = 1086101, upload-time = "2026-07-13T13:57:55.575Z" }, + { url = "https://files.pythonhosted.org/packages/6e/41/732501f6a965284dc429c56d90f56328ad5c9ec57ccc6404b6bd5a07605a/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5770e6fb816792ff329505d4a6a0eb3439b0b5e5c05f601268fb3bae26a52844", size = 985151, upload-time = "2026-07-13T13:57:57.357Z" }, + { url = "https://files.pythonhosted.org/packages/71/4a/90f3646da7c8546153229b9df2f97cd3dcb644d747bc28e0ae7773e6f3fa/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7351f2e8833ff6d6e2e6bf7bf1327a69527513f5e8cfb8d51f13ea32d2bcfb16", size = 921694, upload-time = "2026-07-13T13:57:59.071Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7b/96aedc02df1cb762578b44af05413d51cae9b041319c0c200ddfc4aa36c3/python_calamine-0.8.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1804917c652b674e9456419f4c80add237b2edc94e192e9b6b7ccd7b2a7c4105", size = 996333, upload-time = "2026-07-13T13:58:00.856Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9a/b152b3d25f778cf5b90b60df9fec57ddb2f3d5c2c16ed08e751421a64d30/python_calamine-0.8.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:4ae30729fa4032f7a5d3fdca6968f4b5774967ea67bb62d7e5d198350419adc4", size = 1096283, upload-time = "2026-07-13T13:58:02.669Z" }, + { url = "https://files.pythonhosted.org/packages/e7/25/9c8c877f1632e70681437471a63e4d0ec150f72219665e1bcc0d2ba9d14b/python_calamine-0.8.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:67dad173dce245859eeb8335e8808835b53245bab75bf5a5b9f20435357c5156", size = 1191124, upload-time = "2026-07-13T13:58:04.747Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/035b56decd6c0855203a21235c501c9d1c0965a0cd80f5299a561f05228b/python_calamine-0.8.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3013f0872b6e4f52173d98fa0a6dbb83f1858440c1b858690893339e7d813c38", size = 1137036, upload-time = "2026-07-13T13:58:06.457Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ff/8bda87f105165a4535615d07f923f8490c2daa2a0bc2489549e9b182fe56/python_calamine-0.8.2-cp314-cp314t-win_amd64.whl", hash = "sha256:288a8f4556ae8df3c813c61da2749eb627b1cfb97222118f5413bb8c7a0c7f02", size = 775005, upload-time = "2026-07-13T13:58:08.221Z" }, + { url = "https://files.pythonhosted.org/packages/bb/4c/f39b08d79e452bd3c7edb15285e096fc8b1fe67a76ad10c4622d4baacfb1/python_calamine-0.8.2-cp314-cp314t-win_arm64.whl", hash = "sha256:f57c2cfc7854fac87fb0c8e4fba5eb25184f75f7bf340847deac6726d2c3b601", size = 744119, upload-time = "2026-07-13T13:58:10.018Z" }, ] [[package]] @@ -1756,21 +2299,33 @@ wheels = [ [[package]] name = "python-debian" -version = "1.0.1" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/36/f90e7d006dd9311a6185f1c34b403dd6d76ff583e7962c56e9374c462a48/python_debian-1.1.1.tar.gz", hash = "sha256:fe4fc3dc798dbf1f0ef5865e2b1b4f7cc0352b6a511b25ab7594906c64a73629", size = 127956, upload-time = "2026-06-07T11:06:58.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/47/e184f0004e63dbc49c4bad5e811218f66bece1b519f80b06a619b42e6ec3/python_debian-1.1.1-py3-none-any.whl", hash = "sha256:f98ae013e8e5310e49041cc3860a7105df73af73d4ff1d8afb474770d328a6ad", size = 138101, upload-time = "2026-06-07T11:06:56.632Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "charset-normalizer" }, + { name = "filelock" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/4b/3c4cf635311b6203f17c2d693dc15e898969983dd3f729bee3c428aa60d4/python-debian-1.0.1.tar.gz", hash = "sha256:3ada9b83a3d671b58081782c0969cffa0102f6ce433fbbc7cf21275b8b5cc771", size = 127249, upload-time = "2025-03-11T12:27:27.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/96/0f93e27c9f60a650838f2118159aa115fd5732c0716247917b7ba7ede665/python_discovery-1.6.0.tar.gz", hash = "sha256:6393b4eae1be8b2182670635e7baff89ac21cb9f8e86fd1ff40c7b1144febb4c", size = 82849, upload-time = "2026-08-28T17:30:02.366Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/15/e8096189b18dda72e4923622abc10b021ecff723b397e22eff29fb86637b/python_debian-1.0.1-py3-none-any.whl", hash = "sha256:8f137c230c1d9279c2ac892b35915068b2aca090c9fd3da5671ff87af32af12c", size = 137453, upload-time = "2025-03-11T12:27:25.014Z" }, + { url = "https://files.pythonhosted.org/packages/43/5e/21abf578182fb15006a57faf3711a1e659e29d600d19b6e557eae908c81d/python_discovery-1.6.0-py3-none-any.whl", hash = "sha256:d4e244cf17b8b29819ed78003d55fbacf86eda23425b075454fff9271b79377a", size = 38451, upload-time = "2026-08-28T17:30:01.236Z" }, ] [[package]] -name = "python-io-wrapper" -version = "0.3.1" +name = "python-magic" +version = "0.4.27" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/74/8dc5f7d0b7cc1a0ca9e5c320abf11adee2094998c93ae8c9c80d9a8323ff/python-io-wrapper-0.3.1.tar.gz", hash = "sha256:e3391787ff0d9870e739294c6392437915502153e695a017450aa46b6d091762", size = 3271, upload-time = "2022-11-14T15:00:10.932Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", size = 14677, upload-time = "2022-06-07T20:16:59.508Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", size = 13840, upload-time = "2022-06-07T20:16:57.763Z" }, +] [[package]] name = "python-slugify" @@ -1784,39 +2339,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, ] -[[package]] -name = "pytz" -version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, -] - [[package]] name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] @@ -1831,29 +2397,136 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] +[[package]] +name = "rapidfuzz" +version = "3.14.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/97/226c43b7b5d957bc3840ed52ea99eed261f99834c4619be7a4742cbaeafa/rapidfuzz-3.14.6.tar.gz", hash = "sha256:e13a8160d017b499ec7a2fa9d0ce1ae2e7377080815785819f966fb235d4eb60", size = 57955060, upload-time = "2026-08-30T21:45:51.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/d2/5a7646b185a61400220e4783d23461c1e864a9ee82ba443b18c218e2364b/rapidfuzz-3.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b46cecf27025e7a934332ade033e6a394da8a493f19fa1d835e3b2968a4ff7da", size = 1965178, upload-time = "2026-08-30T21:42:24.164Z" }, + { url = "https://files.pythonhosted.org/packages/8b/72/10fc4e414eeed7963e2f1c315c731cb68196f0478cb244c78a21f5ce8662/rapidfuzz-3.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1901414b135afb1a7f4b1ef940b95523b49cc5642aecf02af740f37567e98137", size = 1248230, upload-time = "2026-08-30T21:42:26.088Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/0794043c1a0af09cacdbb6a9e8b9b2079cdf73337e7c29b4a9f117415bb9/rapidfuzz-3.14.6-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96a548979cd939b2c69358a0f5088a408524fbf7454f04bf90939fa971e64310", size = 1380396, upload-time = "2026-08-30T21:42:27.97Z" }, + { url = "https://files.pythonhosted.org/packages/2f/73/9218cf4424ab86260ee88ebdb612c5ed4d9bfd6b6d1e2f3c3bf4599d13bf/rapidfuzz-3.14.6-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b22ef7e5e2341efc6216b666491022027b984e5aef93446064742f43f3c1d926", size = 1674037, upload-time = "2026-08-30T21:42:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/a1/f5/bad528b6dfc608a48838508f270c79332ab05592703c9a46504ba95e9eab/rapidfuzz-3.14.6-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f0d2d95c787d812b9106cfbcb94ad37a49f59df9287e00a75eb61afc246e8759", size = 2722897, upload-time = "2026-08-30T21:42:31.737Z" }, + { url = "https://files.pythonhosted.org/packages/13/da/49ab137f788a0e03e872d4c6b3d5c9c6c6bed4e4ccea381f69c4d186341b/rapidfuzz-3.14.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0debb5f43662ea84d2f0228a0c7407ff647f9c3d13f3b692efff0cde46eebce0", size = 3168023, upload-time = "2026-08-30T21:42:33.663Z" }, + { url = "https://files.pythonhosted.org/packages/59/33/81ca664a15194b8b4a7e863b534e36c057724f9709c7781e9400d0edf024/rapidfuzz-3.14.6-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:1d253e1fe44648242a0029b42ba23adf238ed2a7eb3d8ed0a03731a23f074ae0", size = 1474666, upload-time = "2026-08-30T21:42:35.5Z" }, + { url = "https://files.pythonhosted.org/packages/87/eb/b16f9f8cc255c8dc7c0d7712aa7e7c12a6fd85c8b2b56665f2a24222a941/rapidfuzz-3.14.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e06c6050c9bf6cd72305e3e6a293918b2b92cf2a067007585a53898624902e3c", size = 2402289, upload-time = "2026-08-30T21:42:37.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/73/eaa1ca89f6ab12c0fe7f943226ce4ad1d2c67eb281dfd706279771fcff5a/rapidfuzz-3.14.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d85a6e9180e53cde95c95dfeb05a2ac94ead4d9d803a8fd186d2719a678b8483", size = 2788332, upload-time = "2026-08-30T21:42:39.412Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ad/db927fbe23f621dd292a6332a19822703084617c0281a88156a8c138d4e0/rapidfuzz-3.14.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:35db2670f69fa3a4eb4741055581477ff92f2cf39e7e06f43ebcb97c2192fe7c", size = 2510540, upload-time = "2026-08-30T21:42:41.629Z" }, + { url = "https://files.pythonhosted.org/packages/2d/b2/8e9012968fab837babe1292edcbe1c972605f5b3af19c7fcac2ded731d39/rapidfuzz-3.14.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f9d93e5424d1e4c103b57906b8beba270e680afda3ffdff7ea3bc6173b37083c", size = 3299876, upload-time = "2026-08-30T21:42:43.803Z" }, + { url = "https://files.pythonhosted.org/packages/19/99/799ce99328ea97fe5d7510048ffea148b8ad4a838366f908691be52342a5/rapidfuzz-3.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9b0a501f37fb852c54469375baa25874246b3bbc8b6e21fb4cd186a32335868", size = 4277032, upload-time = "2026-08-30T21:42:46.08Z" }, + { url = "https://files.pythonhosted.org/packages/07/8a/995b4746c5bc1f561e64de1fa546927183fec7a369fe988716ef394a6d0a/rapidfuzz-3.14.6-cp312-cp312-win32.whl", hash = "sha256:9e974251a9833791bc557b46f975676a56c2d58946f795cd2964b095496dfdcc", size = 1887051, upload-time = "2026-08-30T21:42:48.265Z" }, + { url = "https://files.pythonhosted.org/packages/84/c4/12f01df5778227c8655fcd9b429fc001d43270f5d8d154edc9066bab1de3/rapidfuzz-3.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:cfca36e4612208875e08611a779164b6cb8900ab8bbd3d82d4cfdfae9efbfac9", size = 1731992, upload-time = "2026-08-30T21:42:50.211Z" }, + { url = "https://files.pythonhosted.org/packages/19/8d/92217f0bc81ec458b4134ad53714b1be0cd3be21494227d73510b06467d6/rapidfuzz-3.14.6-cp312-cp312-win_arm64.whl", hash = "sha256:96bbd5a1c67d135334d02fae74f1d933fdda204ea03d544a59dab6b1cbfbf565", size = 1186693, upload-time = "2026-08-30T21:42:52.63Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ad/4901a37256bc5027f3873ebd538b851349d7627d8aa2e91743c79b500f48/rapidfuzz-3.14.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:55dc9a55924b4ecfcf4a60a701bcfae7d9daf0129c41dc16139270d75be0996c", size = 1961301, upload-time = "2026-08-30T21:42:54.46Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/5a56e26db79c00191bc7c5387a04dfa5b6326c2c81c468a976ee2aa8fa15/rapidfuzz-3.14.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bba0e9fad4dbea80227cde9cef3aaa984a934a84aec5f7505532e19838b14769", size = 1244370, upload-time = "2026-08-30T21:42:56.425Z" }, + { url = "https://files.pythonhosted.org/packages/2b/12/0958686418e596961642c41e9162906363649e70f6a12cfcff212f77ccb3/rapidfuzz-3.14.6-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b34b7ee4f4f760690d6477163aabbec05705b5dd764cb6c3a6ba95aa1fffc42", size = 1377336, upload-time = "2026-08-30T21:42:58.687Z" }, + { url = "https://files.pythonhosted.org/packages/60/09/a0a70c35996fa5225c8cddca38e2e594c82518aeefa08edb5d875ce0d82b/rapidfuzz-3.14.6-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:abe92a70134c8b40790bb5c78b2a0a790686c26e83b6e99a456127ca141fe06a", size = 1670277, upload-time = "2026-08-30T21:43:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d7/b9deea614b32e933e37d77eecf539ffe2b41c0a922a6fd759993865e7ee5/rapidfuzz-3.14.6-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:659b41570fcc6e02631ac361c47cc8db9ad26d740e4be2177df1b63005a49174", size = 2722260, upload-time = "2026-08-30T21:43:02.655Z" }, + { url = "https://files.pythonhosted.org/packages/70/42/4bf9dc905df33bb4515895ff87f777d8df25a3617c0bf8f5d4716813d9ea/rapidfuzz-3.14.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb896f89a387219c671ebc33c4a636b222010cc3c5c83884a7fc8707bf0bbf9", size = 3165730, upload-time = "2026-08-30T21:43:04.632Z" }, + { url = "https://files.pythonhosted.org/packages/25/76/454acc3abfa6b958511d6e761f5a95e6c3128936a1eed4f23643c3267d8b/rapidfuzz-3.14.6-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:11d76bb2b2cd038df708ae18f521fb3a50af477cc5a0dffce812da43a2f1beb3", size = 1469515, upload-time = "2026-08-30T21:43:06.612Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f9/29b0f0d7764423573d35db4970dd573b324f4d41abe74d48adca542bcf79/rapidfuzz-3.14.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:28e9ce91bd41a8203185887ef9b1541a891aa61c5c1cb2e46f1689cd4288d372", size = 2401073, upload-time = "2026-08-30T21:43:08.742Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f7/86ac824a7dd2b58729187cc31edebfa7805418f66d97d625010b7383d1de/rapidfuzz-3.14.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:864658e5a10d249a2277374e800f944fe990346d70eea6f3a51b712b6dd01984", size = 2786567, upload-time = "2026-08-30T21:43:11.048Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a6/39fc42e45eb8ee70304862523b2e55cfbd2561c560dd8da1071015fa0ff0/rapidfuzz-3.14.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:3c2444f5cd757ded2c3ba8b1734253b801b9b2ba9ecb3ee40cd505cebbfa7341", size = 2504907, upload-time = "2026-08-30T21:43:13.281Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/61f25272239ffef036eb3de1cc63372dfbff27193ca6f9f259d844f41a9c/rapidfuzz-3.14.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2cc9b5dde0ac89f7856f997ef917cac8e18e9dea473e9b3090a84bd600de6a91", size = 3298728, upload-time = "2026-08-30T21:43:15.518Z" }, + { url = "https://files.pythonhosted.org/packages/6d/02/f9bfff9e19e852b097afa837a8000592bcd714fe80827a76367b958771b8/rapidfuzz-3.14.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:faebff9b9a287fb673f9a66465a7e03043601c9bfe5e71c3f91b3f2e7b8a37f6", size = 4272030, upload-time = "2026-08-30T21:43:17.785Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d4/5845698661cb23bc7935536c28f5b86b2b3606de1f54722c1cfac39f170a/rapidfuzz-3.14.6-cp313-cp313-win32.whl", hash = "sha256:4406b2517b85febcf9419f8fbcdfbd534872ea32608050f9562224933ca49a4c", size = 1886313, upload-time = "2026-08-30T21:43:20.173Z" }, + { url = "https://files.pythonhosted.org/packages/67/f1/5b7c56737b9e5af7523ea79e90df732e9e4b2fa66fe2b333ee013ea6e541/rapidfuzz-3.14.6-cp313-cp313-win_amd64.whl", hash = "sha256:c69fb0e064d10c79908dcda76d7ca8ecdf8393a39acbb74dbad3f709f2c60e95", size = 1728638, upload-time = "2026-08-30T21:43:22.169Z" }, + { url = "https://files.pythonhosted.org/packages/05/5e/fc1da16b7f5245a7cc61dc08f70391ddaa1c538be1cf92681e7c763b77a4/rapidfuzz-3.14.6-cp313-cp313-win_arm64.whl", hash = "sha256:a0c8bef04f6b1d9fdbb319576350af53151a64692d477db7d4844c220bc8e212", size = 1185777, upload-time = "2026-08-30T21:43:24.27Z" }, + { url = "https://files.pythonhosted.org/packages/67/9e/8f862d2c8d80ee02633f1c9ce3e5121ce955e61efae24a61a05dd8a55fef/rapidfuzz-3.14.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0f8d6718e7edacdb16455c0472e7552fd518decb91e91250c58784fd6163f54f", size = 1964420, upload-time = "2026-08-30T21:43:26.328Z" }, + { url = "https://files.pythonhosted.org/packages/3e/28/282e8c76b7dcc91e8f5aa1a594168d2136639f29dfda11384c6d36aabca0/rapidfuzz-3.14.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8fa7d45388dec34a86038f2a38380f4922b74b5dd8991247f629a531178db10f", size = 1246072, upload-time = "2026-08-30T21:43:28.475Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ae/8e0f714c55180667d66346e46a3d680dd9809bcee1c5f03557a58b4f2ef6/rapidfuzz-3.14.6-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:760ee152af5e8b4d241a469f933ba2d7215248618ae19770fec7d80d9e149db6", size = 1381829, upload-time = "2026-08-30T21:43:30.67Z" }, + { url = "https://files.pythonhosted.org/packages/eb/9a/4a106d68033a81c24ab71129e3016cc6a27a668f30f436e729cae79048e5/rapidfuzz-3.14.6-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbe3378db3ae0453accf6196e2ed943f43d416cfacdcb8883db105bc14a0130f", size = 1676195, upload-time = "2026-08-30T21:43:32.862Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f0/b456a74d8e33051b76b3f156cf4d55f717614d68b44b6312ae1f5d85b31d/rapidfuzz-3.14.6-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9ddb0ddf3ee616fdc066add4ef05639c5cf59b58d83779b6023488e5435f6191", size = 2714364, upload-time = "2026-08-30T21:43:35.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/56/1203b46cedefc3f0c16e10d87123fdd4ec0f2e209f65cd2bf221ec669217/rapidfuzz-3.14.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:08bc63b88048376114d1e66cf8fa6926495d03bb873eb87854fa74cf6848a70b", size = 3167618, upload-time = "2026-08-30T21:43:37.625Z" }, + { url = "https://files.pythonhosted.org/packages/57/17/fa4a0853979b885ff27488d9b80e7c5c985dfed74c5021ea95a3b54ddfad/rapidfuzz-3.14.6-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:50cd6718bcda7ec5293635a9d0b3fb5906251013d3b99ca403ba9dfa8965f661", size = 1471360, upload-time = "2026-08-30T21:43:39.852Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f2/757615ab88f7922b4477f9c93356c4512d744ea042e3e2b41554aab5ec1e/rapidfuzz-3.14.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:63b0e84faec3c5706cae8ae51246ff103407d54efa32a615a548b7b67392ebcf", size = 2403946, upload-time = "2026-08-30T21:43:42.038Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c3/1c2670ff528f7e625d7b552e7ebccd5c4dfdcb84dc08ee85d1bcc0cf1465/rapidfuzz-3.14.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9080a730fdcf3cb8a07464c90f9cf40c1b4ffc73a8375b56a8898aba619dda30", size = 2793123, upload-time = "2026-08-30T21:43:44.438Z" }, + { url = "https://files.pythonhosted.org/packages/5d/92/a01444687bb9a5a2679aa71325c227760e9c475cd02054b45fd8b219cb0c/rapidfuzz-3.14.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:178557c7a50c8c8d65369ede7f3d845bf23590a951c9a368caf166b105d58cf3", size = 2507361, upload-time = "2026-08-30T21:43:46.568Z" }, + { url = "https://files.pythonhosted.org/packages/98/90/43d80ba73fd297c744f7fe0a949af2a610b4b9be96688799c3e73d002b13/rapidfuzz-3.14.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:44f1cddbc2010700e2d88063d0ab64183efe2578d9b52770ce1cd283dda230c5", size = 3304287, upload-time = "2026-08-30T21:43:48.966Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e9/fd9a160699b72b6857551642fe109a1d0a86b06b7ecc0d2b4bbecbc6b61b/rapidfuzz-3.14.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:17081a0e904c12bb4ed49619a2bbb6528f6af00fe850e7ace22487bfd2aea455", size = 4273338, upload-time = "2026-08-30T21:43:51.574Z" }, + { url = "https://files.pythonhosted.org/packages/d0/72/3bc42217fadd07ea0ff9d249cc8001d6f285197c253db95d3a03aac8c254/rapidfuzz-3.14.6-cp314-cp314-win32.whl", hash = "sha256:9e00c8c9500aacbc0c52b66369f54533ecbdcb92e5aa87e160fc8e293000a696", size = 1927357, upload-time = "2026-08-30T21:43:53.851Z" }, + { url = "https://files.pythonhosted.org/packages/57/8d/3ea3bf93a2f22858e1b1298126db35cbf58592d05571ca757f2f16071b17/rapidfuzz-3.14.6-cp314-cp314-win_amd64.whl", hash = "sha256:41ee893c4d7d0fb1844f6cad966540a833784b3bad2c239a0d80195d9231cef4", size = 1783090, upload-time = "2026-08-30T21:43:56.202Z" }, + { url = "https://files.pythonhosted.org/packages/13/17/4add9d94236b37b6f857a3bf34d696b32304e3debc6830584fda95413ac6/rapidfuzz-3.14.6-cp314-cp314-win_arm64.whl", hash = "sha256:10576c39fe6a49fad0bf1069371a77300ce166a3f36d2900d2d0bae08f297104", size = 1221915, upload-time = "2026-08-30T21:43:58.335Z" }, + { url = "https://files.pythonhosted.org/packages/23/a4/af0509bffac37645841e2a6b55a4c6c46f7b2fc0757610b0cba0cbcfa900/rapidfuzz-3.14.6-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1b0a9546a7328d3cfc2f1385501db7c4c374fb566dc1a3b22ad56092846c0134", size = 1994141, upload-time = "2026-08-30T21:44:00.931Z" }, + { url = "https://files.pythonhosted.org/packages/67/da/d46da45e393937509111d4affa4db794fb064341735cfdcffe1f5f13a78a/rapidfuzz-3.14.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9989280902b9c4ecf7de95fbb906e94df0d8c047290ed315c7aa1760cec9b3de", size = 1279969, upload-time = "2026-08-30T21:44:03.253Z" }, + { url = "https://files.pythonhosted.org/packages/4a/8a/1db5582d5c9684c57b1e292dc88d70177233b570e684fe30736140697658/rapidfuzz-3.14.6-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc166efa4ca2fc9cc52e43784a54cbea95fc0e03e533f8266ef66b1c04c7cb76", size = 1381099, upload-time = "2026-08-30T21:44:05.402Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/a9dba69d174b4436c115fcd877a67745d355a859109e0f59955c14577519/rapidfuzz-3.14.6-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:32352a3ed1aad9c097d31fd4f2eece3030169e2de3dedde7a2fadc2652b768ad", size = 1638869, upload-time = "2026-08-30T21:44:07.51Z" }, + { url = "https://files.pythonhosted.org/packages/61/34/67915218f5f84ec2cda57560d81425929b8ea97956eb31283bf95768fefc/rapidfuzz-3.14.6-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ecb45d616002751b58914d5b7c2e66acd39e12242be12717a1258148a1b36526", size = 2687831, upload-time = "2026-08-30T21:44:09.709Z" }, + { url = "https://files.pythonhosted.org/packages/5e/80/07985e10b534dbdd48df0ddf2e42f9d27cf98dc44e09fe047fc4b38471f5/rapidfuzz-3.14.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f9ad513e3a3e045b60b421d5cd3887ae0a33b38fc6c6db3ea5e27c0a2e0412c", size = 3185373, upload-time = "2026-08-30T21:44:12.162Z" }, + { url = "https://files.pythonhosted.org/packages/91/09/db64291ce5f11c0f79486b435b49f5dc66680f605077cb011d282bf767b4/rapidfuzz-3.14.6-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:f35723caef8cc31b6f34209708fb172fc88bab0077c12e9b36bbb829baaf1b16", size = 1459628, upload-time = "2026-08-30T21:44:14.427Z" }, + { url = "https://files.pythonhosted.org/packages/d0/99/7eeaf6f7f42d4ec8b90db54c73f7c2a727e208b4db6fd5ea807e87133b9c/rapidfuzz-3.14.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:408b2e8e8c1ac71b57f0923cf964d6932539725e07b69e70ec66f22c4a403891", size = 2407348, upload-time = "2026-08-30T21:44:16.832Z" }, + { url = "https://files.pythonhosted.org/packages/19/bb/db04caff7bf26718e97592f8cc007988ef18eb088ebb0742addcb25f0819/rapidfuzz-3.14.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5667c56fdc902fa1e12449b5c042e8b1c7e9b30040db20c396fbdb3d0a750866", size = 2758630, upload-time = "2026-08-30T21:44:19.196Z" }, + { url = "https://files.pythonhosted.org/packages/3f/26/962fc396a56ec37146eb5331e55ae53d19dc564fd921f49a6d524c83ee05/rapidfuzz-3.14.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:76a122fc573df603deb5fb827df31bb5efbd0826b50bb7aeca8535a6e8c70cf9", size = 2494519, upload-time = "2026-08-30T21:44:21.687Z" }, + { url = "https://files.pythonhosted.org/packages/83/0f/d2067e23d9b7fb2aeb70a6b36173f0b2376635483f670aa5c47f17e55135/rapidfuzz-3.14.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:e221366e24709b9d41d5f9cc99053b04cfc575d429e956a82cfbc4c4e9e8860a", size = 3262241, upload-time = "2026-08-30T21:44:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bd/05e48e21b1dd722b41c0cb8ab8867996f6e0c0a1b46e42921ace09799b0c/rapidfuzz-3.14.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:36710ff214b7a8049d26a9c81d99948026593cacb47663742c4119072b651ecd", size = 4296246, upload-time = "2026-08-30T21:44:26.911Z" }, + { url = "https://files.pythonhosted.org/packages/12/ce/f4b355f05b17bdb3a56f1c5e9bd864965dbb810f93d1b5d6044ecfcbd42d/rapidfuzz-3.14.6-cp314-cp314t-win32.whl", hash = "sha256:66ece6f5e2586c742fc3e0b8487e06783d27c6c24adcdcfdd7f306afbd8b5737", size = 1977694, upload-time = "2026-08-30T21:44:29.431Z" }, + { url = "https://files.pythonhosted.org/packages/4a/15/d2c20c57b357ec4157e74a197b3f622dbda0b2a82d1fc708ed7b262758f9/rapidfuzz-3.14.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cab4a932cec02d09471e2c9f1434049ef5bfe1f6e646ff10939c222dc610ad60", size = 1827262, upload-time = "2026-08-30T21:44:31.683Z" }, + { url = "https://files.pythonhosted.org/packages/15/e5/c38c19fbc1de82980e05bd3adbe1dc7f3dd0680e38e868646082317572d6/rapidfuzz-3.14.6-cp314-cp314t-win_arm64.whl", hash = "sha256:b056ce19eaea2ea70c6a6fb387a605ca2af8979de5b9d507597e8012820ddb14", size = 1245604, upload-time = "2026-08-30T21:44:34.066Z" }, + { url = "https://files.pythonhosted.org/packages/10/37/b015bf56f88e9b18b81ad462f610e70cc1145a9df39154fcbe7ddf9f8868/rapidfuzz-3.14.6-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:bc3d74d18543ddfbc8babe1faadb19927a7999fd0d01181cce9e721c14c36ab6", size = 1964451, upload-time = "2026-08-30T21:44:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1a/7b88284d85b4f7dfdf3038263e11eb11871472aa32902c7063a5fdd7a7c5/rapidfuzz-3.14.6-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:aaa83b633d877a05d549d2073629134998d1b3b9dbc114873d3ff4277984979f", size = 1245701, upload-time = "2026-08-30T21:44:38.841Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f3/444d939f4b6c3c86f67083cb792978f3f42c28f944e66e9152e910cd212a/rapidfuzz-3.14.6-cp315-cp315-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cbe6a62f71fcbca72acbf5a30e53380600369f257f951d664d81d30c0c598595", size = 1382770, upload-time = "2026-08-30T21:44:40.978Z" }, + { url = "https://files.pythonhosted.org/packages/23/a8/1830f07f7d3fcc56508135f130dbd24a917ddedb71107b04b2fbb33d5da9/rapidfuzz-3.14.6-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b82c21c30568e096ef2a9dda7d45c379e6141694e0472dac73bc4372ce13ccee", size = 3163591, upload-time = "2026-08-30T21:44:43.513Z" }, + { url = "https://files.pythonhosted.org/packages/10/e8/da76d94af820707dcbfce224b635fb7c389c19525426c31645c97bedd601/rapidfuzz-3.14.6-cp315-cp315-manylinux_2_39_riscv64.whl", hash = "sha256:fc950bb77105a2717d03d9f9c9e21e9ace7df2b8e864dd91edef7e32fa143be2", size = 1467985, upload-time = "2026-08-30T21:44:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/30/75/5cfc0d1491e3c60a8669e8e2b78942c4f395cccabfb9c73bc8b209664e29/rapidfuzz-3.14.6-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:c53a269bdbd71ffbc856d3db9e609478251001ee272507578fa838bc2bd421fe", size = 2405269, upload-time = "2026-08-30T21:44:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/c3/81/9c522c26cfe1909714eb840856106f1e419a44c4e0de034a3eeb873da00b/rapidfuzz-3.14.6-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bf4fb0f19c9dfce7a908c3e309753602ce3edb83bb74e9ff997e278765bf89df", size = 2507334, upload-time = "2026-08-30T21:44:50.903Z" }, + { url = "https://files.pythonhosted.org/packages/40/29/0bbd158eeddf05e5b581f89bf7c9f0cf330953579309b3806862d360a454/rapidfuzz-3.14.6-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:189ce2bf14938bfa003fbbe7e6da7584ed6ebbc4c560686255dbc20e2829f470", size = 4270388, upload-time = "2026-08-30T21:44:55.271Z" }, + { url = "https://files.pythonhosted.org/packages/be/be/2b67b32988cb96b7fa9461ff3436e275716df00f7817212ed0a1c1779062/rapidfuzz-3.14.6-cp315-cp315-win32.whl", hash = "sha256:7ca0f498bf771a87557e6d8b573aa6cf3daded58ae2eaeb6973618ce3e1615ad", size = 1927539, upload-time = "2026-08-30T21:44:57.796Z" }, + { url = "https://files.pythonhosted.org/packages/51/42/640e1bd16422392fbb6394def1f7dfd4d05bd13c986016ce4b3f91295430/rapidfuzz-3.14.6-cp315-cp315-win_amd64.whl", hash = "sha256:d4c5adb921b67dd79ffc0a14f92b9f8df3d012e66aab340b154ed87014229d93", size = 1783415, upload-time = "2026-08-30T21:45:00.091Z" }, + { url = "https://files.pythonhosted.org/packages/06/ba/c6966904eb7b3d1c6344e6c29245447625d156b11e9757b29adc3cb46037/rapidfuzz-3.14.6-cp315-cp315-win_arm64.whl", hash = "sha256:c9d135fb93709d707577da8a7a8ffc7283525a5b6d0ce55aa3724be5639ed65b", size = 1221931, upload-time = "2026-08-30T21:45:02.531Z" }, + { url = "https://files.pythonhosted.org/packages/ae/97/6dd7f10756eb703e11803c5c838191c2151112f632e29f5eacb1ed1cf86c/rapidfuzz-3.14.6-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:dd89abd1c4b3776c3471a817216830bd275441c8344bbda5d51a3bffe1e0fbdf", size = 1985107, upload-time = "2026-08-30T21:45:04.965Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/be587adefd9539a89cc6016bac44d222cda4c8212856759c82501fd89e4a/rapidfuzz-3.14.6-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:eab2d4680d7f438dbb1d484b187d59a943edea9c83f792c764a0c148a417a60a", size = 1272093, upload-time = "2026-08-30T21:45:07.304Z" }, + { url = "https://files.pythonhosted.org/packages/de/3f/982b2f1b2a16c46d4598829b6b2d7185921f146d5893630f917cb9d27542/rapidfuzz-3.14.6-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8683fefdd3484d64a191b3efbc8cbe9162c3eac891fd62d0a1b70e117ffcd434", size = 1371112, upload-time = "2026-08-30T21:45:09.699Z" }, + { url = "https://files.pythonhosted.org/packages/e6/12/2a1fe61cb9f0ac0dc4166bcb016df695047e75251481a197d47aa5ce8ea5/rapidfuzz-3.14.6-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2bc7af3a699371a941aac86dc8a79ac92adeb3c2add2aab02230e76068a0029e", size = 3175780, upload-time = "2026-08-30T21:45:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/abd33d0b7595643e598802a07466af388f1560d7b7cb70f442cc292f4067/rapidfuzz-3.14.6-cp315-cp315t-manylinux_2_39_riscv64.whl", hash = "sha256:40c2753e2d4dc96b25f8a25adc23ab0bb6cfd8bc8125a1753ac4b037d6ff6511", size = 1458364, upload-time = "2026-08-30T21:45:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8e/efc98b0cfb540f41661f6a8bf21b67807e221102e5e8fb1585233b39a3bd/rapidfuzz-3.14.6-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:36a37ddc729c33618d89fa221d3333b9b956dc38cf15d31301e6169d962399a3", size = 2398037, upload-time = "2026-08-30T21:45:17.434Z" }, + { url = "https://files.pythonhosted.org/packages/7f/c1/4d89214a453215d897cc76cd6e13937c8ea5dc9f8217993fe2b1eeaf39a5/rapidfuzz-3.14.6-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:635f242f4bdf05d1477fa409815bd73e5f78896773ace84997bc472ffeef685f", size = 2497044, upload-time = "2026-08-30T21:45:20.328Z" }, + { url = "https://files.pythonhosted.org/packages/a9/2d/70aacf6cb577470bdd6f06890d25ecb7ee8a56baa07b114d5877a93ecedd/rapidfuzz-3.14.6-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:40d0cd9c82083aeb30bae8dee265ae571e6748d0d7b222ddd777f33d95a3b712", size = 4284741, upload-time = "2026-08-30T21:45:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/92/7d/943a04a134a5d333c00d3a77169226defef5e081be9219a765afc176dda0/rapidfuzz-3.14.6-cp315-cp315t-win32.whl", hash = "sha256:15da2b258908eb38853c1a6a58a1d09d9aad9c721e03a68c8ba691cd31dff739", size = 1974478, upload-time = "2026-08-30T21:45:25.475Z" }, + { url = "https://files.pythonhosted.org/packages/21/0e/8356ca3e190e2bcced9b80e374d95b0925c4716b51e65720a55399983f41/rapidfuzz-3.14.6-cp315-cp315t-win_amd64.whl", hash = "sha256:3d502769263318690d4f6638b08483979d1b88cdc7c6f087482eea935fde4031", size = 1823286, upload-time = "2026-08-30T21:45:28.368Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/a0b0e6324b6384d1ab40feb4d16400af3b3101d38cbd15957edd9d17cbe0/rapidfuzz-3.14.6-cp315-cp315t-win_arm64.whl", hash = "sha256:07c7aa0b1e4b9999a54f9e73317d6743ff85442c8ef7b7fbbe6b190fd37d9e75", size = 1243815, upload-time = "2026-08-30T21:45:31.187Z" }, +] + [[package]] name = "ratelimit" version = "2.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ab/38/ff60c8fc9e002d50d48822cc5095deb8ebbc5f91a6b8fdd9731c87a147c9/ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42", size = 5251, upload-time = "2018-12-17T18:55:49.675Z" } +[[package]] +name = "readerkit" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, + { name = "requests" }, + { name = "requests-cache" }, + { name = "requests-ratelimiter" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/55/dc54f3cc9556bbb733c2546c0c1f00ba4f0577131877560a3ba47e5ceeab/readerkit-0.1.0.tar.gz", hash = "sha256:fc0611ce5e0436d95d5600bb07fb413fc13452392fc04d1fc3692dde6b21a37f", size = 38504, upload-time = "2026-08-11T20:12:46.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1b396d6dac931b49725d9f914f7f4cf402168526779924dc580a360ec136/readerkit-0.1.0-py3-none-any.whl", hash = "sha256:d8ed1405946ba8dd557b48bafd3a1dbaeb1e04b6105e507d6beabd1249dba4f4", size = 43924, upload-time = "2026-08-11T20:12:45.115Z" }, +] + [[package]] name = "referencing" -version = "0.36.2" +version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] [[package]] name = "requests" -version = "2.32.5" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1861,14 +2534,14 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] name = "requests-cache" -version = "1.2.1" +version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -1878,41 +2551,66 @@ dependencies = [ { name = "url-normalize" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1", size = 3018209, upload-time = "2024-06-18T17:18:03.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/32/ab/a340c7f529646f16e5656a8ba1424ed0de406203e4554868491786628730/requests_cache-1.3.3.tar.gz", hash = "sha256:79b72d5ac5143992d1836ad78f4d8e65666061dd44e220548caab3723089826b", size = 101179, upload-time = "2026-07-03T19:48:57.963Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603", size = 61425, upload-time = "2024-06-18T17:17:45Z" }, + { url = "https://files.pythonhosted.org/packages/a5/bf/c1775e49b350225bd851576ba75263bc728d8f05c0e31439a45f3429cc7b/requests_cache-1.3.3-py3-none-any.whl", hash = "sha256:c8df20ff874ebfc026959e3874e6c12bd6724934cdb10925915908453d4b17e4", size = 70788, upload-time = "2026-07-03T19:48:56.693Z" }, ] [[package]] name = "requests-file" -version = "2.1.0" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/f8/5dc70102e4d337063452c82e1f0d95e39abfe67aa222ed8a5ddeb9df8de8/requests_file-3.0.1.tar.gz", hash = "sha256:f14243d7796c588f3521bd423c5dea2ee4cc730e54a3cac9574d78aca1272576", size = 6967, upload-time = "2025-10-20T18:56:42.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d5/de8f089119205a09da657ed4784c584ede8381a0ce6821212a6d4ca47054/requests_file-3.0.1-py2.py3-none-any.whl", hash = "sha256:d0f5eb94353986d998f80ac63c7f146a307728be051d4d1cd390dbdb59c10fa2", size = 4514, upload-time = "2025-10-20T18:56:41.184Z" }, +] + +[[package]] +name = "requests-ratelimiter" +version = "0.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "pyrate-limiter" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload-time = "2024-05-21T16:28:00.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/71/aecc6307695ddad2d11f474cd79d79b111ee90dd123d697b76eaa1cd73a1/requests_ratelimiter-0.10.0.tar.gz", hash = "sha256:9c1a78d7646caa5ccf211a6c341abd16d329be2c8c35044a418aa9da7c0e7a33", size = 17190, upload-time = "2026-04-22T18:11:15.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/87/c94855590fde39c87cf671d242e555984d93e76d2029a6a3ad3a67a072ad/requests_ratelimiter-0.10.0-py3-none-any.whl", hash = "sha256:79a3e44c13de8d72705512696b44b94265bd96d997580c73e480373814af228e", size = 11408, upload-time = "2026-04-22T18:11:14.398Z" }, +] + +[[package]] +name = "resolvekit" +version = "0.1.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pooch" }, + { name = "pydantic" }, + { name = "rapidfuzz" }, + { name = "symspellpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/65/5444338e89679c2743561549490d7fb10bc08c529b12a297f46c294f5b49/resolvekit-0.1.12.tar.gz", hash = "sha256:70c2ced98bc3a07c577dfeddc72aaac7009b97c24636f6a574469a78230ec061", size = 2359162, upload-time = "2026-06-15T11:44:20.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload-time = "2024-05-21T16:27:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/812e595188edb861534307d1d9c1a9af8cf073197470294c008c27257472/resolvekit-0.1.12-py3-none-any.whl", hash = "sha256:73810c0f4f41b97bf4165dada67d2e99a9a7fed5b1800adb025b9cbb7837be56", size = 2521282, upload-time = "2026-06-15T11:44:18.971Z" }, ] [[package]] name = "reuse" -version = "5.1.1" +version = "6.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "binaryornot" }, - { name = "boolean-py" }, { name = "click" }, { name = "jinja2" }, { name = "license-expression" }, { name = "python-debian" }, + { name = "python-magic" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/f7/b59fe851b856d0932aedbf311a3d719f30783e27af6d05bb76d77072ab8f/reuse-5.1.1.tar.gz", hash = "sha256:a13914ed8b66b8e5956e96c63203c63d72b55280d348849ccc0eb314c73248cb", size = 419022, upload-time = "2025-09-05T14:50:01.049Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/95/12451ff8bc2c3e8a5755bc810a538de85444015d44353fc6f7ee8800c0bb/reuse-5.1.1-cp313-cp313-manylinux_2_41_x86_64.whl", hash = "sha256:15a68341949b7ddb3630d8d3a49d9537bbc143ee235dca77cc3f4047237c8299", size = 255386, upload-time = "2025-09-05T14:49:58.576Z" }, -] +sdist = { url = "https://files.pythonhosted.org/packages/05/35/298d9410b3635107ce586725cdfbca4c219c08d77a3511551f5e479a78db/reuse-6.2.0.tar.gz", hash = "sha256:4feae057a2334c9a513e6933cdb9be819d8b822f3b5b435a36138bd218897d23", size = 1615611, upload-time = "2025-10-27T15:25:46.336Z" } [[package]] name = "rfc3986" @@ -1925,208 +2623,204 @@ wheels = [ [[package]] name = "rich" -version = "14.1.0" +version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] [[package]] name = "rpds-py" -version = "0.27.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, - { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, - { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, - { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, - { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, - { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, - { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, - { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, - { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, - { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, - { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, - { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, - { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, - { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, - { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, - { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, - { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, - { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, - { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, - { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, - { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, - { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, - { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, - { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, - { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, - { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, - { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, - { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, - { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, - { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, - { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, - { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, - { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, - { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, - { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, - { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, - { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, - { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, - { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, - { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, - { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, + { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, ] [[package]] name = "ruamel-yaml" -version = "0.18.15" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload-time = "2025-08-19T11:15:10.694Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload-time = "2025-08-19T11:15:07.696Z" }, -] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.12" +version = "0.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709, upload-time = "2026-01-02T16:50:31.84Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z" }, ] [[package]] name = "savepagenow" -version = "1.3.0" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a4/b61c6e7a13b848fd985c9ed9acd525ccb1c2675e6cfa0d62292ae8015792/savepagenow-1.3.0.tar.gz", hash = "sha256:d0bc6bbe4606c700315015c3defcfab3c329208002b2b8cdc59f9b52996c6d3f", size = 42927, upload-time = "2023-07-01T13:31:49.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/c8/3b8a398b6c05dd97ab4b83e2df01462b24a28e159d2ef799221c20386127/savepagenow-1.3.1.tar.gz", hash = "sha256:27a0f4957d6628f0b62ed5bedbc30397b6ecd931fcec8d0a19065272e60f3450", size = 48931, upload-time = "2026-01-19T11:56:48.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/8f/aea39979f8a7091ad2242a038a0e4c2b463593923ce598a914255dfba9ef/savepagenow-1.3.0-py2.py3-none-any.whl", hash = "sha256:4b0a4fff47254c160a37a20868ab53bb90da3d3f9f96086a9255b2375e39fcbf", size = 5649, upload-time = "2023-07-01T13:31:48.005Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bc/6ef82cb932613aa36011d9698a08e9386cf77324fbc1d125f946fd7be8c6/savepagenow-1.3.1-py2.py3-none-any.whl", hash = "sha256:1343ec8f97c4ba77d6ea2075be985f25aa798c9a9daf239890a81aad078d00f7", size = 5876, upload-time = "2026-01-19T11:56:47.709Z" }, ] [[package]] name = "scipy" -version = "1.16.2" +version = "1.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599, upload-time = "2025-09-11T17:48:08.271Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259, upload-time = "2025-09-11T17:40:39.329Z" }, - { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976, upload-time = "2025-09-11T17:40:46.82Z" }, - { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905, upload-time = "2025-09-11T17:40:52.545Z" }, - { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066, upload-time = "2025-09-11T17:40:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407, upload-time = "2025-09-11T17:41:06.796Z" }, - { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281, upload-time = "2025-09-11T17:41:15.055Z" }, - { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222, upload-time = "2025-09-11T17:41:23.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586, upload-time = "2025-09-11T17:41:31.021Z" }, - { url = "https://files.pythonhosted.org/packages/34/95/20e02ca66fb495a95fba0642fd48e0c390d0ece9b9b14c6e931a60a12dea/scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e", size = 38550641, upload-time = "2025-09-11T17:41:36.61Z" }, - { url = "https://files.pythonhosted.org/packages/92/ad/13646b9beb0a95528ca46d52b7babafbe115017814a611f2065ee4e61d20/scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851", size = 25456070, upload-time = "2025-09-11T17:41:41.3Z" }, - { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856, upload-time = "2025-09-11T17:41:47.695Z" }, - { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626, upload-time = "2025-09-11T17:41:52.642Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689, upload-time = "2025-09-11T17:41:57.886Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151, upload-time = "2025-09-11T17:42:02.303Z" }, - { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824, upload-time = "2025-09-11T17:42:07.549Z" }, - { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881, upload-time = "2025-09-11T17:42:13.255Z" }, - { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219, upload-time = "2025-09-11T17:42:18.765Z" }, - { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147, upload-time = "2025-09-11T17:42:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766, upload-time = "2025-09-11T17:43:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169, upload-time = "2025-09-11T17:43:30.198Z" }, - { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682, upload-time = "2025-09-11T17:42:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926, upload-time = "2025-09-11T17:42:35.845Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152, upload-time = "2025-09-11T17:42:40.07Z" }, - { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410, upload-time = "2025-09-11T17:42:44.313Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880, upload-time = "2025-09-11T17:42:49.325Z" }, - { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425, upload-time = "2025-09-11T17:42:54.711Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622, upload-time = "2025-09-11T17:43:00.375Z" }, - { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985, upload-time = "2025-09-11T17:43:06.661Z" }, - { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367, upload-time = "2025-09-11T17:43:14.44Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992, upload-time = "2025-09-11T17:43:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109, upload-time = "2025-09-11T17:43:35.713Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110, upload-time = "2025-09-11T17:43:40.814Z" }, - { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110, upload-time = "2025-09-11T17:43:44.981Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014, upload-time = "2025-09-11T17:43:49.074Z" }, - { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155, upload-time = "2025-09-11T17:43:54.661Z" }, - { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174, upload-time = "2025-09-11T17:44:00.101Z" }, - { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752, upload-time = "2025-09-11T17:44:05.619Z" }, - { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010, upload-time = "2025-09-11T17:44:11.322Z" }, - { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061, upload-time = "2025-09-11T17:45:09.814Z" }, - { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914, upload-time = "2025-09-11T17:45:14.73Z" }, - { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193, upload-time = "2025-09-11T17:44:16.757Z" }, - { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172, upload-time = "2025-09-11T17:44:21.783Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326, upload-time = "2025-09-11T17:44:25.982Z" }, - { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036, upload-time = "2025-09-11T17:44:30.527Z" }, - { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341, upload-time = "2025-09-11T17:44:35.981Z" }, - { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840, upload-time = "2025-09-11T17:44:41.76Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716, upload-time = "2025-09-11T17:44:47.316Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088, upload-time = "2025-09-11T17:44:53.011Z" }, - { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455, upload-time = "2025-09-11T17:44:58.899Z" }, - { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374, upload-time = "2025-09-11T17:45:03.45Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/7e/74/66de6258867beb2ef08f35f9f2ac017a52cacd5081714d239ff1a442d458/scipy-1.18.1.tar.gz", hash = "sha256:52c4b7422442aba924d03ad4019852b08a92e64ea187b933135687bfe2747307", size = 30781235, upload-time = "2026-08-21T23:28:50.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/f7/240c110c08693826b4513a52f5717d62ec7c7af72f2920821247c03b17b3/scipy-1.18.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:457fd7a2a8edeb044ab6ffbc0aa03ff6cd18491356e5e0c834d76ce621b916d1", size = 31111061, upload-time = "2026-08-21T23:23:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/05/4a/78c6285577c375e7cf27277ea8ee6961224327f1e1a0c44af5f17f23635c/scipy-1.18.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:e708533e8b2ae2497d65346538a7dcc92814410b25b81432eac66de0f2af8265", size = 28733332, upload-time = "2026-08-21T23:23:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f6/a5b82f8abbe14d134691b8b903696f701d25a081353a29dc655c364d9e62/scipy-1.18.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7bbf207c4453ce1ad2e00b17313852b33310b83090c2311bdaf97f93c0380d12", size = 20475078, upload-time = "2026-08-21T23:23:54.138Z" }, + { url = "https://files.pythonhosted.org/packages/23/22/0858a0bbd6b3e825ceb8cd9baf9eaf3b2f2b1d77727eb6be40500bcdc92f/scipy-1.18.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:78c0665edead396b1abb4897c41a5c1d9bf090c8a637a4c20a61678e0a264e66", size = 23108904, upload-time = "2026-08-21T23:23:57.824Z" }, + { url = "https://files.pythonhosted.org/packages/75/9a/2e71719f31eaefe0e3a1706c4a1ded94e664bfd95ffca2b219a671faee01/scipy-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c085faa2cfa879c5141df483f836f4d691045a078224a670fa570fa01612d89", size = 34025113, upload-time = "2026-08-21T23:24:02.209Z" }, + { url = "https://files.pythonhosted.org/packages/df/64/ff35eb9e54894cf471ff4716abd3c81eb0a0626869217ce3e6ba4ccf17d7/scipy-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f55fa87b6c612ecd6b058f167c53231b1d14e412efe361d3d6e38b3631c73218", size = 35344199, upload-time = "2026-08-21T23:24:07.844Z" }, + { url = "https://files.pythonhosted.org/packages/d3/af/c5538be1792f7034c12c7db6ee67cace58253c7b87b122d68253eaf5de89/scipy-1.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c35d74ce0e193ff740c2f2be2ac913ddc232fe6c1ff40b26cfecb9c670c63314", size = 35639587, upload-time = "2026-08-21T23:24:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/91/4c/075e4f66471bac101141ac739e9e135549be1bae584571bd03a530c056e1/scipy-1.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2924a03db38dc2e848bca2fe9f077dafb891480b91a00a0963a8cf86dfc31c1", size = 37480330, upload-time = "2026-08-21T23:24:19.608Z" }, + { url = "https://files.pythonhosted.org/packages/39/e7/979fd14e75008623df31ba70d6bb144700f68feadcea042021c06a05bf82/scipy-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:5e4d44984abc0020154ea81b247adeddcc3ac5527b975ff798bd1ba0adc513c2", size = 36658278, upload-time = "2026-08-21T23:24:25.463Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/e1525354ff9d7d5feb6d1b31af6d14072e5c91e9607b421fa1ec889660b3/scipy-1.18.1-cp312-cp312-win_arm64.whl", hash = "sha256:d65d448389b8436493abcf629cc94ad0cf32aecaf06e1acca1de53cc795f2f12", size = 24400588, upload-time = "2026-08-21T23:24:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/4540ee0f9c42a9ad7109d0d1a8cc70de54c3572b01c6693a2b1c70e90ceb/scipy-1.18.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:3ab3523da44749156e1f68b464dc56af11ae4cbc5c739a49d05f32b982eca9f3", size = 31089958, upload-time = "2026-08-21T23:24:35.8Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f5/769f36d14922b8071a43e95d24d18b6bdafad10d7f5cf647867e1ac052bc/scipy-1.18.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6fb6a55cc0ba97b59a1f288fb86dc6fce8bdfc0fffcbfd015e3a954bf2a2d93", size = 28715106, upload-time = "2026-08-21T23:24:40.775Z" }, + { url = "https://files.pythonhosted.org/packages/9a/d7/21d890274f75ea37a8209d5519e72da3da90302e3b9fb8397a0918386a62/scipy-1.18.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ea324d9dd34c38bfb9bec8ca4d1b407db97dbb74029f566b8e322b1b6fe56fe6", size = 20456846, upload-time = "2026-08-21T23:24:45.066Z" }, + { url = "https://files.pythonhosted.org/packages/ec/01/798430ecea2e78ec7c02663d5f71c007bb6abeca931080debd40d7fa55ea/scipy-1.18.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:75b00eb8fb802090aa903f4ea1c7f5a584779f967361e68b7e98e531cc2d7174", size = 23087986, upload-time = "2026-08-21T23:24:49.539Z" }, + { url = "https://files.pythonhosted.org/packages/e6/5f/4634e9d35c68496e4e34cb6946eafab044458e6cedab42b40b6588e475b6/scipy-1.18.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d416b16cccfd70fbf62400e84d0bb2f4e6af519a45557f1692c749b37f14b315", size = 33998146, upload-time = "2026-08-21T23:24:54.714Z" }, + { url = "https://files.pythonhosted.org/packages/41/48/6450ed9243315322bbc19ac57b9b70d66a20bf1d38d124c96bc4bf6af9ea/scipy-1.18.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fdaf5ea890a6183d0565f51a61799d67081bd5b1cf03c5f4b3fd3732108625c9", size = 35312578, upload-time = "2026-08-21T23:25:00.44Z" }, + { url = "https://files.pythonhosted.org/packages/00/bd/bf5a4be6a3525676499f6dff307991739ff6fdcad1481b1aeb6745339f58/scipy-1.18.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c825cef2f49e46753726a7181a8e199804a912b29519ada542c6ebc654951899", size = 35612621, upload-time = "2026-08-21T23:25:06.144Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4e/3c45c33e00a77996c4b1cb707929f833ba7b1d522ee29f882512c330676d/scipy-1.18.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3b417bf8c2c7c16e8f58ad91db17783ec911ac16e7b50eb6eab6e809b4f5b07", size = 37457323, upload-time = "2026-08-21T23:25:12.483Z" }, + { url = "https://files.pythonhosted.org/packages/93/0e/e0348fbc0dbab65c114cf78957e7dfeb49f8e8b556b4d930cc12ff195e18/scipy-1.18.1-cp313-cp313-win_amd64.whl", hash = "sha256:559ed65f60c1af5a03f3912605a1b5114f522c7c32fb23c3376ae8f03219fe28", size = 36622841, upload-time = "2026-08-21T23:25:18.722Z" }, + { url = "https://files.pythonhosted.org/packages/50/a8/6a77f5f267c555108f0a864b6db714363dab567a8266422a79a385f9232b/scipy-1.18.1-cp313-cp313-win_arm64.whl", hash = "sha256:cd479fc04dd9401e3b4f49e76518768ef99c4f517a98c284eb091fd725719adf", size = 24399315, upload-time = "2026-08-21T23:25:23.458Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/d8eb4e280ddb56a4ab2c6f02ee49b56b23f6e977cf0802fd6d68dbef14f5/scipy-1.18.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:83de5453a7799afc9048b4616bd085cef126e36412f0ea2f6370c36a2a3a51e7", size = 31090936, upload-time = "2026-08-21T23:25:28.686Z" }, + { url = "https://files.pythonhosted.org/packages/2a/49/59ea385dc3a62ff498ddf3cfff7c2b41b0f9f9d3c4122b3f1dcb6d6327fe/scipy-1.18.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9554bcc6d715ee87a633a3cc8e7703c6628b100dd29cb8a2efc4c0533c7ff729", size = 28725221, upload-time = "2026-08-21T23:25:33.244Z" }, + { url = "https://files.pythonhosted.org/packages/70/e8/6b0c288c50942d78193696c9f15f9a0874f5178aa0ddf40f83d9924b3e8d/scipy-1.18.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:011413b7426b75012840e35649e00fe0a2c3bae89fed433876e3a99251572efc", size = 20466839, upload-time = "2026-08-21T23:25:37.516Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/54fd3793c729e3b936782f181b59cbb1205bf250ab605a16cb1ba61cdd5e/scipy-1.18.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:88f0e784020649f88ea48c9f5ddfa403bf9205820667c0914740b392035afb82", size = 23089121, upload-time = "2026-08-21T23:25:42.019Z" }, + { url = "https://files.pythonhosted.org/packages/0b/56/030af62bea3cf878e0028515dff78c123b01633606a879b63f42d2db99cc/scipy-1.18.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d3ab0e8c69a17dd3559eab8cbb88f258e285c94d572c2719033f90f83290c89", size = 34053851, upload-time = "2026-08-21T23:25:47.998Z" }, + { url = "https://files.pythonhosted.org/packages/6b/89/2a844506d49651e9aa1af6ef95b6bd8031cb1d5a4375edec6155037e04cf/scipy-1.18.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac0333bdf38309aa3dcbe7e3fa7ea29e7a2c37c6ea306a757b700ded8e4596ad", size = 35329183, upload-time = "2026-08-21T23:25:53.522Z" }, + { url = "https://files.pythonhosted.org/packages/eb/56/c7370c3640e92ac9613cbf26cb3f729f9b12ddf1727b55b94b53b24d6f48/scipy-1.18.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:911de823097db8b63f034299d12662db93344e6ffa0b881cbb57748974b70168", size = 35672551, upload-time = "2026-08-21T23:25:59.387Z" }, + { url = "https://files.pythonhosted.org/packages/24/16/ec8536f351421f8bf60a1120930638f83790f4710b8230446aca3d6159d4/scipy-1.18.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:95298364e251be3e60249facbeeca03631d3bb7584f85879516ec55ac717b81f", size = 37469416, upload-time = "2026-08-21T23:26:05.432Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/d73da0d28f16c45bb9b0a5691b91610b0275c5ef0eb5e43c87cf2dc1bf31/scipy-1.18.1-cp314-cp314-win_amd64.whl", hash = "sha256:78a0d7c918e74a232394117160e7e3db503377572a45bcef8826e4ab8a35feba", size = 37362755, upload-time = "2026-08-21T23:26:11.366Z" }, + { url = "https://files.pythonhosted.org/packages/89/25/e996e4dc74e10e227b1e14db5eaf6608bb6dd33884a64851c38f18dd4249/scipy-1.18.1-cp314-cp314-win_arm64.whl", hash = "sha256:cbf38d043c1aa4ab306e1ada6ab6eddacc3322a20b7af1b30bc93254b366fe09", size = 25036090, upload-time = "2026-08-21T23:26:15.887Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/c00213f92309d753b48903e6a451b87eb52ff5b7a16e789d1568bbf221c4/scipy-1.18.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0fcb3c93519f27bb4f0c4b0f7802cdcaca7fcf93267b75edda2e9f4e8a55cbd7", size = 31485550, upload-time = "2026-08-21T23:26:20.776Z" }, + { url = "https://files.pythonhosted.org/packages/74/b2/e3067c487982d4eeab2938928529410370c06fea84a4d3f4925e7d96647d/scipy-1.18.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ddef79fb382df40104a19bb7151b3b23e57c1778fcf857c71ceecd9bd264513f", size = 29174642, upload-time = "2026-08-21T23:26:25.395Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ab/374c9fe2d1ec014e576c781a4b5d8e1ba340e8f6b4638c16f711d2b194f0/scipy-1.18.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0e82073ecc7acc6436fac4b31674109c7e1d3e596789767eda01258a8c9e8123", size = 20916357, upload-time = "2026-08-21T23:26:30.112Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/223915c88a17317cafbf8ca2a42b11c265a9fb1e804aa665544132b5fe8a/scipy-1.18.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8bcf3c1ba5d6456e2effd30fcbd3459b044d683fcdac79a2e6830f0bdf7de487", size = 23482611, upload-time = "2026-08-21T23:26:34.846Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d1/db0948da8ca57a80b36520ef0a768b967d99f3af65f4b6f1bf6362ad4dd4/scipy-1.18.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cfbf154f2ba187f2ed6cce2639efff7d105f1140573642c0161615b6d91d6a87", size = 34143202, upload-time = "2026-08-21T23:26:40.4Z" }, + { url = "https://files.pythonhosted.org/packages/87/53/39d046cc7574ed6acacb6bd5723e220107ece80bff12faaf3efc4ddeede4/scipy-1.18.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1d33a7836f7ddc1993427966a0823468ec41bcbdb1a9f9942d1d7e57f803ba3", size = 35380876, upload-time = "2026-08-21T23:26:46.1Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/32e0e799d875a85ca57d9bde6c78148afcc0e38276df683d95854eadc8c3/scipy-1.18.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4b8bc363b6d65ee2152bec57568e3c52639bb34c46057b09857a307ed5e21d", size = 35770885, upload-time = "2026-08-21T23:26:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/88/2e/f97a666d362fee68b18f41c9c30ed502ca5c98b549749bfcb52a8b74d1eb/scipy-1.18.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:11c423f1049c5755ad4409af52a9ada1cff96fe9b50795d4af3619f292901239", size = 37525424, upload-time = "2026-08-21T23:26:56.751Z" }, + { url = "https://files.pythonhosted.org/packages/ca/d5/a9e765a84654ebba8479a1fd1b059ced1af72b168a3b2a3a46540ea38d20/scipy-1.18.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c24acac1e18912761c4700239bbc1fd32f615af690f1584d49b35859be51324d", size = 37416961, upload-time = "2026-08-21T23:27:01.546Z" }, + { url = "https://files.pythonhosted.org/packages/ee/16/e79e0d1c63ef698879d85439d37e9fb434e3b804e506a6991038d086ebd9/scipy-1.18.1-cp314-cp314t-win_arm64.whl", hash = "sha256:9f2897bf7737392ad0d5213ea7b6add72a4edf5679b3153106aeb88b6507b3b9", size = 25331848, upload-time = "2026-08-21T23:27:05.884Z" }, + { url = "https://files.pythonhosted.org/packages/be/4f/1bd37c883b67163e2ca1f60977a399500e6879c15defecac62831c8d078d/scipy-1.18.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:eb0dfcf4e28a99c12c999744a2ff67c9b06200e20401c7c88186e33552a46331", size = 31091484, upload-time = "2026-08-21T23:27:11.051Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c5/ba929d7feb9b2332f96827c12e0e924b61973b59b4dea383b603372c65ce/scipy-1.18.1-cp315-cp315-macosx_12_0_arm64.whl", hash = "sha256:30f464bee641fa8e282577c7dce027308403213c6ca8270bba73285c91024bc5", size = 28725057, upload-time = "2026-08-21T23:27:15.9Z" }, + { url = "https://files.pythonhosted.org/packages/a4/19/68f1c50f609d955d230e66d25d02bd3e1e167ec540232135354fb9a4b9e3/scipy-1.18.1-cp315-cp315-macosx_14_0_arm64.whl", hash = "sha256:1bca3b943fc2567ea49cd02c99abde49da4d5178ec46f624bd8255cda8755beb", size = 20466734, upload-time = "2026-08-21T23:27:20.044Z" }, + { url = "https://files.pythonhosted.org/packages/ef/6d/319fa29b73d1802fa80b32a6eaf3f5be456ef81526da2716a9493bcb5501/scipy-1.18.1-cp315-cp315-macosx_14_0_x86_64.whl", hash = "sha256:c9d18a33309122074ea483dd92dd444189166b8b2ec429fe9ed5ac73c7a0aa23", size = 23089664, upload-time = "2026-08-21T23:27:24.345Z" }, + { url = "https://files.pythonhosted.org/packages/b7/db/30992f9b51a63de671daf3888ffd18378b6cb9ec9f2c972264238ffa7fd6/scipy-1.18.1-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82f201b4c878551d48558337aab270d3c6cca5507b8737c8d8a608d234cccde0", size = 34054035, upload-time = "2026-08-21T23:27:29.409Z" }, + { url = "https://files.pythonhosted.org/packages/91/d4/bf3e735dc0b9d5a8ff45079d2540e17d3aff7a2f0048dd8f552ffd031d2b/scipy-1.18.1-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ac49ea97594532dd44b7136094d35f5440fa06e6d9c6384a74c01764df388c5", size = 35333883, upload-time = "2026-08-21T23:27:34.293Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/12d78ce9f871fe945fca588d32644e6e63f553c2a35c564d73f3b22a3313/scipy-1.18.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:ceb30a00ce7c92d459819443d29ca486d882b83fb6738bdcbb2a1cce94ac5daa", size = 35673124, upload-time = "2026-08-21T23:27:39.059Z" }, + { url = "https://files.pythonhosted.org/packages/70/cd/886219313a1012a48e6ae0ec4f302c837151beb92e1ff0d709ef8fdfc488/scipy-1.18.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:f29633129f9fa7e88a3f0fca835de2d030bfc9643f7799e1a0c46cee24d38fc7", size = 37470753, upload-time = "2026-08-21T23:27:44.435Z" }, + { url = "https://files.pythonhosted.org/packages/17/6c/a776888ce618bee54fbde26172f0f46ac1da70d27b63861797fe78e1904b/scipy-1.18.1-cp315-cp315-win_amd64.whl", hash = "sha256:92c14f5bdbfb6216315ce33e78080474082de8b3830122ba97809bfbe65f75c0", size = 37361483, upload-time = "2026-08-21T23:27:49.334Z" }, + { url = "https://files.pythonhosted.org/packages/ab/09/97b651691322ebee97999b017ffc18a15a0b815103844c97e8da9d469731/scipy-1.18.1-cp315-cp315-win_arm64.whl", hash = "sha256:e402cf31eb68f453dbb2d36fc6d722b33f24a55d68b2ae1d92fa6305ca71c298", size = 25035883, upload-time = "2026-08-21T23:27:53.596Z" }, + { url = "https://files.pythonhosted.org/packages/ed/0f/9ec20467bbabd0d44e2a77d0fd3d124f884b4d67df92af82c91d2d6a486f/scipy-1.18.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:2a0b02f9fc46f8520330c23d45e6560db7e3a0d927232139427637f98943e11d", size = 31474926, upload-time = "2026-08-21T23:27:57.993Z" }, + { url = "https://files.pythonhosted.org/packages/8a/58/dcb79161e56efbedc50079fcd2f5fe427a0ebb53022eb476aa73c015ad8f/scipy-1.18.1-cp315-cp315t-macosx_12_0_arm64.whl", hash = "sha256:1d73131e358976663dd969e1fb4ed1404b815cd977eaaedc3b3a133ba2d81c35", size = 29164940, upload-time = "2026-08-21T23:28:03.062Z" }, + { url = "https://files.pythonhosted.org/packages/71/d3/1eeea80c817fcb8ef7bd4a05a58824977a0e57a375cfc3d7ea7c911c01ad/scipy-1.18.1-cp315-cp315t-macosx_14_0_arm64.whl", hash = "sha256:bff0b729edd992766136b34e39cc76bc2fad905aa58897ee72a9cd000a6d8443", size = 20906742, upload-time = "2026-08-21T23:28:07.642Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/e59350428b6099301a20128108c995e2eb175a43f383af9a346e38824f9b/scipy-1.18.1-cp315-cp315t-macosx_14_0_x86_64.whl", hash = "sha256:10ac20c69d880f77f375db44c22e3e6a644f9fefa291d4cd2fb9790a89fc99fd", size = 23472183, upload-time = "2026-08-21T23:28:12.109Z" }, + { url = "https://files.pythonhosted.org/packages/89/31/cc91623fa98f0621766a0f0aaaadb2c66de74a7ea7e3837164f6e4354260/scipy-1.18.1-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33a834464fdabc0f26a45508df31b3cc5d028e04dbf6c5ed398541418e0a12fe", size = 34130796, upload-time = "2026-08-21T23:28:17.906Z" }, + { url = "https://files.pythonhosted.org/packages/fc/3e/8572ef536957ddb8aa81bb4090d9e25f257e3b4e05d97deb54319deb8a3a/scipy-1.18.1-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49023963c193dacee096301452f223ee24d86ec5807f8df93c0f7221d119e305", size = 35374253, upload-time = "2026-08-21T23:28:23.732Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c6/59fdeffb4f1435299f93d9dc8140b43ad2916e6cfc944be6c3041fcec86d/scipy-1.18.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:d84a09d0dad90ba6525d8ac1c2334b33e64bf3ccfe9e841f02feb867a22681e4", size = 35758543, upload-time = "2026-08-21T23:28:29.431Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d9/135be205d9de8783193aff9cc3bf483a03a38e4b29432c954e8cb66ac14e/scipy-1.18.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:179ce34a8d0fe273d8883ba59e17e052247d08973dfcb743ca52bb1cce2d60b0", size = 37521946, upload-time = "2026-08-21T23:28:35.245Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a2/5b7d5270621ab7cfa3f7766067bf95dc360b5efb6394694e8143b4156e2b/scipy-1.18.1-cp315-cp315t-win_amd64.whl", hash = "sha256:5632e3ae3d09197c446310cd5187de63e28448ce22f0f67b2b93d97503c0c230", size = 37408295, upload-time = "2026-08-21T23:28:40.724Z" }, + { url = "https://files.pythonhosted.org/packages/63/ad/741c19fcb66755ff953daf9243af8480e4bf3d7fbe57583c178c7d2b6b51/scipy-1.18.1-cp315-cp315t-win_arm64.whl", hash = "sha256:eda632a7981f69730d6281f451db9c1c370993a2c0d7ddb43e2a809a2862b83a", size = 25319710, upload-time = "2026-08-21T23:28:45.713Z" }, ] [[package]] @@ -2140,11 +2834,11 @@ wheels = [ [[package]] name = "simpleeval" -version = "1.0.3" +version = "1.0.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload-time = "2024-11-02T10:29:46.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/9d/e7c9309940794dd3073cba2e5101df5874d84243595ce63b1e1c8f9b9c76/simpleeval-1.0.7.tar.gz", hash = "sha256:1e10e5f9fec597814444e20c0892ed15162fa214c8a88f434b5b077cf2fef85b", size = 30250, upload-time = "2026-03-16T10:53:03.464Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload-time = "2024-11-02T10:29:45.706Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2f/f32aa85591882378bb43caa09363f3ed97df399369a5144c7f19f2275bc0/simpleeval-1.0.7-py3-none-any.whl", hash = "sha256:97ac271bfd8f2af9e7b9a36ceea67617f26fa873f9d5ae1922f64d4c1442534b", size = 18792, upload-time = "2026-03-16T10:53:02.103Z" }, ] [[package]] @@ -2158,29 +2852,41 @@ wheels = [ [[package]] name = "smmap" -version = "5.0.2" +version = "5.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, ] [[package]] name = "soupsieve" -version = "2.8" +version = "2.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/99/a6ca3beb3ccacb41fb3321d8a60e5566f9e6467601ef8eba6a17e1b89778/soupsieve-2.9.2.tar.gz", hash = "sha256:4a55d8cf158a9c2e587fa4922f1bbb91d68ac829e2d6f25403a85747c71daf74", size = 122445, upload-time = "2026-08-07T00:57:24.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/dc/ad025c1ee131eba60c69f4dd5779b18fcf1e6b21a343e2162a84d5d133c7/soupsieve-2.9.2-py3-none-any.whl", hash = "sha256:8089a26fd974ca7a1f30276d3d8492ab266ab15af581642dfe8aa162e0c1c823", size = 37370, upload-time = "2026-08-07T00:57:23.524Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] [[package]] -name = "structlog" -version = "25.4.0" +name = "symspellpy" +version = "6.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b9/6e672db4fec07349e7a8a8172c1a6ae235c58679ca29c3f86a61b5e59ff3/structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4", size = 1369138, upload-time = "2025-06-02T08:21:12.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/99/f488bd2a64d4846dde560c6c1ad539aedba7fb95a21d21273b0c21a16762/symspellpy-6.10.0.tar.gz", hash = "sha256:7434e15c92b2af6ec0141df98f249b35a7ddc5496a410c2649c1ac74d84a3dfb", size = 2616545, upload-time = "2026-07-11T15:36:44.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4a/97ee6973e3a73c74c8120d59829c3861ea52210667ec3e7a16045c62b64d/structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c", size = 68720, upload-time = "2025-06-02T08:21:11.43Z" }, + { url = "https://files.pythonhosted.org/packages/c2/02/1124824a3e2842f42f45278f8eef94c5cb989055064e3473e8281f5deb0c/symspellpy-6.10.0-py3-none-any.whl", hash = "sha256:e31707f6d6e06b89973588c02c0c7941c9ca1e3144859a8e2e46d8b815dda75e", size = 2612381, upload-time = "2026-07-11T15:36:43.279Z" }, ] [[package]] @@ -2199,11 +2905,11 @@ wheels = [ [[package]] name = "tabulate" -version = "0.9.0" +version = "0.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, ] [[package]] @@ -2212,14 +2918,18 @@ source = { editable = "." } dependencies = [ { name = "frozendict" }, { name = "hdx-python-country" }, + { name = "overdue" }, { name = "pandas" }, { name = "pint" }, { name = "pydantic" }, { name = "pydeflate" }, { name = "python-calamine" }, + { name = "pyyaml" }, { name = "requests" }, { name = "savepagenow" }, { name = "scipy" }, + { name = "sympy" }, + { name = "types-pyyaml" }, ] [package.dev-dependencies] @@ -2249,14 +2959,18 @@ docs = [ requires-dist = [ { name = "frozendict", specifier = ">=2.4.6" }, { name = "hdx-python-country", specifier = ">=3.9.6" }, + { name = "overdue", specifier = ">=0.1.5" }, { name = "pandas", specifier = ">=2.2.3" }, { name = "pint", specifier = ">=0.24.4" }, { name = "pydantic", specifier = ">=2.11.7" }, { name = "pydeflate", specifier = ">=2.3.3" }, { name = "python-calamine", specifier = ">=0.4.0" }, + { name = "pyyaml", specifier = ">=6.0.2" }, { name = "requests", specifier = ">=2.32.3" }, { name = "savepagenow", specifier = ">=1.3.0" }, { name = "scipy", specifier = ">=1.16.1" }, + { name = "sympy", specifier = ">=1.13" }, + { name = "types-pyyaml", specifier = ">=6.0.12.20260815" }, ] [package.metadata.requires-dev] @@ -2284,11 +2998,11 @@ docs = [ [[package]] name = "tenacity" -version = "9.1.2" +version = "9.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, ] [[package]] @@ -2302,59 +3016,68 @@ wheels = [ [[package]] name = "tinycss2" -version = "1.4.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, + { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, ] [[package]] name = "tomlkit" -version = "0.13.3" +version = "0.15.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/96/e07752635b98536177fa1f37671c8f3cdde2e724c6bcf6034b2cfb571565/tomlkit-0.15.1.tar.gz", hash = "sha256:e25bbf38843005246210a12982776f27f99cb9be67160e14434d0c0d21ee1e97", size = 180129, upload-time = "2026-07-17T01:48:04.562Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/13/bc/8c13eb66537dce1d2bd3a57132902f38d0e7f5bb46fa9f4daed9fe9d76ee/tomlkit-0.15.1-py3-none-any.whl", hash = "sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304", size = 49449, upload-time = "2026-07-17T01:48:05.728Z" }, ] [[package]] name = "typeguard" -version = "4.4.4" +version = "4.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload-time = "2025-06-18T09:56:07.624Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/de/4420db493fa8fc0856d5e5c1b159c63a323d2de2317babe36b01568928e8/typeguard-4.6.0.tar.gz", hash = "sha256:e7414f09111317de3e335de92cd397c5c0ca00b1cc1676de12e1d444a79b3f21", size = 82330, upload-time = "2026-07-26T08:40:23.207Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload-time = "2025-06-18T09:56:05.999Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/461d5f167b6f5c7d97696f397c82f82e3480e003fce3f0a1cd1dd26e2eb2/typeguard-4.6.0-py3-none-any.whl", hash = "sha256:79878165bb86f2cf5d41d159a0ff1792a796cf496882d2fe1b1c6c7049b9cdd7", size = 36884, upload-time = "2026-07-26T08:40:21.868Z" }, ] [[package]] name = "typer" -version = "0.19.1" +version = "0.27.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "rich" }, { name = "shellingham" }, - { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/ea/9cc57c3c627fd7a6a0907ea371019fe74c3ec00e3cf209a6864140a602ad/typer-0.19.1.tar.gz", hash = "sha256:cb881433a4b15dacc875bb0583d1a61e78497806741f9aba792abcab390c03e6", size = 104802, upload-time = "2025-09-20T08:59:22.692Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/f7/57713ba479fd405eb76de31404b2c744c289e336b2d999511ebf51e496f7/typer-0.27.2.tar.gz", hash = "sha256:269b7eb9d3c202ca84b4bc9618cb04ebb43d3d4d1e567e4c768607232c05f945", size = 204045, upload-time = "2026-08-28T10:26:55.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/bf/205d0004930ede8f542fb58f601526fccf4ae7626075ca1e6c4de5d3d652/typer-0.27.2-py3-none-any.whl", hash = "sha256:b3a5fc4342d5fc8fda8fc3010b1cf117e9249aab7fae800c2eff62fd3842d97d", size = 123130, upload-time = "2026-08-28T10:26:53.752Z" }, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.20260815" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/72/b56089aeee6c496d969bac42376bedb6e3eeab4682e1018fa3137122f94b/types_pyyaml-6.0.12.20260815.tar.gz", hash = "sha256:28764110c9cf35846e733da32d8d734df7473c5dde9ef67c3b7332ec0e819858", size = 18545, upload-time = "2026-08-15T02:41:51.532Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/fa/6473c00b5eb26a2ba427813107699d3e6f4e1a4afad3f7494b17bdef3422/typer-0.19.1-py3-none-any.whl", hash = "sha256:914b2b39a1da4bafca5f30637ca26fa622a5bf9f515e5fdc772439f306d5682a", size = 46876, upload-time = "2025-09-20T08:59:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl", hash = "sha256:6f332212b7e191f3afd5016a713c510b6340593b7ebec573c7d5d20aa5386d3b", size = 21148, upload-time = "2026-08-15T02:41:50.555Z" }, ] [[package]] name = "typing-extensions" -version = "4.15.0" +version = "4.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, ] [[package]] @@ -2372,23 +3095,23 @@ wheels = [ [[package]] name = "typing-inspection" -version = "0.4.1" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, ] [[package]] name = "tzdata" -version = "2025.2" +version = "2026.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, ] [[package]] @@ -2402,23 +3125,23 @@ wheels = [ [[package]] name = "url-normalize" -version = "2.2.1" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/31/febb777441e5fcdaacb4522316bf2a527c44551430a4873b052d545e3279/url_normalize-2.2.1.tar.gz", hash = "sha256:74a540a3b6eba1d95bdc610c24f2c0141639f3ba903501e61a52a8730247ff37", size = 18846, upload-time = "2025-04-26T20:37:58.553Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/cd/846d87d6d49d963b04ef4429b73d71d3c17468059956bab360866a9b0aec/url_normalize-3.0.0.tar.gz", hash = "sha256:0552cbf2831a32a28994a13d29bca58a60e10ff6c0380e343ec6d1c2a0d232d8", size = 21777, upload-time = "2026-04-25T00:31:59.514Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/d9/5ec15501b675f7bc07c5d16aa70d8d778b12375686b6efd47656efdc67cd/url_normalize-2.2.1-py3-none-any.whl", hash = "sha256:3deb687587dc91f7b25c9ae5162ffc0f057ae85d22b1e15cf5698311247f567b", size = 14728, upload-time = "2025-04-26T20:37:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/13/8a/f72344eab18674fd7b174f35abbce41ed88fea72927f111726732d0ca779/url_normalize-3.0.0-py3-none-any.whl", hash = "sha256:95234bd359f86831c1fd87c248877f2a6887db2f3b5087120083f2fffcba4889", size = 16854, upload-time = "2026-04-25T00:31:58.271Z" }, ] [[package]] name = "urllib3" -version = "2.5.0" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] @@ -2432,16 +3155,17 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.34.0" +version = "21.7.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, + { name = "python-discovery" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/41/c3f34799487924f2a6f43b8a8b7acd345a6c61aac2211d4bced8621ca4f1/virtualenv-21.7.7.tar.gz", hash = "sha256:6874376f99ba6b8d4e3ee8bde67f9285412400c7d5b29ba41ee6daa5e0221bdc", size = 5347022, upload-time = "2026-08-28T18:59:50.093Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/95/f8/dcec8dc767b812193316c7debed1e2b53e586e59c267bfe517688ff90275/virtualenv-21.7.7-py3-none-any.whl", hash = "sha256:67a6a68fef3ad8ca16b8b89f33fd8f97996cc0bf0db31629d07ecf8dec539a2c", size = 5324620, upload-time = "2026-08-28T18:59:48.056Z" }, ] [[package]] @@ -2470,34 +3194,25 @@ wheels = [ [[package]] name = "wbgapi" -version = "1.0.12" +version = "1.0.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, { name = "requests" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4a/f55695bd1c9f1996b675b6e9e980eef40ebdb5e4bf8774c059c31af6ade1/wbgapi-1.0.12.tar.gz", hash = "sha256:338c3c768bd120b80596b48fa0449ecabc93513ac989c55671dce579dbb3a5be", size = 33590, upload-time = "2022-07-05T15:07:22.772Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/54/a8e8122a9268ce6ad1da9e857276259115aeee6c48acebe5df276ce3cb83/wbgapi-1.0.14.tar.gz", hash = "sha256:7bbf81cc58a2848f218e3d1cf54a3e0e1e9595aaeb5dfb3fe99a2dc0ab6ab03b", size = 33901, upload-time = "2026-02-27T18:27:56.442Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/12/224030af4886e119a3d03b709f7130e9601a4d15332e1d6a35671b25a4de/wbgapi-1.0.12-py3-none-any.whl", hash = "sha256:c5a1e1683b03d4264d287627c2562932f30e7f5c65509b812cb2e3de7d32633f", size = 36385, upload-time = "2022-07-05T15:07:20.606Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl", hash = "sha256:abf43fcbbdc85a84c0774755e725df76ad5ae076b3ecc38a940fa718e14c514b", size = 36544, upload-time = "2026-02-27T18:27:55.032Z" }, ] [[package]] name = "webencodings" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, -] - -[[package]] -name = "wheel" -version = "0.45.1" +version = "0.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/a0/8fd707bcb776a7be556bad06a2ea5fb9bd519df78ef8e26f70ccf0f38bff/webencodings-0.6.1.tar.gz", hash = "sha256:565f9ad031c702dae404e27a099e3e09186a3ab1b9520f06d215502b651fd910", size = 15001, upload-time = "2026-08-15T14:22:57.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/77/c6/040cbc72480d789a5f40d63fb484d3106554c4dfa2d2b70ad5022057750f/webencodings-0.6.1-py3-none-any.whl", hash = "sha256:7fab6269c8bf237c657876b52058ccb182e861518d1c695c1a9aaa8c1c105d5b", size = 8745, upload-time = "2026-08-15T14:22:56.31Z" }, ] [[package]] @@ -2518,15 +3233,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, ] -[[package]] -name = "xlrd3" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/db/88d8d49ddacc203956ecb98dc86c6ffeee6e933ef1f50da9b369de518f7f/xlrd3-1.1.0.tar.gz", hash = "sha256:20e6ed2e5f7f8b4ab61e30faffebceff6fab348332b4c915373f0a72742dc177", size = 58919847, upload-time = "2021-04-25T12:27:10.03Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/fce745025e58f160e7dcb5a45d4d43eb0bd44c0d8851425be87ef90271fa/xlrd3-1.1.0-py2.py3-none-any.whl", hash = "sha256:8e8e808f938144e7936a6e07c1d57be7a0f6c6f5b37c9c67974b43246d8aacb6", size = 105268, upload-time = "2021-04-25T12:26:55.264Z" }, -] - [[package]] name = "xlsx2csv" version = "0.8.4" From d26983466133c20130e69e97d2ee7c3b8741fd81 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:46:36 +0200 Subject: [PATCH 51/81] Issue 117 data accessor load (#118) * code: update dependencies * code: remove further unused dependencies * code: update DataAccessor load * code: update the laod and tests for the DataAccessor * Update docs/user_guide/data_accessor.md Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> * code: add ValueError * code: add ValueError --------- Co-authored-by: Johannes HAMPP <42553970+euronion@users.noreply.github.com> --- docs/user_guide/data_accessor.md | 8 ++------ src/technologydata/parsers/data_accessor.py | 18 ++++++++++++------ test/test_parser_data_accessor.py | 10 ++++++---- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 4b6d328d..f31e3a40 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -27,7 +27,8 @@ It is designed to work with a specific directory structure where datasets are or ### Creating a DataAccessor -To use `DataAccessor`, create an instance with `data_source`. You can also provide `version` and optionally override `data_path`. +To use `DataAccessor`, create an instance with `data_source`. If the `version` is not provided, the `DataAccessor` will automatically determine the latest available data version and use it. Best practice is to always specify the version to ensure reproducibility, otherwise package updates may change the data returned when newer versions for this package become available. +Finally, you can optionally override `data_path`. ```python from technologydata.parsers.data_accessor import DataAccessor @@ -37,11 +38,6 @@ accessor_v1 = DataAccessor( data_source="manual_input_usa", version="v1.0.0" ) - -# Create an accessor that will use the latest version -accessor_latest = DataAccessor( - data_source="dea_energy_storage" -) ``` ### Loading Data diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/parsers/data_accessor.py index fe71a5df..22407564 100644 --- a/src/technologydata/parsers/data_accessor.py +++ b/src/technologydata/parsers/data_accessor.py @@ -146,8 +146,8 @@ def load(self) -> DataPackage: ------ FileNotFoundError If the data source directory or the specified version directory is not found. - ValueError - If the specified version is not found. The user is notified of the latest available version. + ValueError: + If the specified version is not found in the data source directory. """ # Ensure the data path exists before attempting to load data @@ -164,12 +164,18 @@ def load(self) -> DataPackage: ) else: version = self.get_latest_version_string(list(source_path.iterdir())) - raise ValueError( - f"Data source version '{self.version}' not found. The latest available version is {version}." - ) + if self.version is None: + logger.warning( + "Data source version is None. Best practices recommend providing a valid data version." + ) + else: + raise ValueError( + f"Data source version {self.version} not found. " + f"The latest available version is: {version}." + ) data_path = pathlib.Path(source_path, version) - dp = DataPackage.from_json(self.data_source, self.version, data_path) + dp = DataPackage.from_json(self.data_source, version, data_path) return dp def parse( diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index fd6af51f..14d43ec6 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -98,13 +98,15 @@ def test_parse_and_access_data_manual_input_usa(self) -> None: assert data_package.version == "v0.13.4" assert len(data_package.technologies) == 85 - def test_load_raises_value_error_for_invalid_version(self) -> None: - """Test if load raises ValueError for an invalid version.""" + def test_load_falls_back_to_latest_for_invalid_version(self) -> None: + """Test if load raises ValueError when an invalid version is provided.""" + data_accessor = DataAccessor(data_source="dea_energy_storage", version="v11") + with pytest.raises( ValueError, - match="Data source version 'v11' not found. The latest available version is v10.", + match=r"Data source version v11 not found\. The latest available version is: v10\.", ): - DataAccessor(data_source="dea_energy_storage", version="v11").load() + data_accessor.load() def test_ensure_path_exists_is_idempotent(self, tmp_path: pathlib.Path) -> None: """Test ensure_path_exists is idempotent.""" From 012f4ae6aef4e910d5956bf6ba4d51a7e9a26cf9 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:58:54 +0200 Subject: [PATCH 52/81] Issue 99 from url (#101) * code: initial implementation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: update download method * code: new testr * code: new changes * doc: update doc * code: update data_accessory.py * code: fix unit test * code: download method. Raise ValueError if version is not provided * code: update docstring of def download * code: update unit test * doc: fix documentation * code: update urllib --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/home/faq.md | 47 +++++++- docs/user_guide/data_accessor.md | 82 ++++++++++++- src/technologydata/parsers/data_accessor.py | 124 +++++++++++++++++++- test/conftest.py | 15 +++ test/test_parser_data_accessor.py | 43 +++++++ 5 files changed, 306 insertions(+), 5 deletions(-) diff --git a/docs/home/faq.md b/docs/home/faq.md index f108a77b..050fe603 100644 --- a/docs/home/faq.md +++ b/docs/home/faq.md @@ -6,11 +6,54 @@ See the dedicated page on [Citing](citing.md). ## How do I add a new data source? -TODO +To add a new data source to the `technologydata` package: + +1. **Create a Parser Class**: Implement a parser class that inherits from `DataParserBase` in `src/technologydata/parsers/` +2. **Register the Data Source**: Add your data source to the `DataSourceName` enumeration in `src/technologydata/parsers/data_accessor.py` +3. **Implement Version Support**: Create version-specific subdirectories under your parser directory (e.g., `v1.0/`, `v2.0/`) +4. **Place Raw Data**: Store your raw data files in `src/technologydata/parsers/raw/` +5. **Update DataAccessor**: Add your parser to the `parse()` method logic in `DataAccessor` +6. **Document Your Parser**: Create documentation in `docs/examples/` following the pattern of existing parser documentation + +For detailed contribution guidelines, see the [contributing instructions](../contributing/instructions.md). + +## How can I access data from a remote source? + +You can use the `download()` method of the `DataAccessor` class to load technology data directly from remote URLs: + +```python +from technologydata.parsers.data_accessor import DataAccessor + +accessor = DataAccessor( + data_source="dea_energy_storage", + version="v10" +) + +# Download from a remote URL +base_url = "https://example.com/data/dea_energy_storage/v10/" +dp = accessor.download(base_url) +``` + +The method will download both `technologies.json` and `sources.json` (if available) from the specified URL. ## If I use the package today, will the data change when I update the package later? -TODO +The data versioning system ensures reproducibility: + +- Each data source has explicit version identifiers (e.g., `v10`, `v0.13.4`) +- When you specify a version in `DataAccessor`, you lock to that specific dataset +- Updating the package may add new versions but will not modify existing versioned data + +Example for reproducible usage: + +```python +# Pin specific versions +accessor = DataAccessor( + data_source="dea_energy_storage", + version="v10" # Explicitly specify version +) +dp = accessor.load() +``` ## How can I support your work? diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index f31e3a40..74e07b30 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -18,9 +18,10 @@ It is designed to work with a specific directory structure where datasets are or - **Data Source Selection**: Easily specify which dataset to load using the `DataSourceName` enumeration. - **Version Management**: Load a specific version of a dataset or automatically detect and use the latest available version. - **Standardized Loading**: Loads a `DataPackage` from a versioned folder, which is expected to contain `technologies.json` and optionally `sources.json`. +- **Remote Data Download**: Download and load technology data directly from remote URLs using the `download()` method. - **Parsing Interface**: Provides a `parse()` method to run the appropriate parser for a given data source and version to generate the data files. - **Error Handling**: Raises `FileNotFoundError` if the specified data source or version directories cannot be found, and `ValueError` for unsupported sources or versions. -- **Seamless Integration**: The `load()` method returns a `DataPackage` object, ready for use with other components of the `technologydata` library. +- **Seamless Integration**: The `load()` and `download()` methods return a `DataPackage` object, ready for use with other components of the `technologydata` library. - **Path Safety Helper**: Provides `ensure_path_exists()` to create missing directories (including parents) safely. ## Usage Examples @@ -57,6 +58,81 @@ print(type(dp_v1)) # ``` +### Downloading Data from Remote URLs + +The `download()` method enables you to download and load technology data directly from a remote URL. This is useful when you want to access datasets hosted on external servers without manually downloading files. + +```python +from technologydata.parsers.data_accessor import DataAccessor + +# Create an accessor for remote data +remote_accessor = DataAccessor( + data_source="dea_energy_storage", + version="v10" +) + +# Download and load data from a remote URL +base_url = "https://example.com/data/dea_energy_storage/v10/" +dp_remote = remote_accessor.download(base_url) + +# dp_remote is now a DataPackage object containing the downloaded data +print(type(dp_remote)) +# +``` + +The `download()` method will: + +1. Download `technologies.json` from the specified base URL +2. Attempt to download `sources.json` (optional - if not found, sources will be extracted from technologies) +3. Save the files to the configured data path +4. Load and return a `DataPackage` object + +**Note**: The base URL should point to the directory containing the JSON files. The method will automatically append the file names to construct the full URLs. + +#### Important: URL and Version Consistency + +!!! warning "Caller Responsibility" + The `data_source` and `version` attributes of the `DataAccessor` instance determine the **local storage location** for downloaded files. The `base_url` parameter determines **what data is actually downloaded**. + +```text +**The method does not validate that the URL content matches the specified version.** It is the caller's responsibility to ensure these are consistent. +``` + +**What this means in practice:** + +- The `data_source` and `version` attributes control where files are saved on disk +- The `base_url` controls which remote files are downloaded +- If these don't match, you'll download one version's data and label it as another version + +**Example of a problematic mismatch:** + +```python +# ⚠️ BAD: This will download v10 data but store it as v9! +accessor = DataAccessor(data_source="dea_energy_storage", version="v9") +base_url = "https://example.com/data/dea_energy_storage/v10/" # URL points to v10 +dp = accessor.download(base_url) # Downloads v10 data, stores at .../v9/ +``` + +**Correct usage:** + +```python +# βœ… GOOD: Version in accessor matches version in URL +accessor = DataAccessor(data_source="dea_energy_storage", version="v10") +base_url = "https://example.com/data/dea_energy_storage/v10/" +dp = accessor.download(base_url) # Downloads v10 data, stores at .../v10/ +``` + +**Storage location:** + +Downloaded files are saved to: + +```text +{data_path}/{data_source}/{version}/technologies.json +{data_path}/{data_source}/{version}/sources.json +``` + +Where `data_path` defaults to `src/technologydata/parsers/`. Once downloaded, the data can be accessed later using the `load()` method without re-downloading. + ### Parsing Raw Data The `parse()` method is used to execute the data processing pipeline for a specific data source and version. It takes the raw data file as input and generates the structured `technologies.json` and `sources.json` files. @@ -87,4 +163,6 @@ Please refer to the [API documentation](../api/data_accessor.md) for detailed in - **Directory Structure**: The `DataAccessor` expects a specific directory structure within the project: `src/technologydata/parsers/// unless `data_path` is overridden. - **Version Naming**: Version directories must be prefixed with a `v` and follow a pattern that can be parsed by `packaging.version` (e.g., `v1`, `v2.0`, `v1.0.1-alpha`). Directories that do not match this pattern will be ignored when searching for the latest version. - **Target Data**: The `load()` method is designed to load a `DataPackage` from a folder. See the [DataPackage](./datapackage.md) documentation for more details on the expected contents of that folder (i.e.,`technologies.json`). -- **Input Location for Parse**: `parse()` expects `input_file_name` under `data_path/raw/`. +- **Input Location for Parse**: `parse()` expects `input_file_name` under `data_path/raw/`. +- **Download Method Validation**: The `download()` method does **not** validate that the remote URL content matches the `data_source` and `version` attributes specified in the `DataAccessor` instance. Users must ensure consistency between these parameters to avoid downloading incorrect data or mislabeling versions. See the "Important: URL and Version Consistency" section above for details. +- **Version Required for Download**: The `version` attribute must be set when using the `download()` method. A `ValueError` will be raised if the version is `None`. diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/parsers/data_accessor.py index 22407564..62e6797e 100644 --- a/src/technologydata/parsers/data_accessor.py +++ b/src/technologydata/parsers/data_accessor.py @@ -10,8 +10,10 @@ import re import sys from typing import Annotated +from urllib.parse import urljoin import pydantic +import requests from packaging.version import parse from pydantic import Field, field_validator @@ -37,7 +39,8 @@ class DataAccessor(pydantic.BaseModel): This class provides a standardized interface to locate and load technology datasets from predefined data sources. It can either load a specific version - or automatically determine and load the latest available version. + from the local storage, automatically determining and loading the latest available + version, or download data from a remote URL. Attributes ---------- @@ -178,6 +181,125 @@ def load(self) -> DataPackage: dp = DataPackage.from_json(self.data_source, version, data_path) return dp + def download(self, base_url: str) -> DataPackage: + """ + Download and load technology data from a remote URL. + + This method downloads technologies.json and sources.json files from the + specified base URL and loads them into a DataPackage instance. The sources.json + file is optional; if not found, sources will be extracted from technologies. + + **Important:** The ``data_source`` and ``version`` attributes of the + DataAccessor instance determine the **local storage location** for downloaded + files. The ``base_url`` parameter determines **what data is downloaded**. + It is the caller's responsibility to ensure these are consistent - the method + does not validate that the URL content matches the specified version. + + The downloaded files are stored locally in the directory structure: + ``{data_path}/{data_source}/{version}/technologies.json`` and + ``{data_path}/{data_source}/{version}/sources.json``, where ``data_path`` + defaults to ``src/technologydata/parsers/``. This allows the data to be + accessed later via the ``load()`` method without re-downloading. + + Parameters + ---------- + base_url : str + Base URL where the JSON files are hosted. The method will attempt to download + technologies.json and sources.json from this location. The URL should point + to the directory containing these files (without the filename itself). + **The caller must ensure this URL corresponds to the data_source and version + specified in the DataAccessor instance.** + + Returns + ------- + DataPackage + An instance of DataPackage initialized with the downloaded data. + + Raises + ------ + requests.HTTPError + If the HTTP request to download technologies.json or sources.json fails. + requests.ConnectionError + If there is a network connectivity issue. + ValueError + If the version attribute is not set (required for determining storage location). + + Notes + ----- + - The ``data_source`` and ``version`` attributes must be set before calling this method. + - The method does **not** validate that the downloaded data matches the specified + version - this is the caller's responsibility. + - The downloaded files persist on disk and can be reused in subsequent sessions + by calling ``load()`` with the same data source and version. + + Examples + -------- + Download v10 data and store it as v10: + + >>> accessor = DataAccessor(data_source="dea_energy_storage", version="v10") + >>> base_url = "https://example.com/data/dea_energy_storage/v10/" + >>> dp = accessor.download(base_url) + >>> # Files are downloaded from the URL and stored at: + >>> # src/technologydata/parsers/dea_energy_storage/v10/ + + """ + # Ensure base_url ends with / using urljoin for proper URL normalization + base_url = urljoin(base_url, "./") + + # Download technologies.json + technologies_url = f"{base_url}technologies.json" + sources_url = f"{base_url}sources.json" + if self.version: + technologies_path = pathlib.Path( + self.data_path, self.data_source, self.version, "technologies.json" + ) + sources_path = pathlib.Path( + self.data_path, self.data_source, self.version, "sources.json" + ) + else: + raise ValueError("Version must be specified for downloading data.") + + # Ensure parent directories exist + self.ensure_path_exists(technologies_path.parent) + self.ensure_path_exists(sources_path.parent) + + try: + logger.info(f"Downloading technologies.json from {technologies_url}") + response = requests.get(technologies_url, timeout=30) + response.raise_for_status() + + with open(technologies_path, "w", encoding="utf-8") as f: + f.write(response.text) + except requests.HTTPError as e: + logger.error(f"Failed to download technologies.json: {e}") + raise + + try: + logger.info(f"Downloading sources.json from {sources_url}") + response = requests.get(sources_url, timeout=30) + response.raise_for_status() + + with open(sources_path, "w", encoding="utf-8") as f: + f.write(response.text) + except requests.HTTPError as e: + logger.error(f"Failed to download sources.json: {e}") + raise + + # Load using DataPackage.from_json + # Construct path to folder containing the downloaded files + if self.version: + path_to_folder = pathlib.Path( + self.data_path, self.data_source, self.version + ) + else: + path_to_folder = pathlib.Path(self.data_path, self.data_source) + + data_package = DataPackage.from_json( + name=self.data_source, version=self.version, path_to_folder=path_to_folder + ) + + return data_package + def parse( self, input_file_name: str, diff --git a/test/conftest.py b/test/conftest.py index bc9d943d..e79dda02 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -14,7 +14,11 @@ reusability and organization. """ +import json import pathlib +import sys +from collections.abc import Callable +from typing import Any import pytest @@ -159,3 +163,14 @@ def example_parameter(request: pytest.FixtureRequest) -> technologydata.Paramete note=request.param.get("parameter_note"), sources=technologydata.SourceCollection(sources=source_list), ) + + +@pytest.fixture(scope="function") # type: ignore +def load_json() -> Callable[[pathlib.Path], Any]: + """Fixture to load json files to unit tests.""" + + def _load(filepath: pathlib.Path) -> Any: + with open(filepath) as f: + return json.load(f) + + return _load diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index 14d43ec6..b3cb14e1 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -5,11 +5,15 @@ """Test the DataAccessor class.""" import pathlib +from collections.abc import Callable +from typing import Any import pytest from technologydata.parsers.data_accessor import DataAccessor, DataSourceName +path_cwd = pathlib.Path.cwd() + class TestDataAccessor: """Test suite for the DataAccessor class in the technologydata module.""" @@ -114,3 +118,42 @@ def test_ensure_path_exists_is_idempotent(self, tmp_path: pathlib.Path) -> None: DataAccessor.ensure_path_exists(target) assert target.exists() assert target.is_dir() + + def test_download( + self, load_json: Callable[[pathlib.Path], Any], tmp_path: pathlib.Path + ) -> None: + """Test downloading a DataPackage from URL by mocking HTTP requests.""" + base_url = ( + "https://raw.githubusercontent.com/open-energy-transition/technology-data/" + ) + # Use specific commit SHA instead of branch name for test stability + commit_sha = "65a6aa6454493dbb56f5d12d8efab2a3a40104d7/" + data_source = DataSourceName.MANUAL_INPUT_USA + version = "v0.13.4" + target_url = f"src/technologydata/parsers/{data_source}/{version}/" + url = base_url + commit_sha + target_url + data_accessor = DataAccessor( + data_source="manual_input_usa", version="v0.13.4", data_path=tmp_path + ) + dp = data_accessor.download(url) + assert dp is not None + assert dp.sources is not None + assert dp.technologies is not None + assert dp.name == "manual_input_usa" + assert dp.version == "v0.13.4" + assert len(dp.sources) == 1 + assert len(dp.technologies) == 85 + sources_reference_path = pathlib.Path(path_cwd, target_url, "sources.json") + technologies_reference_path = pathlib.Path( + path_cwd, target_url, "technologies.json" + ) + sources_reference = load_json(sources_reference_path) + technologies_reference = load_json(technologies_reference_path) + sources_download = load_json( + pathlib.Path(tmp_path, data_source, version, "sources.json") + ) + technologies_download = load_json( + pathlib.Path(tmp_path, data_source, version, "technologies.json") + ) + assert sources_reference == sources_download + assert technologies_reference == technologies_download From fb7a0a420b67045a379872977e569acf16122099 Mon Sep 17 00:00:00 2001 From: Carlos Gaete Date: Wed, 2 Sep 2026 03:28:53 -0400 Subject: [PATCH 53/81] Issue 106: enrich the landing page and merge the small Home pages (#111) * doc: merge the Home pages into the landing page Fold Installation, Citing, Contacts and the FAQ into docs/index.md, and expand it with a description of the problem the package addresses, a runnable example harmonising two catalogues, a list of what the package provides and a table of the bundled datasets. Keep Release Notes and License as separate pages. Drop the Users page, which was entirely placeholder, and the four unanswered FAQ entries; retain the three that can be answered from the code. Update the release notes to cover all four released versions, correct the licence badge, which pointed at the PyPSA repository, and remove the Discord links, whose invite is no longer valid. * docs: Revise index.md * docs: Restore FAQ subsite * docs: Add GH hook for autogenerated release notes * ci: Add PR-label categorization for auto-generated release notes Group release notes into Breaking Changes/Features/Bug Fixes/Data/ Documentation/Other Changes based on the labels now applied on the repo. Co-Authored-By: Claude Sonnet 5 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: cdgaete Co-authored-by: Johannes <42553970+euronion@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/release.yml | 20 +++ .github/workflows/release.yml | 3 - docs/assets/overrides/hooks/release_notes.py | 71 +++++++++ docs/contributing/instructions.md | 2 +- docs/home/citing.md | 11 -- docs/home/contacts.md | 7 - docs/home/faq.md | 75 ++-------- docs/home/installation.md | 15 -- docs/home/release-notes.md | 17 +-- docs/home/users.md | 25 ---- docs/index.md | 147 ++++++++++++++++++- mkdocs.yaml | 15 +- test/conftest.py | 1 - 13 files changed, 256 insertions(+), 153 deletions(-) create mode 100644 .github/release.yml create mode 100644 docs/assets/overrides/hooks/release_notes.py delete mode 100644 docs/home/citing.md delete mode 100644 docs/home/contacts.md delete mode 100644 docs/home/installation.md delete mode 100644 docs/home/users.md diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 00000000..573562b3 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,20 @@ +changelog: + categories: + - title: Breaking Changes + labels: + - breaking change + - title: Features + labels: + - feature + - title: Bug Fixes + labels: + - bug + - title: Data + labels: + - data + - title: Documentation + labels: + - documentation + - title: Other Changes + labels: + - "*" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 93d11255..d2c180c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -119,9 +119,6 @@ jobs: - uses: actions/checkout@v6 - uses: softprops/action-gh-release@v2 with: - body: | - Revised release notes are available in the documentation. - append_body: true generate_release_notes: true publish: diff --git a/docs/assets/overrides/hooks/release_notes.py b/docs/assets/overrides/hooks/release_notes.py new file mode 100644 index 00000000..3ef46015 --- /dev/null +++ b/docs/assets/overrides/hooks/release_notes.py @@ -0,0 +1,71 @@ +""" +Populate the Release Notes page from the GitHub Releases of this repository. + +The page content in docs/home/release-notes.md is only a fallback shown if the +GitHub API cannot be reached at build time (e.g. no network, rate limit). +""" + +from __future__ import annotations + +import logging +import os +import re +from datetime import datetime +from typing import TYPE_CHECKING + +import requests + +if TYPE_CHECKING: + from mkdocs.config.defaults import MkDocsConfig + from mkdocs.structure.files import Files + from mkdocs.structure.pages import Page + +log = logging.getLogger("mkdocs.hooks.release_notes") + +REPO = "open-energy-transition/technology-data" +RELEASE_NOTES_PAGE = "home/release-notes.md" + + +def on_page_markdown(markdown: str, *, page: Page, config: MkDocsConfig, files: Files) -> str: + if page.file.src_uri != RELEASE_NOTES_PAGE: + return markdown + + try: + releases = _fetch_releases() + except Exception as exc: + log.warning(f"Could not fetch GitHub releases for {RELEASE_NOTES_PAGE}: {exc}") + return markdown + + return "\n\n".join(["# Release Notes", *(_format_release(r) for r in releases)]) + + +def _fetch_releases() -> list[dict]: + headers = {"Accept": "application/vnd.github+json"} + token = os.environ.get("GITHUB_TOKEN") + if token: + headers["Authorization"] = f"Bearer {token}" + + response = requests.get( + f"https://api.github.com/repos/{REPO}/releases", + headers=headers, + params={"per_page": 100}, + timeout=10, + ) + response.raise_for_status() + return [release for release in response.json() if not release["draft"]] + + +def _format_release(release: dict) -> str: + title = release["name"] or release["tag_name"] + published = datetime.fromisoformat(release["published_at"].replace("Z", "+00:00")) + body = _demote_headings(release["body"] or "_No description provided._") + + lines = [f"## {title}", "", f"*Released {published:%Y-%m-%d}.*"] + if release.get("prerelease"): + lines += ["", '!!! warning "Pre-release"'] + lines += ["", body, "", f"[View on GitHub]({release['html_url']})"] + return "\n".join(lines) + + +def _demote_headings(body: str) -> str: + return re.sub(r"^#{1,5} ", lambda match: "#" + match.group(0), body, flags=re.M) diff --git a/docs/contributing/instructions.md b/docs/contributing/instructions.md index 918748ce..41fc243b 100644 --- a/docs/contributing/instructions.md +++ b/docs/contributing/instructions.md @@ -11,7 +11,7 @@ We enthusiastically invite anyone interested in `technologydata` to share new id ## Where to go for help -- To **discuss** with other `technologydata` users, organise projects, share news, and get in touch with the community, please refer to the [Contacts](../home/contacts.md) page. +- To **discuss** with other `technologydata` users, organise projects, share news, and get in touch with the community, please refer to the [Contacts](../index.md#contacts) page. - For **guidelines to contribute**, stay right here. ## Code contributions diff --git a/docs/home/citing.md b/docs/home/citing.md deleted file mode 100644 index 94157163..00000000 --- a/docs/home/citing.md +++ /dev/null @@ -1,11 +0,0 @@ -# Citing - -If you use `technologydata` for your research, we suggest the following way of citing it. - -```text -technologydata: Data for Energy Systems Models. - -The package is available at: https://github.com/open-energy-transition/technology-data/tree/prototype-2. - -Authors: Johannes Hampp, Fabrizio Finozzi -``` diff --git a/docs/home/contacts.md b/docs/home/contacts.md deleted file mode 100644 index a5ceb67f..00000000 --- a/docs/home/contacts.md +++ /dev/null @@ -1,7 +0,0 @@ -# Contacts - -Please consider the following ways to reach out to the community and the developers: - -* To **discuss** with other `technology-data` users, organise projects, share news, and get in touch with the community you can use the [Discord server](https://discord.gg/T7YZbnVU). -* For **bugs and feature requests**, please use the [issue tracker](https://github.com/open-energy-transition/technology-data/issues). -* We strongly welcome anyone interested in providing **contributions** to this project. If you have any ideas, suggestions or encounter problems, feel invited to file issues or make pull requests on [GitHub](https://github.com/open-energy-transition/technology-data). diff --git a/docs/home/faq.md b/docs/home/faq.md index 050fe603..a565c19d 100644 --- a/docs/home/faq.md +++ b/docs/home/faq.md @@ -1,69 +1,24 @@ -# Frequently Asked Questions (FAQ) +# Frequently asked questions -## How should I cite this package? +## How do I add a new data source to the package? -See the dedicated page on [Citing](citing.md). +A data source is a package of a name, one or more versioned parsers, and a dispatcher: -## How do I add a new data source? - -To add a new data source to the `technologydata` package: - -1. **Create a Parser Class**: Implement a parser class that inherits from `DataParserBase` in `src/technologydata/parsers/` -2. **Register the Data Source**: Add your data source to the `DataSourceName` enumeration in `src/technologydata/parsers/data_accessor.py` -3. **Implement Version Support**: Create version-specific subdirectories under your parser directory (e.g., `v1.0/`, `v2.0/`) -4. **Place Raw Data**: Store your raw data files in `src/technologydata/parsers/raw/` -5. **Update DataAccessor**: Add your parser to the `parse()` method logic in `DataAccessor` -6. **Document Your Parser**: Create documentation in `docs/examples/` following the pattern of existing parser documentation - -For detailed contribution guidelines, see the [contributing instructions](../contributing/instructions.md). - -## How can I access data from a remote source? - -You can use the `download()` method of the `DataAccessor` class to load technology data directly from remote URLs: - -```python -from technologydata.parsers.data_accessor import DataAccessor - -accessor = DataAccessor( - data_source="dea_energy_storage", - version="v10" -) - -# Download from a remote URL -base_url = "https://example.com/data/dea_energy_storage/v10/" -dp = accessor.download(base_url) -``` - -The method will download both `technologies.json` and `sources.json` (if available) from the specified URL. +1. Add a member to the `DataSourceName` enumeration in `parsers/data_accessor.py`. +2. Add `parsers//parser_v.py` containing a class that subclasses `ParserBase` and implements its abstract `parse()` method. +3. Add `parsers//__init__.py` containing a dispatcher class that maps version strings to parser classes and exposes `get_supported_versions()`. +4. Register the dispatcher in `DataAccessor.parse()`. +5. Place the raw input file in `parsers/raw/`. The parser writes the parsed catalogue to `parsers///technologies.json`. ## If I use the package today, will the data change when I update the package later? -The data versioning system ensures reproducibility: - -- Each data source has explicit version identifiers (e.g., `v10`, `v0.13.4`) -- When you specify a version in `DataAccessor`, you lock to that specific dataset -- Updating the package may add new versions but will not modify existing versioned data - -Example for reproducible usage: - -```python -# Pin specific versions -accessor = DataAccessor( - data_source="dea_energy_storage", - version="v10" # Explicitly specify version -) -dp = accessor.load() -``` - -## How can I support your work? - -TODO +Datasets are shipped in version-pinned directories β€” `dea_energy_storage/v10`, `manual_input_usa/v0.13.4` β€” and are selected with the `version` argument of `DataAccessor`. +A new version of the package will not change the data of existing versions unless for fixing incorrectly extracted values. +If newer editions of a catalogue become available, they will not replace an existing version, but be available under the new version name. +If you use the package in a production-ready application we recommend you pin the version of the data that you are using - by default the data accessors provide the `latest` version of the data available. ## I would like to get involved, what can I do? -TODO - -## How is this project different to GENESTE or other projects? - -TODO -and ref. to GENESTE: +Contributions are welcome! +The [Contributing](../contributing/instructions.md) section of this documentation describes the development setup and conventions, and `CONTRIBUTING.md` in the repository summarises them. +Bug reports and feature proposals are handled through the [issue tracker](https://github.com/open-energy-transition/technology-data/issues). diff --git a/docs/home/installation.md b/docs/home/installation.md deleted file mode 100644 index df05a97e..00000000 --- a/docs/home/installation.md +++ /dev/null @@ -1,15 +0,0 @@ -# Installation - -You can install `technologydata` using **PyPI**. - -## Using pip (from PyPI) - -```bash -pip install technologydata -``` - -## Using uv (from PyPI, faster alternative to pip) - -```bash -uv pip install technologydata -``` diff --git a/docs/home/release-notes.md b/docs/home/release-notes.md index 5c98578c..074b7544 100644 --- a/docs/home/release-notes.md +++ b/docs/home/release-notes.md @@ -1,16 +1,9 @@ # Release Notes - - -## Release v0.1.0 - -First version of the new `technologydata` prototype. + This text is shown only if the GitHub API could not be reached at build time. diff --git a/docs/home/users.md b/docs/home/users.md deleted file mode 100644 index c619137b..00000000 --- a/docs/home/users.md +++ /dev/null @@ -1,25 +0,0 @@ -# Users - -The following contains a list of users from academia, industry, institutions and organisations that are actively using `technologydata` or have used it in the past. -The list references to specific projects to showcase the different use cases of `technologydata`. - -If you are missing from this list and would like to be included, give us a shoutout on our [Discord server](https://discord.gg/T7YZbnVU), drop us a message elsewhere or open a pull request in the repository, as described . -We would love to hear about your use case and stay in touch, in order to develop and evolve this package further. - -## Academia and Research institutions - - - -For the moment, this is a prototype of the new version of `technologydata`. Users will be specified at a later stage. - -## Industry - - - -For the moment, this is a prototype of the new version of `technologydata`. Users will be specified at a later stage. - -## Institutions and Organisations - - - -For the moment, this is a prototype of the new version of `technologydata`. Users will be specified at a later stage. diff --git a/docs/index.md b/docs/index.md index 79c5e0da..d2801a97 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,14 +3,147 @@

[![PyPI version](https://img.shields.io/pypi/v/technologydata.svg)](https://pypi.python.org/pypi/technologydata) -[![License](https://img.shields.io/pypi/l/pypsa.svg)](https://github.com/PyPSA/pypsa?tab=MIT-1-ov-file) -[![Discord](https://img.shields.io/discord/911692131440148490?logo=discord)](https://discord.gg/T7YZbnVU) +[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/open-energy-transition/technology-data/blob/prototype-2/LICENSE) +[![Python](https://img.shields.io/pypi/pyversions/technologydata.svg)](https://pypi.python.org/pypi/technologydata) -# technologydata: Techno-economic assumptions for energy models +# technologydata: techno-economic assumptions for energy models `technologydata` is a Python package that supports the management of techno-economic assumptions for energy system models. -It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, -including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. +It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. -The goal of this package is to make energy system modelling easier and more efficient, -automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. +The goal of this package is to make energy system modelling easier and more efficient, automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. + +Techno-economic catalogues are published in different currencies, price years, physical units, heating-value conventions and parameter naming schemes. +Harmonising to combine multiple sources into one energy system model therefore requires a sequence of conversions that is easy to get wrong and rarely recorded. + +This package contains a data schema and represents the techno-economic assumpstions as Python objects. +The objects called `Parameter` carry not only values ("magnitude"), but also unit information, currency year, energy carrier, heating-value basis, provenance and bibliographic sources. +Commonly used conversions are available, parameters can be checked for consistency. +Provenance information for modifying parameters is automatically recorded, e.g. to keep track of currency conversion factors or formulas used for calculation. + +## Installation + +```bash +pip install technologydata +``` + +Or, using [uv](https://docs.astral.sh/uv/): + +```bash +# Standalone +uv pip install technologydata + +# As part of a project +uv add install technologydata +``` + +The package requires Python 3.12 or newer. +The bundled datasets are installed with it; no additional download step is needed. + +## Features of the package + +- **Unit-ful parameters.** + Parameters come with units, including currencies an currency years, heating values and support for (energy) carriers. + Unit conversion is handled automatically and unit-compatability is checked for all operations via [`pint`](https://pint.readthedocs.io/en/stable/). +- **Currency and inflation adjustment.** + `to_currency()` combines exchange-rate conversion and deflation between price years using official inflation exchange rate data from the World Bank or alternatively the International Monetary Fund via [`pydeflate`](https://jm-rivera.github.io/pydeflate/). +- **Heating-value handling.** + Parameters can record an `LHV` or `HHV` basis and be converted between them with `change_heating_value()`, using the speicifc energy content depending on the energy carrier. +- **Arithmetic with compatibility checks.** + Adding parameters with incompatible units, carriers or heating-value bases raises `ValueError` rather than returning a misleading value. +- **Provenance and source tracking.** + Every `Parameter` carries a provenance and source information. + Operations and modifications on `Parameter` objects automatically track provenance information for improved reproducibility and insights. +- **Filtering and export.** + `TechnologyCollection.get()` filters by case-insensitive regular expression on name, region, year, case and detailed technology; + collections export to `pandas.DataFrame`, CSV and JSON, and reload from JSON. +- **Interpolation and extrapolation.** + `GrowthModels` allow for easy gap filling when data is missing for particular years. + Use model fitting and projections with commonly used growth models, including linear, expontential and logistic growth. + +## Bundled datasets (Batteries included) + +The package already ships with some parsed data catalogues for immediate use. +Prominent examples are: + +- Energy Storage Catalogue from the Danish Energy Agency (automatically extracted) +- Annual Technology Baseline 2024 from NREL (manually collected in the old [`technologydata` repository](http://technologydata.readthedocs.io/)) + +The raw files and parsing logic is also shipped alongside to provide the opportunity for verification. + +!!! tip + More packaged data to come! + Your contributions are also very welcome! + +## Example + +The Danish Energy Agency storage catalogue provides investment cost of utility-scale lithium-ion battery storage. +NREL's ATB 2024 provides similar technology costs, but their currency units do not align. +The follow examples loads both datasets and harmonises them to the same units for comparison: + +```python +import technologydata + +# Load data provided by the DEA +dea = technologydata.DataAccessor(data_source="dea_energy_storage", version="v10").load() +# Load data from NREL's ATB2024 +atb = DataAccessor(data_source="manual_input_usa", version="v0.13.4", data_path=data).load() + +# We get the data specific to battery storage and adjust the currency year +# from 2022 to 2023. By default the inflation adjustment uses World Bank data +us = atb.technologies.get( + name="battery storage", case="Moderate - Market", + region=None, year=None, detailed_technology=None, +).to_currency("USD_2023") + +# The DEA data is usually valid for the "EU" and the entries carry the region "EU" +# For currency conversion, this is an valid ISO 3166 alpha-3 code that can be used +# for currency conversion and inflation adjustment, so we need to specify a reference country +# like Germany explicitly +eu = dea.technologies.get( + name="lithium ion battery", case="control", + region=None, year=None, detailed_technology=None, +).to_currency("USD_2023", overwrite_country="DEU") + +for t in eu.technologies: + if t.year == 2030: + p = t.parameters["specific investment"].to("USD_2023/kWh") + print(f"DEA v10 {t.year}: {p.magnitude:7.2f} {p.units}") + +for t in us.technologies: + if t.year == 2030: + p = t.parameters["investment"] + print(f"NREL ATB {t.year}: {p.magnitude:7.2f} {p.units}") +``` + +```text +DEA v10 2030: 351.74 USD_2023 / kilowatt_hour +NREL ATB 2030: 264.23 USD_2023 / kilowatt_hour +``` + +Each converted `Parameter` retains the sources of the value it came from, so the origin of a number remains traceable after conversion. +The currency conversion uses exchange-rate and deflator series retrieved through [pydeflate](https://github.com/jm-rivera/pydeflate). +Data from the World Bank is used in the example above and is downloaded on first use automatically; the data is cached locally and later calls are much faster. + +## Citing + +If you use `technologydata` in your research, please cite it as: + +```text +technologydata: Data for Energy Systems Models. + +The package is available at: https://github.com/open-energy-transition/technology-data/tree/prototype-2. + +Authors: Johannes Hampp, Fabrizio Finozzi +``` + +## License + +`technologydata` is released under the [MIT license](home/license.md). + +## Contacts + +- For **bugs and feature requests**, + use the [issue tracker](https://github.com/open-energy-transition/technology-data/issues). +- For **contributions**, + open a pull request on [GitHub](https://github.com/open-energy-transition/technology-data). Ideas, suggestions and problem reports are equally welcome as issues. diff --git a/mkdocs.yaml b/mkdocs.yaml index 54bc4ff9..22ec067d 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -8,17 +8,9 @@ edit_uri: edit/master/docs/ nav: - Home: - Home: index.md - - Overview: - - Release Notes: home/release-notes.md - - Getting Started: - - Installation: home/installation.md - - Reference: - - Users: home/users.md - - Citing: home/citing.md - - License: home/license.md - - Support: - - FAQ: home/faq.md - - Contacts: home/contacts.md + - Release Notes: home/release-notes.md + - FAQ: home/faq.md + - License: home/license.md - User Guide: - Data Package: user_guide/datapackage.md @@ -202,6 +194,7 @@ plugins: hooks: - docs/assets/overrides/hooks/shortcodes.py +- docs/assets/overrides/hooks/release_notes.py copyright: >- © technologydata contributors diff --git a/test/conftest.py b/test/conftest.py index e79dda02..fc88086b 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -16,7 +16,6 @@ import json import pathlib -import sys from collections.abc import Callable from typing import Any From d31890c358f0b6c7a47cc3a62fdf6a96849d37eb Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 4 Sep 2026 11:58:55 +0200 Subject: [PATCH 54/81] code: move data_accessor (#128) * code: move data_accessor * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * doc: license for .github/release.yml --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- AGENTS.md | 3 ++- REUSE.toml | 2 +- docs/api/data_accessor.md | 2 +- docs/examples/dea_storage_v10.md | 2 +- docs/examples/manual_input_usa_v0134.md | 2 +- docs/index.md | 2 +- docs/user_guide/data_accessor.md | 6 +++--- src/technologydata/__init__.py | 9 +++++---- src/technologydata/{parsers => }/data_accessor.py | 2 +- .../parsers/dea_energy_storage/parser_v10.py | 14 ++++++-------- .../parsers/manual_input_usa/parser_v0134.py | 14 ++++++-------- test/test_parser_data_accessor.py | 3 ++- 12 files changed, 30 insertions(+), 31 deletions(-) rename src/technologydata/{parsers => }/data_accessor.py (99%) diff --git a/AGENTS.md b/AGENTS.md index 9f71a28a..3930922a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,8 +16,9 @@ maintained by a community of maintainers, based on an initiative of Open Energy - `src/technologydata/parsers/` β€” parsers for external data sources (e.g. DEA energy storage). JSON files under `parsers/*/v*/` are parser output β€” regenerate them via the parser, do not hand-edit. -- `src/technologydata/parsers/data_accessor.py` a `DataAccessor` class for +- `src/technologydata/data_accessor.py` β€” `DataAccessor` class for accessing external data either from the package or from a remote source. + Import as `from technologydata import DataAccessor`. - `test/` β€” pytest suite; shared fixtures in `test/conftest.py`, example data in `test/test_data/`. - `docs/` β€” MkDocs documentation (Material theme, `mkdocs.yaml`). diff --git a/REUSE.toml b/REUSE.toml index f4f198a1..04653009 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -4,7 +4,7 @@ SPDX-PackageSupplier = "technologydata contributors" SPDX-PackageDownloadLocation = "https://github.com/open-energy-transition/technology-data" [[annotations]] -path = ["uv.lock", "*.yaml", "docs/**", "*.md", "*.in"] +path = ["uv.lock", "*.yaml", "docs/**", "*.md", "*.in",".github/**"] SPDX-FileCopyrightText = "technologydata contributors" SPDX-License-Identifier = "MIT" diff --git a/docs/api/data_accessor.md b/docs/api/data_accessor.md index dcd66bd3..2af3df29 100644 --- a/docs/api/data_accessor.md +++ b/docs/api/data_accessor.md @@ -1 +1 @@ -::: technologydata.parsers.data_accessor.DataAccessor +::: technologydata.data_accessor.DataAccessor diff --git a/docs/examples/dea_storage_v10.md b/docs/examples/dea_storage_v10.md index f9a00858..a63e237e 100644 --- a/docs/examples/dea_storage_v10.md +++ b/docs/examples/dea_storage_v10.md @@ -76,7 +76,7 @@ The parser is run using the `DataAccessor` class. You need to create an instance Here is an example of how to run the parser from a Python script: ```python -from technologydata.parsers.data_accessor import DataAccessor +from technologydata import DataAccessor # Create an accessor for the version to be parsed parser_accessor = DataAccessor( diff --git a/docs/examples/manual_input_usa_v0134.md b/docs/examples/manual_input_usa_v0134.md index bc938c5e..d1384c88 100644 --- a/docs/examples/manual_input_usa_v0134.md +++ b/docs/examples/manual_input_usa_v0134.md @@ -72,7 +72,7 @@ The parser is run using the `DataAccessor` class. You need to create an instance Here is an example of how to run the parser from a Python script: ```python -from technologydata.parsers.data_accessor import DataAccessor +from technologydata import DataAccessor # Create an accessor for the version to be parsed parser_accessor = DataAccessor( diff --git a/docs/index.md b/docs/index.md index d2801a97..c7553727 100644 --- a/docs/index.md +++ b/docs/index.md @@ -59,7 +59,7 @@ The bundled datasets are installed with it; no additional download step is neede collections export to `pandas.DataFrame`, CSV and JSON, and reload from JSON. - **Interpolation and extrapolation.** `GrowthModels` allow for easy gap filling when data is missing for particular years. - Use model fitting and projections with commonly used growth models, including linear, expontential and logistic growth. + Use model fitting and projections with commonly used growth models, including linear, exponential and logistic growth. ## Bundled datasets (Batteries included) diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 74e07b30..307b316e 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -32,7 +32,7 @@ To use `DataAccessor`, create an instance with `data_source`. If the `version` i Finally, you can optionally override `data_path`. ```python -from technologydata.parsers.data_accessor import DataAccessor +from technologydata import DataAccessor # Create an accessor for a specific version accessor_v1 = DataAccessor( @@ -63,7 +63,7 @@ print(type(dp_v1)) The `download()` method enables you to download and load technology data directly from a remote URL. This is useful when you want to access datasets hosted on external servers without manually downloading files. ```python -from technologydata.parsers.data_accessor import DataAccessor +from technologydata import DataAccessor # Create an accessor for remote data remote_accessor = DataAccessor( @@ -138,7 +138,7 @@ Where `data_path` defaults to `src/technologydata/parsers/`. Once downloaded, th The `parse()` method is used to execute the data processing pipeline for a specific data source and version. It takes the raw data file as input and generates the structured `technologies.json` and `sources.json` files. ```python -from technologydata.parsers.data_accessor import DataAccessor +from technologydata import DataAccessor # Create an accessor for the version to be parsed parser_accessor = DataAccessor( diff --git a/src/technologydata/__init__.py b/src/technologydata/__init__.py index 9d66eb62..65f68feb 100644 --- a/src/technologydata/__init__.py +++ b/src/technologydata/__init__.py @@ -4,7 +4,7 @@ """technologydata: A package for managing and analyzing technology data used for energy system models.""" -import technologydata.default_equations as _default_equations # noqa: F401 +from technologydata.data_accessor import DataAccessor from technologydata.datapackage import DataPackage from technologydata.default_equations import ( equation_registry, # also registers built-in equations @@ -28,17 +28,18 @@ __all__ = [ "Commons", - "DateFormatEnum", + "DataAccessor", "DataPackage", - "FileExtensionEnum", + "DateFormatEnum", "Equation", "EquationRegistry", - "equation_registry", + "FileExtensionEnum", "Parameter", "Source", "SourceCollection", "Technology", "TechnologyCollection", + "equation_registry", "CURRENCY_UNIT_PATTERN", "creg", "extract_currency_units", diff --git a/src/technologydata/parsers/data_accessor.py b/src/technologydata/data_accessor.py similarity index 99% rename from src/technologydata/parsers/data_accessor.py rename to src/technologydata/data_accessor.py index 62e6797e..ae61fd8b 100644 --- a/src/technologydata/parsers/data_accessor.py +++ b/src/technologydata/data_accessor.py @@ -17,7 +17,7 @@ from packaging.version import parse from pydantic import Field, field_validator -from technologydata import DataPackage +from technologydata.datapackage import DataPackage from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser from technologydata.parsers.manual_input_usa import ManualInputUsaParser diff --git a/src/technologydata/parsers/dea_energy_storage/parser_v10.py b/src/technologydata/parsers/dea_energy_storage/parser_v10.py index bbe24d92..b342bada 100644 --- a/src/technologydata/parsers/dea_energy_storage/parser_v10.py +++ b/src/technologydata/parsers/dea_energy_storage/parser_v10.py @@ -13,15 +13,13 @@ import pandas as pd import pydantic -from technologydata import ( - Commons, - Parameter, - Source, - SourceCollection, - Technology, - TechnologyCollection, -) +from technologydata.parameter import Parameter from technologydata.parsers.data_parser_base import ParserBase +from technologydata.source import Source +from technologydata.source_collection import SourceCollection +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection +from technologydata.utils.commons import Commons path_cwd = pathlib.Path.cwd() diff --git a/src/technologydata/parsers/manual_input_usa/parser_v0134.py b/src/technologydata/parsers/manual_input_usa/parser_v0134.py index fc88985d..674bcb4b 100644 --- a/src/technologydata/parsers/manual_input_usa/parser_v0134.py +++ b/src/technologydata/parsers/manual_input_usa/parser_v0134.py @@ -10,15 +10,13 @@ import pandas -from technologydata import ( - Commons, - Parameter, - Source, - SourceCollection, - Technology, - TechnologyCollection, -) +from technologydata.parameter import Parameter from technologydata.parsers.data_parser_base import ParserBase +from technologydata.source import Source +from technologydata.source_collection import SourceCollection +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection +from technologydata.utils.commons import Commons path_cwd = pathlib.Path.cwd() diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index b3cb14e1..2dc38837 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -10,7 +10,8 @@ import pytest -from technologydata.parsers.data_accessor import DataAccessor, DataSourceName +from technologydata import DataAccessor +from technologydata.data_accessor import DataSourceName path_cwd = pathlib.Path.cwd() From 6f0c0459d1b3174376cf92725c8aa6ae2531bcb4 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 4 Sep 2026 16:58:24 +0200 Subject: [PATCH 55/81] [Small] import issues in the docs (#129) * doc: update dependencies and import paths * doc: update other links * doc: update REUSE.toml and docs/index.md --- docs/api/equations.md | 4 +-- docs/user_guide/equations.md | 4 +-- docs/user_guide/technology.md | 2 +- docs/user_guide/technology_collection.md | 2 +- mkdocs.yaml | 5 ++-- pyproject.toml | 2 +- uv.lock | 36 ++++++++++++++++++++---- 7 files changed, 41 insertions(+), 14 deletions(-) diff --git a/docs/api/equations.md b/docs/api/equations.md index 1ed29d23..ddb8fb3b 100644 --- a/docs/api/equations.md +++ b/docs/api/equations.md @@ -1,3 +1,3 @@ -::: technologydata.formulas.Equation +::: technologydata.equations.Equation -::: technologydata.formulas.EquationRegistry +::: technologydata.equations.EquationRegistry diff --git a/docs/user_guide/equations.md b/docs/user_guide/equations.md index 26ab89c0..97cf6c20 100644 --- a/docs/user_guide/equations.md +++ b/docs/user_guide/equations.md @@ -348,14 +348,14 @@ print(result.magnitude) # 12.0 ### How it works -A [`Equation`][technologydata.formulas.Equation] stores a **SymPy expression string** set to zero (e.g. `"eac - sic*wacc/(1-(1+wacc)**(-lifetime))"`) along with the list of participant parameter names. +A [`Equation`][technologydata.equations.Equation] stores a **SymPy expression string** set to zero (e.g. `"eac - sic*wacc/(1-(1+wacc)**(-lifetime))"`) along with the list of participant parameter names. When asked to solve for a target, it: 1. Maps each parameter name to a positional SymPy symbol (`_p0`, `_p1`, ...) so that names with spaces or other non-identifier characters are supported. 2. Applies a **symbolic-first** strategy: solves the expression with abstract symbols and produces a callable via `sympy.lambdify`. The known parameters are then passed as `pint` Quantity objects, so units are propagated automatically through Python's arithmetic operators. 3. Falls back to **numeric substitution** if the symbolic step yields no result β€” substitutes the known values first, then calls the solver on the simplified expression. -The [`EquationRegistry`][technologydata.formulas.EquationRegistry] indexes each +The [`EquationRegistry`][technologydata.equations.EquationRegistry] indexes each `Equation` under every parameter it involves. ### Formula selection diff --git a/docs/user_guide/technology.md b/docs/user_guide/technology.md index aaf809aa..d56e7c5f 100644 --- a/docs/user_guide/technology.md +++ b/docs/user_guide/technology.md @@ -184,7 +184,7 @@ Please refer to the [API documentation](../api/technology.md) for detailed infor ### Calculating Derived Parameters Use the formula registry to automatically derive missing parameters. See -[Formula System](equations.md) for the full reference. +[Formula System](./equations.md) for the full reference. ```python from technologydata.technology import Technology diff --git a/docs/user_guide/technology_collection.md b/docs/user_guide/technology_collection.md index d8bc5d5d..d77702eb 100644 --- a/docs/user_guide/technology_collection.md +++ b/docs/user_guide/technology_collection.md @@ -79,7 +79,7 @@ converted = collection.to_currency("USD_2025", source="worldbank") ### Deriving Missing Parameters and Checking Consistency `calculate_parameters` and `check_consistency` apply the corresponding -[`Technology`](technology.md) method to every technology in the collection and +[`Technology`](./technology.md) method to every technology in the collection and return, respectively, a new `TechnologyCollection` and a list of per-equation status dicts (one per technology, in the same order as `collection.technologies`). diff --git a/mkdocs.yaml b/mkdocs.yaml index 22ec067d..1adb3e61 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -20,7 +20,7 @@ nav: - Source Collection: user_guide/source_collection.md - Technology: user_guide/technology.md - Technology Collection: user_guide/technology_collection.md - - Formula System: user_guide/formulas.md + - Equation System: user_guide/equations.md - DEA Energy Storage Parser: user_guide/dea_energy_storage_parser.md - Manual Input USA Parser: user_guide/manual_input_usa_parser.md - Data Accessor: user_guide/data_accessor.md @@ -32,7 +32,7 @@ nav: - API Reference: - Data Package: api/datapackage.md - - Formulas: api/formulas.md + - Equations: api/equations.md - Parameter: api/parameter.md - Source: api/source.md - Source Collection: api/source_collection.md @@ -55,6 +55,7 @@ nav: - Instructions: contributing/instructions.md - Code of Conduct: contributing/CODE_OF_CONDUCT.md - Contributors: contributing/contributors.md + - API Improvement Proposals: contributing/api_improvement_proposals.md # Theme settings theme: diff --git a/pyproject.toml b/pyproject.toml index 490c13c3..aa240280 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,7 @@ docs = [ "mkdocs-table-reader-plugin>=3.1.0", "mkdocs-video>=1.5.0", "mkdocstrings>=0.29.1", - "mkdocstrings-python>=1.16.11", + "mkdocstrings-python<2.0", "pillow>=11.3.0", ] diff --git a/uv.lock b/uv.lock index 74687877..6898fc1a 100644 --- a/uv.lock +++ b/uv.lock @@ -747,6 +747,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/5e/49cc172da4d0578644ba37cec5cb365b1fefc603b26edea9bcac1c7f830a/gitpython-3.1.61-py3-none-any.whl", hash = "sha256:8ab28c9da863cdd9e7d7694ec46cf3e6c9a12d8a30a1acd3447aec11975d530c", size = 222118, upload-time = "2026-08-28T11:01:12.262Z" }, ] +[[package]] +name = "griffe" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffecli" }, + { name = "griffelib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/a0/927cf9416f527f623f4ccd9220337fca0cd85303b7e82adeab1e53669cd3/griffe-2.2.0.tar.gz", hash = "sha256:9c0dd9a7feda9e169d783507d777c6fb2f2fc2919b139747a5b4f5357517a611", size = 246229, upload-time = "2026-08-16T14:04:57.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/51/c9f9cb144e2bd21cbcb6ebd7978ecb5b9f5a375e78313744158338c8039c/griffe-2.2.0-py3-none-any.whl", hash = "sha256:db20672b31c3de2a1af5a18a3b3d8c186ccc2425e10290486b4f0364d25929e9", size = 5070, upload-time = "2026-08-16T14:04:51.971Z" }, +] + +[[package]] +name = "griffecli" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, + { name = "griffelib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/75/3cf2fb1ae21fb55a3b917b45d24426a620ee916f4bdbd03f350c69d3d892/griffecli-2.2.0.tar.gz", hash = "sha256:b9e763131218eb19887ed52de20fe944252d811bfb4a3e339874908a588f0044", size = 58066, upload-time = "2026-08-16T14:04:55.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/83/04652213d82afeecc8e8a31231eeb87cc484dcc055fd96ecb0bfd9860405/griffecli-2.2.0-py3-none-any.whl", hash = "sha256:8ebb7ae1dcc2617f5d39f00e4c238dd6b5cd0b13157b0ce22c1ea4ca8b4c5d1d", size = 11480, upload-time = "2026-08-16T14:04:53.14Z" }, +] + [[package]] name = "griffelib" version = "2.2.0" @@ -1539,16 +1565,16 @@ wheels = [ [[package]] name = "mkdocstrings-python" -version = "2.0.8" +version = "1.19.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "griffelib" }, + { name = "griffe" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/65/0db919b7c91bf033b42d04f15ff16a56f4edd6afb26e84d448359660ece3/mkdocstrings_python-2.0.8.tar.gz", hash = "sha256:34545b54681cf0b212aab95394d37b0f5326a93b102f6ad1df3d965c79384c9d", size = 201771, upload-time = "2026-08-31T20:16:06.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/1c/3af8413919b0839b96a78f60e8bd0dfd26c844d3717eeb77f80b43f5be1c/mkdocstrings_python-1.19.0.tar.gz", hash = "sha256:917aac66cf121243c11db5b89f66b0ded6c53ec0de5318ff5e22424eb2f2e57c", size = 204010, upload-time = "2025-11-10T13:30:55.915Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/b7/a5a854d4e44853f26decc0c5e0d68df052399f3da344a313da4178f00816/mkdocstrings_python-2.0.8-py3-none-any.whl", hash = "sha256:e555d9ef53b0febdeae4dd603144d4f86ec90fef672276645ea3bb61232c3d24", size = 105443, upload-time = "2026-08-31T20:16:05.25Z" }, + { url = "https://files.pythonhosted.org/packages/98/5c/2597cef67b6947b15c47f8dba967a0baf19fbdfdc86f6e4a8ba7af8b581a/mkdocstrings_python-1.19.0-py3-none-any.whl", hash = "sha256:395c1032af8f005234170575cc0c5d4d20980846623b623b35594281be4a3059", size = 143417, upload-time = "2025-11-10T13:30:54.164Z" }, ] [[package]] @@ -2992,7 +3018,7 @@ docs = [ { name = "mkdocs-table-reader-plugin", specifier = ">=3.1.0" }, { name = "mkdocs-video", specifier = ">=1.5.0" }, { name = "mkdocstrings", specifier = ">=0.29.1" }, - { name = "mkdocstrings-python", specifier = ">=1.16.11" }, + { name = "mkdocstrings-python", specifier = "<2.0" }, { name = "pillow", specifier = ">=11.3.0" }, ] From e9dce501da7cd2397e0ec0f5e9ca5b27b264a2bc Mon Sep 17 00:00:00 2001 From: Carlos Gaete Date: Tue, 8 Sep 2026 12:30:44 -0300 Subject: [PATCH 56/81] Issue 108: add a step-by-step tutorial (#122) * doc: add a step-by-step tutorial The user guide is a reference for each class, not a learning path, so there was no end-to-end route from a single parameter to a finished data package. Add docs/tutorial/index.md, one page growing in complexity: a Parameter built by hand, wrapped into a Technology, collection and DataPackage, then the same shapes loaded from the bundled catalogues, compared across currencies and units, and saved and read back. Note three details the tutorial depends on: DataPackage takes name and version, get() matches its arguments as regular expressions, and to_currency() takes an ISO3 country code. * test: run the tutorial's code blocks as doctests in CI The tutorial's output blocks were hand-copied from a REPL, so they could drift from what the code actually produces without anyone noticing. Rewrite each code block into doctest syntax (>>>/... prompts, expected output inline) and add a dedicated, opt-in `pytest --test-docs` check that runs them, following the approach PyPSA uses for its own docs. A new "Docs" CI job runs it on every push/pull request to master. Co-Authored-By: Claude Sonnet 5 * doc: rewrite tutorial introduction Reframe the opening around who the package is for and what it helps with, and note upcoming derived-parameter/consistency-check and growth-model capabilities. * doc: extend tutorial with derived parameters and growth models The rewritten introduction now promises equation-derived parameters, consistency checks, and growth-model projection, so add two closing sections demonstrating them: calculate_parameters()/check_consistency() on a Technology, and a growth-model curve fit and projected forward. Also drops the tutorial's manual data_path plumbing for DataAccessor, which prototype-2's data_accessor move made unnecessary. Co-Authored-By: Claude Sonnet 5 * docs: Prevent multiprocessing warning in build * doc: separate Technology from DataPackage in the tutorial Section 2 built a Technology and immediately wrapped it in a DataPackage in the same block, so there was no point where a reader saw what a bare Technology looks like or how a TechnologyCollection holds more than one. Split it into three steps: build one Technology and print it, collect the same technology across three years into a TechnologyCollection, then bundle that alongside an unrelated technology into a DataPackage with its sources. Renumber the following sections accordingly and update the save/load roundtrip's expected technology count (1 -> 4). Also fixes two breaks left from in-progress edits: an invalid carrier/heating_value pair on the opening Parameter example, and a syntax error in the lifetime Parameter passed to the first Technology. Co-Authored-By: Claude Sonnet 5 * docs: Revise tutorial * docs: Update equation section * revert: split doctest CI and mkdocs multiprocessing fix into follow-up PRs Both were CI/tooling changes unrelated to the tutorial content itself. Moved to feat/doctest-ci-followup and fix/mkdocs-multiprocessing-followup, each based on this branch, to be opened as separate PRs once this one merges. Co-Authored-By: Claude Sonnet 5 --------- Co-authored-by: cdgaete Co-authored-by: Johannes <42553970+euronion@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 --- docs/tutorial/index.md | 340 +++++++++++++++++++++++++++++++++++++++++ mkdocs.yaml | 2 + 2 files changed, 342 insertions(+) create mode 100644 docs/tutorial/index.md diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md new file mode 100644 index 00000000..c1397b71 --- /dev/null +++ b/docs/tutorial/index.md @@ -0,0 +1,340 @@ +# Tutorial + + + +This tutorial walks through the features of `technologydata` and how to use them. +It shows how to use `Parameter` and `Technology` objects, use the functionalities of the package, and combine them into a packaged data follow our data schema (a `DataPackage`). +All manual steps are shown, as well as how to utilise some pre-parsed and packaged data from the Danish Energy Agency. + +## Who this package is for + +Techno-economic data is central to energy system models. +They usually utilise data catalogues that are published in different currencies, price years, units, heating-value conventions and naming schemes. +Comparing, combining and harmonising them means making these changes and tracking them all by hand - a highly repetitive and error-prone process. + +This is where `technologydata` is meant to support you. +It helps to: + +- combine assumptions from more than one source, or from a source and your own numbers; +- convert between currencies, price years and units without losing track of what was converted; +- keep a record of where each number came from and how it was calculated +- supports through an equation system derived parameters and consistency checks +- provides common models for scenario interpolation and projection + +## 1. A parameter that knows its units + +The smallest useful object is a `Parameter`: a magnitude, a unit, an (energy) carrier, a heating value and the source it came from. + +``` py +>>> from technologydata import Parameter, Source, SourceCollection +>>> investment = Parameter(magnitude=288000.0, units="EUR_2020/MWh", carrier="H2", heating_value="LHV") +>>> print(investment) +288000.0 EUR_2020 / megawatt_hour, carrier=hydrogen, heating_value=lower_heating_value +``` + +The unit string is parsed rather than stored verbatim, which is why `EUR_2020/MWh` comes back as `EUR_2020 / megawatt_hour`. +A currency is written as a three-letter code, an underscore and the price year - `EUR_2020`. +Generally SI-Prefixes such as `M` or `k` are supported, but not for currency units. +A value like `MEUR_2020` would therefore be manually converted to million `EUR_2020` by you. +The carrier and heating value information allows to distinguish between carriers and their carriers for unit parts. +E.g. `MWh` may reference to `MWh` of hydrogen at its lower heating value (LHV); +a unit like this is not directly compatible with different carriers and heating values. +The additional carrier and heating value information appears like the unit in the denominator. +`technologydata` does prevent operations on units where carrier and heating value information is incompatible. + +The unit can be converted to get e.g. the investments per `kWh`: + +``` py +>>> per_kwh = investment.to("EUR_2020/kWh") +>>> print(per_kwh.magnitude, per_kwh.units) +288.0 EUR_2020 / kilowatt_hour +``` + +## 2. A `Technology` bundles related parameters + +A `Technology` groups parameters that describe the same technology for a year and in a certain scenario, we call it a "case". + +``` py +>>> from technologydata import DataPackage, Technology, TechnologyCollection +>>> battery = Technology( +... name="lithium ion battery", +... detailed_technology="lithium-ion battery (utility-scale)", +... region="EU", +... year=2025, +... case="control", +... parameters={ +... "specific investment": investment, +... "lifetime": Parameter(magnitude=30, units="year"), +... }, +... ) +>>> print(battery) +name='lithium ion battery' detailed_technology='lithium-ion battery (utility-scale)' case='control' region='EU' year=2025 parameters={'specific investment': Parameter(magnitude=288000.0, units='EUR_2020 / megawatt_hour', carrier='hydrogen', heating_value='lower_heating_value', provenance=None, note=None, sources=SourceCollection(sources=[])), 'lifetime': Parameter(magnitude=30, units='year', carrier=None, heating_value=None, provenance=None, note=None, sources=SourceCollection(sources=[]))} +``` + +Printed in full, a `Technology` is just its identifying fields (`name`, `detailed_technology`, `case`, `region`, `year`) plus a `parameters` dictionary of named `Parameter` objects β€” nothing more is hidden inside it. + +## 3. Track a technology across years + +If we want to track technology parameters over multiple years, we use multiple `Technology` objects per year. +A `TechnologyCollection` holds several of them together: + +``` py +>>> battery_2030 = Technology( +... name="lithium ion battery", +... detailed_technology="lithium-ion battery (utility-scale)", +... region="EU", +... year=2030, +... case="control", +... parameters={ +... "specific investment": Parameter(magnitude=230000.0, units="EUR_2020/MWh"), +... "lifetime": Parameter(magnitude=30, units="year"), +... }, +... ) +>>> battery_2035 = Technology( +... name="lithium ion battery", +... detailed_technology="lithium-ion battery (utility-scale)", +... region="EU", +... year=2035, +... case="control", +... parameters={ +... "specific investment": Parameter(magnitude=190000.0, units="EUR_2020/MWh"), +... "lifetime": Parameter(magnitude=30, units="year"), +... }, +... ) +>>> battery_over_time = TechnologyCollection(technologies=[battery, battery_2030, battery_2035]) +>>> print(sorted(t.year for t in battery_over_time.technologies)) +[2025, 2030, 2035] +``` + +Nothing ties these three objects together except sharing a `name`, `detailed_technology`, `region` and `case` β€” the collection does not require or enforce a fixed set of years, so it can hold as many or as few as you have data for. + +## 4. Bundle many technologies into a `DataPackage` + +A `TechnologyCollection` is not limited to one technology's history. +It can hold entirely different technologies side by side. +When you want to share your collection with others or store them in a project, they are best stored as a `DataPackage`. +This is our data schema that allows for reliable writing to file / reading from file and smooth data exchange with others. +For now the `DataPackage` supports `json` and `csv` file formats. +These formats have the advantage of being human-readable, although the files they produce are a bit larger. +In the future we will make other file formats available. + +A `DataPackage` also includes information on all the sources used for the technologies and stores them as a combined `SourceCollection`. +This collection can be used for generating e.g. bibliographies or summarising all the sources used for a project. + +``` py +>>> wind = Technology( +... name="onshore wind", +... detailed_technology="onshore wind turbine", +... region="EU", +... year=2025, +... case="control", +... parameters={ +... "specific investment": Parameter(magnitude=1_200_000.0, units="EUR_2020/MW"), +... }, +... ) +>>> sources = SourceCollection(sources=[Source( +... title="Technology Data for Energy storage (May 2025)", +... authors="Danish Energy Agency", +... url="https://ens.dk/media/6589/download", +... )]) +>>> package = DataPackage( +... name="my-assumptions", +... version="v1", +... technologies=TechnologyCollection( +... technologies=battery_over_time.technologies + [wind] +... ), +... sources=sources, +... ) +>>> print(package.name, package.version, len(package.technologies.technologies)) +my-assumptions v1 4 +``` + +The package now bundles four technologies β€” three years of the battery plus the unrelated wind turbine β€” under one set of sources. `DataPackage` requires a `name` and a `version` as well as the data; they are what `from_json()` uses to identify the package later. + +## 5. Load a published catalogue + +Writing technologies by hand does not scale well. +The idea of `technologydata` is that many people contribute to larger databases that everyone can then use in their projects. +For now the package ships with some parsed catalogues which you can load and use right away. +Two of them are the Energy Storage Catalogue from the Danish Energy Agency, and the Annual Technology Baseline from NLR, formerly NREL. +To load them, use the `DataAccessor`: + +``` py +>>> from technologydata import DataAccessor +>>> dea = DataAccessor(data_source="dea_energy_storage", version="v10").load() +>>> usa = DataAccessor(data_source="manual_input_usa", version="v0.13.4").load() +>>> print(dea.name, dea.version, len(dea.technologies.technologies)) +dea_energy_storage v10 136 +>>> print(usa.name, usa.version, len(usa.technologies.technologies)) +manual_input_usa v0.13.4 85 +``` + +Both come back as `DataPackage` objects, the same shape as `package` from the previous section β€” just with a lot more technologies inside. + +## 6. Select one technology + +`TechnologyCollection.get()` filters on five attributes and returns a new collection. + +!!! warning "`get()` matches regular expressions, not literal text" + Every argument is compiled as a regex, so `(` and `)` are read as a group rather than as brackets. A name containing them silently matches nothing. Pass it through `re.escape()` or escape them using `\(` and `\)`. + +``` py +>>> import re +>>> selected = dea.technologies.get( +... name="lithium ion battery", +... region="EU", +... year=2030, +... case="control", +... detailed_technology=re.escape("lithium-ion battery (utility-scale)"), +... ) +>>> print(len(selected.technologies)) +1 +``` + +Without `re.escape()` the same call returns an empty collection rather than raising, so a silent zero is the symptom to watch for. + +## 7. Compare two catalogues + +This is what the bookkeeping was for. The Danish figure is in `EUR_2020` per MWh; the USA figure is in `USD_2022` per kWh. Converting both to `USD_2023` per kWh makes them comparable. + +``` py +>>> dea_investment = selected.technologies[0].parameters["specific investment"] +>>> dea_2023 = dea_investment.to_currency("USD_2023", country="DEU").to("USD_2023/kWh") +>>> usa_battery = next( +... t +... for t in usa.technologies.technologies +... if t.detailed_technology == "battery storage" +... and t.year == 2030 +... and t.case == "Moderate - Market" +... ) +>>> usa_2023 = usa_battery.parameters["investment"].to_currency("USD_2023", country="USA") +>>> print(round(dea_2023.magnitude, 1), dea_2023.units) +351.7 USD_2023 / kilowatt_hour +>>> print(round(usa_2023.magnitude, 1), usa_2023.units) +264.2 USD_2023 / kilowatt_hour +``` + +`to_currency()` takes the target currency and the **ISO3 country code** whose deflator to use β€” `DEU`, `USA` β€” not a currency code. Both numbers are now on the same basis, and the remaining difference is a difference in the sources rather than in their units. + +To work with both catalogues at once, concatenate them into one collection: + +``` py +>>> combined = TechnologyCollection( +... technologies=dea.technologies.technologies + usa.technologies.technologies +... ) +>>> print(len(combined.technologies)) +221 +``` + +## 8. Save it and load it back + +`to_json()` writes a package to a directory; `from_json()` reads it back given the same name and version. + +``` py +>>> import pathlib +>>> import tempfile +>>> folder = pathlib.Path(tempfile.mkdtemp()) +>>> package.to_json(folder) +>>> print(sorted(p.name for p in folder.iterdir())) +['sources.json', 'technologies.json'] +>>> reloaded = DataPackage.from_json("my-assumptions", "v1", folder) +>>> print(len(reloaded.technologies.technologies)) +4 +``` + +The two files are the same shape as the ones the bundled catalogues ship, so a package you assemble here can be loaded by anything that reads them. + +## 9. Derive parameters and check consistency + +Some parameters are related by known formulas rather than independent. +E.g. specific investment cost, total investment cost and capacity are one such triple: +specific investment is just total investment divided by capacity. +`calculate_parameters()` uses common equations to calculate missing parameters from known ones: + +``` py +>>> tech = Technology( +... name="Solar PV", +... detailed_technology="Crystalline Silicon", +... case="Base", +... region="DEU", +... year=2020, +... parameters={ +... "specific_investment": Parameter(magnitude=1.0, units="EUR_2020/kW"), +... "total_investment_cost": Parameter(magnitude=1_000.0, units="EUR_2020"), +... }, +... ) +>>> tech = tech.calculate_parameters("capacity") +>>> capacity = tech.parameters["capacity"] +>>> print(capacity.magnitude, capacity.units) +1000.0 kilowatt +``` + +You can define and add your own equations and also overwrite existing ones. +The equations can also be used to check, rather than derive: +`check_consistency()` confirms that the parameters a technology already has still agree with each other. +This is helpful e.g. if you have a long list of values and you want to make sure that the parameters are all consistent to each other. +The functionality can not help you to identify which of the parameters is wrong, but it will flag all the involved parameters. + +In this example everything is fine and the consistency check reports consistency across the parameters: + +``` py +>>> print(tech.check_consistency(parameters=["capacity"])) +{'total_investment_from_specific': True} +``` + +If a parameter is edited by hand and no longer agrees with the others, the check flags it: + +``` py +>>> tech.parameters["capacity"].magnitude = 5 +>>> print(tech.check_consistency(parameters=["capacity"])) +{'total_investment_from_specific': False} +``` + +`parameters=` restricts the check to equations that involve the given names; omit it to check every equation touching any parameter the technology has. + +The equation used in this case looks like this: + +$$ +\text{total_investment\_cost} = \text{specific\_investment} \cdot \text{capacity} +$$ + +It is one of the equations `technologydata` ships by default, and you can look it up the same way `calculate_parameters()` and `check_consistency()` do internally, through the `equation_registry`: + +``` py +>>> from technologydata import equation_registry +>>> equation_registry.list_equations(target="capacity") +[{'name': 'total_investment_from_specific', 'parameters': ['total_investment_cost', 'specific_investment', 'capacity'], 'eq_str': 'total_investment_cost - specific_investment * capacity', 'priority': 1, 'description': None}] +``` + +`eq_str` is the equation written as an expression equal to zero, which is why it reads `total_investment_cost - specific_investment * capacity` rather than the rearranged form above. +See the [equation system](../user_guide/equations.md) for the full list of built-in equations and how to register your own. + +## 10. Project a technology into the future + +A published catalogue only covers the years its source measured. Growth-model curves β€” linear, exponential, logistic and others β€” fit to known data points and project a value to any year, past or future. + +``` py +>>> from technologydata.technologies.growth_models import LinearGrowth +>>> model = LinearGrowth(x0=2020) +>>> model = model.add_data((2020, 1000.0)).add_data((2025, 1250.0)).add_data((2030, 1500.0)) +>>> model = model.fit() +>>> model.project(2040) +2000.0 +``` + +`add_data()` and `fit()` both return the model, so calls chain. +`project()` extrapolates using the fitted curve β€” here a straight line through the three points, continued out to 2040. `TechnologyCollection.fit()` and `.project()` apply the same curves across every technology in a collection at once, fitting one named parameter per technology and returning a new collection with the projected years added. + +## Where to go next + +- [`Parameter`](../user_guide/parameter.md), [`TechnologyCollection`](../user_guide/technology_collection.md) and [`DataPackage`](../user_guide/datapackage.md) β€” reference for the classes built above. +- [`DataAccessor`](../user_guide/data_accessor.md) β€” every option for locating and loading a catalogue. +- [Danish Energy Agency parser](../examples/dea_storage_v10.md) and [Manual Input USA parser](../examples/manual_input_usa_v0134.md) β€” how each bundled catalogue is produced from its raw file. +- [Parameter formula system](../user_guide/equations.md) β€” every built-in formula, how to register your own, and the details of how a formula is solved. +- [`Technology`](../user_guide/technology.md) and [Models](../user_guide/models.md) β€” more on `calculate_parameters()`, `check_consistency()` and the growth-model curves. +- [Use cases](../user_guide/design.md) β€” the scenarios the package was designed around. diff --git a/mkdocs.yaml b/mkdocs.yaml index 1adb3e61..b249b814 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -12,6 +12,8 @@ nav: - FAQ: home/faq.md - License: home/license.md +- Tutorial: tutorial/index.md + - User Guide: - Data Package: user_guide/datapackage.md - Models: user_guide/models.md From 7ddd1ab83f64feff8b5cb45b0b0cf0657d9134e6 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 8 Sep 2026 18:11:51 +0200 Subject: [PATCH 57/81] code: remove logger.info (#131) --- src/technologydata/data_accessor.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/technologydata/data_accessor.py b/src/technologydata/data_accessor.py index ae61fd8b..1fc95632 100644 --- a/src/technologydata/data_accessor.py +++ b/src/technologydata/data_accessor.py @@ -162,9 +162,6 @@ def load(self) -> DataPackage: if self.version and self.version in source_path_list: version = self.version - logger.info( - f"Data source directory corresponding to version {self.version} found." - ) else: version = self.get_latest_version_string(list(source_path.iterdir())) if self.version is None: From 14d262d0d64f4c93cdbe4dd58959fb241db0ee3a Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 8 Sep 2026 18:12:21 +0200 Subject: [PATCH 58/81] doc: fix DataAccessor.load documentation (#130) --- docs/user_guide/data_accessor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 307b316e..4016927c 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -47,7 +47,7 @@ Once the `DataAccessor` is instantiated, call the `load()` method to load the da The directory structure is expected to be: `src/technologydata/parsers///`. -The `load()` method will look for the exact version specified during instantiation. If the version is not provided or not found, it will raise a `ValueError` and inform you of the latest available version. +The `load()` method will look for the exact version specified during instantiation. If the version is not provided, it will log a warning and use the latest available version. If the version is provided but not found, it will raise a `ValueError` and inform you of the latest available version. ```python # Assuming the path .../parsers/manual_input_usa/v1.0.0/ exists From cde1440656d2711855ded035bb2cf4fa17a37c2f Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:18:06 +0200 Subject: [PATCH 59/81] Ci/doc link checker (#136) * ci: add weekly external link checker for docs Adds a lychee-based link checker (following PyPSA's approach) that scans docs/ and README.md for broken external links. Runs weekly via schedule plus workflow_dispatch, kept separate from the main CI so flaky external hosts never block pushes/PRs. Co-Authored-By: Claude Sonnet 5 * docs: Fix incorret link to current technology-data docs --------- Co-authored-by: Claude Sonnet 5 --- .github/workflows/link-check.yml | 27 +++++++++++++++++++++++++++ .lychee.toml | 27 +++++++++++++++++++++++++++ docs/index.md | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/link-check.yml create mode 100644 .lychee.toml diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml new file mode 100644 index 00000000..3d5fe21b --- /dev/null +++ b/.github/workflows/link-check.yml @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +name: Check documentation links + +on: + schedule: + - cron: "0 4 * * 1" # every Monday at 04:00 UTC + workflow_dispatch: + +jobs: + link-check: + name: Check external links + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Check external links + uses: lycheeverse/lychee-action@v2 + with: + args: "--config .lychee.toml --no-progress './docs/**/*.md' './README.md'" + fail: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.lychee.toml b/.lychee.toml new file mode 100644 index 00000000..e92f92b7 --- /dev/null +++ b/.lychee.toml @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +# lychee link checker config (https://lychee.cli.rs). +# Checks external links referenced from the documentation and README. +scheme = ["https", "http"] + +# Accept every reachable response except definitive "not found" codes, so only +# 404 and 410 fail. Publishers routinely answer bots with 400/403/429, which is +# not link rot. +accept = ["100..=403", "405..=409", "411..=599"] + +# Slow or rate-limiting hosts time out on a different random subset each run. +# Timeouts are not link rot, so tolerate them; genuine 404/410 and connection +# failures still fail the check. +accept_timeouts = true + +# Placeholder URL used in code examples throughout the docs, not a real link. +exclude = [ + "example.com", +] + +timeout = 30 +max_retries = 5 +max_redirects = 10 +host_concurrency = 4 diff --git a/docs/index.md b/docs/index.md index c7553727..0d96a8a1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -67,7 +67,7 @@ The package already ships with some parsed data catalogues for immediate use. Prominent examples are: - Energy Storage Catalogue from the Danish Energy Agency (automatically extracted) -- Annual Technology Baseline 2024 from NREL (manually collected in the old [`technologydata` repository](http://technologydata.readthedocs.io/)) +- Annual Technology Baseline 2024 from NREL (manually collected in the old [`technologydata` repository](https://technology-data.readthedocs.io)) The raw files and parsing logic is also shipped alongside to provide the opportunity for verification. From 4a8f431a81ab0e45a101f66409f499b521263406 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:20:08 +0200 Subject: [PATCH 60/81] docs: Disable multiprocessing in mkdocs config (#135) * doc: add a step-by-step tutorial The user guide is a reference for each class, not a learning path, so there was no end-to-end route from a single parameter to a finished data package. Add docs/tutorial/index.md, one page growing in complexity: a Parameter built by hand, wrapped into a Technology, collection and DataPackage, then the same shapes loaded from the bundled catalogues, compared across currencies and units, and saved and read back. Note three details the tutorial depends on: DataPackage takes name and version, get() matches its arguments as regular expressions, and to_currency() takes an ISO3 country code. * test: run the tutorial's code blocks as doctests in CI The tutorial's output blocks were hand-copied from a REPL, so they could drift from what the code actually produces without anyone noticing. Rewrite each code block into doctest syntax (>>>/... prompts, expected output inline) and add a dedicated, opt-in `pytest --test-docs` check that runs them, following the approach PyPSA uses for its own docs. A new "Docs" CI job runs it on every push/pull request to master. Co-Authored-By: Claude Sonnet 5 * doc: rewrite tutorial introduction Reframe the opening around who the package is for and what it helps with, and note upcoming derived-parameter/consistency-check and growth-model capabilities. * doc: extend tutorial with derived parameters and growth models The rewritten introduction now promises equation-derived parameters, consistency checks, and growth-model projection, so add two closing sections demonstrating them: calculate_parameters()/check_consistency() on a Technology, and a growth-model curve fit and projected forward. Also drops the tutorial's manual data_path plumbing for DataAccessor, which prototype-2's data_accessor move made unnecessary. Co-Authored-By: Claude Sonnet 5 * docs: Prevent multiprocessing warning in build * doc: separate Technology from DataPackage in the tutorial Section 2 built a Technology and immediately wrapped it in a DataPackage in the same block, so there was no point where a reader saw what a bare Technology looks like or how a TechnologyCollection holds more than one. Split it into three steps: build one Technology and print it, collect the same technology across three years into a TechnologyCollection, then bundle that alongside an unrelated technology into a DataPackage with its sources. Renumber the following sections accordingly and update the save/load roundtrip's expected technology count (1 -> 4). Also fixes two breaks left from in-progress edits: an invalid carrier/heating_value pair on the opening Parameter example, and a syntax error in the lifetime Parameter passed to the first Technology. Co-Authored-By: Claude Sonnet 5 * docs: Revise tutorial * docs: Update equation section * revert: drop doctest CI from this branch, kept for a follow-up PR This branch is meant to carry only the mkdocs multiprocessing fix. The doctest-CI addition (test/test_docs.py, the --test-docs option, and the Docs workflow) is being split into its own PR instead, tracked on feat/doctest-ci-followup. Co-Authored-By: Claude Sonnet 5 * docs: Prevent multiprocessing warning in build mkdocs-git-revision-date-localized-plugin spawns a multiprocessing.Pool to compute git timestamps in parallel, which triggers a Python DeprecationWarning about fork() safety when run from mkdocs serve's multi-threaded live-reload process. Disable the plugin's parallel processing to avoid it; the docs site is small enough that serial git-log lookups add no noticeable build time. Co-Authored-By: Claude Sonnet 5 --------- Co-authored-by: cdgaete Co-authored-by: Claude Sonnet 5 --- mkdocs.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yaml b/mkdocs.yaml index b249b814..0b5e0383 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -155,6 +155,7 @@ plugins: type: timeago timezone: Europe/Berlin enable_creation_date: true + enable_parallel_processing: false - argref: autolinks: - reference_prefix: ":octicons-git-pull-request-16:" From 12151100d02efb9c31f7b43accf735a831361a91 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:21:10 +0200 Subject: [PATCH 61/81] doc: Add automatic testing of code in documentation using pytest (#134) * doc: add a step-by-step tutorial The user guide is a reference for each class, not a learning path, so there was no end-to-end route from a single parameter to a finished data package. Add docs/tutorial/index.md, one page growing in complexity: a Parameter built by hand, wrapped into a Technology, collection and DataPackage, then the same shapes loaded from the bundled catalogues, compared across currencies and units, and saved and read back. Note three details the tutorial depends on: DataPackage takes name and version, get() matches its arguments as regular expressions, and to_currency() takes an ISO3 country code. * test: run the tutorial's code blocks as doctests in CI The tutorial's output blocks were hand-copied from a REPL, so they could drift from what the code actually produces without anyone noticing. Rewrite each code block into doctest syntax (>>>/... prompts, expected output inline) and add a dedicated, opt-in `pytest --test-docs` check that runs them, following the approach PyPSA uses for its own docs. A new "Docs" CI job runs it on every push/pull request to master. Co-Authored-By: Claude Sonnet 5 * doc: rewrite tutorial introduction Reframe the opening around who the package is for and what it helps with, and note upcoming derived-parameter/consistency-check and growth-model capabilities. * doc: extend tutorial with derived parameters and growth models The rewritten introduction now promises equation-derived parameters, consistency checks, and growth-model projection, so add two closing sections demonstrating them: calculate_parameters()/check_consistency() on a Technology, and a growth-model curve fit and projected forward. Also drops the tutorial's manual data_path plumbing for DataAccessor, which prototype-2's data_accessor move made unnecessary. Co-Authored-By: Claude Sonnet 5 * docs: Prevent multiprocessing warning in build * doc: separate Technology from DataPackage in the tutorial Section 2 built a Technology and immediately wrapped it in a DataPackage in the same block, so there was no point where a reader saw what a bare Technology looks like or how a TechnologyCollection holds more than one. Split it into three steps: build one Technology and print it, collect the same technology across three years into a TechnologyCollection, then bundle that alongside an unrelated technology into a DataPackage with its sources. Renumber the following sections accordingly and update the save/load roundtrip's expected technology count (1 -> 4). Also fixes two breaks left from in-progress edits: an invalid carrier/heating_value pair on the opening Parameter example, and a syntax error in the lifetime Parameter passed to the first Technology. Co-Authored-By: Claude Sonnet 5 * docs: Revise tutorial * docs: Update equation section * revert: drop mkdocs multiprocessing fix from this branch, kept for a follow-up PR This branch is meant to carry only the doctest-CI addition. The mkdocs-git-revision-date-localized-plugin multiprocessing fix (enable_parallel_processing: false) is being split into its own PR instead, tracked on fix/mkdocs-multiprocessing-followup. Co-Authored-By: Claude Sonnet 5 * test: run the tutorial's code blocks as doctests in CI The tutorial's output blocks were hand-copied from a REPL, so they could drift from what the code actually produces without anyone noticing. Add a dedicated, opt-in `pytest --test-docs` check that parses the ``` py fenced blocks in docs/tutorial/index.md as doctest examples and runs them, following the approach PyPSA uses for its own docs. A new "Docs" CI job runs it on every push/pull request to master. Co-Authored-By: Claude Sonnet 5 --------- Co-authored-by: cdgaete Co-authored-by: Claude Sonnet 5 --- .github/workflows/docs.yml | 50 ++++++++++++++++++++++++++++++++++++++ test/conftest.py | 12 +++++++++ test/test_docs.py | 49 +++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 .github/workflows/docs.yml create mode 100644 test/test_docs.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..28920db5 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT +name: Docs + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + check-docs: + name: Check docs + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Cache uv dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/uv + key: ${{ runner.os }}-uv-${{ hashFiles('**/uv.lock') }} + restore-keys: | + ${{ runner.os }}-uv- + + # The tutorial's currency-conversion example downloads World Bank + # deflator data via pydeflate on first use. Caching it keeps reruns + # fast and avoids hitting the network every time. + - name: Cache pydeflate data + uses: actions/cache@v4 + with: + path: pydeflate_data + key: pydeflate-worldbank-data + + - name: Install package and dependencies + run: | + python -m pip install uv + uv sync --frozen --group dev + + - name: Run documentation doctests + run: | + uv run pytest test/test_docs.py --test-docs diff --git a/test/conftest.py b/test/conftest.py index fc88086b..c2e33df2 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -45,6 +45,12 @@ def pytest_addoption(parser: pytest.Parser) -> None: default=False, help="run the webarchive tests", ) + parser.addoption( + "--test-docs", + action="store_true", + default=False, + help="run the documentation doctests", + ) def pytest_configure(config: pytest.Config) -> None: @@ -89,6 +95,12 @@ def pytest_collection_modifyitems(config: pytest.Config, items: pytest.Item) -> item.add_marker(skip_webarchive) +@pytest.fixture(scope="session") # type: ignore +def test_docs_flag(pytestconfig: pytest.Config) -> bool: + """Check if the `--test-docs` flag was passed on the command line.""" + return bool(pytestconfig.getoption("--test-docs", default=False)) + + def create_source_from_params(params: dict[str, str]) -> technologydata.Source: """ Create a Source object from a parameter dictionary with validation. diff --git a/test/test_docs.py b/test/test_docs.py new file mode 100644 index 00000000..c7db712a --- /dev/null +++ b/test/test_docs.py @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +""" +Run the Python code blocks in the documentation as doctests. + +Every fenced ` ``` py ` block in a documented page is written in doctest +syntax (`>>>`/`...` prompts, expected output below). All blocks in a page +are concatenated and run in one shared namespace, in order, so later +blocks can reuse names defined by earlier ones -- matching how a reader +would paste them into a single session. This mirrors the approach used +by PyPSA (see PyPSA/PyPSA's test/test_docs.py). +""" + +import doctest +import re +from pathlib import Path + +import pytest + +DOCS = [Path(__file__).parent.parent / "docs" / "tutorial" / "index.md"] + + +@pytest.mark.parametrize("fpath", DOCS, ids=str) # type: ignore +def test_doctest_docs(fpath: Path, test_docs_flag: bool) -> None: + """Test Python code blocks in a documentation page using doctest.""" + if not test_docs_flag: + pytest.skip("Need --test-docs option to run documentation tests") + + content = fpath.read_text() + + # Extract ` ``` py ` fenced code blocks. + python_blocks = re.findall(r"``` py\n(.*?)\n```", content, re.DOTALL) + assert python_blocks, f"No doctest-style ` ``` py ` blocks found in {fpath}" + + # Combine all blocks into one docstring-like content so later blocks + # can reuse names defined by earlier ones. + combined_content = "\n\n".join(python_blocks) + + parser = doctest.DocTestParser() + test = parser.get_doctest( + combined_content, globs={}, name=str(fpath), filename=str(fpath), lineno=0 + ) + + runner = doctest.DocTestRunner(optionflags=doctest.NORMALIZE_WHITESPACE) + failures = runner.run(test).failed + + assert failures == 0, f"{failures} doctest(s) failed in {fpath}" From 65ddb16f09f9a28d580062f491005381a6ff4cdc Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 15 Sep 2026 17:18:00 +0200 Subject: [PATCH 62/81] code: Add security features (#133) * code: add CODEOWNERS * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * add pip audit to dependencies * code: initial config of pip-audit * code: initial config of pip-audit * code: improve ci * code: improve ci * code: add scorecard * add badge * code: remove pip-audit --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/CODEOWNERS | 23 ++++++++++ .github/workflows/ci.yaml | 6 +-- .github/workflows/scorecard.yml | 78 +++++++++++++++++++++++++++++++++ docs/index.md | 3 +- 4 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/workflows/scorecard.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..d6d0050c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,23 @@ +# CODEOWNERS file for technology-data +# These owners will be the default owners for everything in the repo +# and will be requested for review when someone opens a pull request. + +# Default owners for the entire repository +* @euronion @finozzifa + +# Documentation +/docs/ @euronion @finozzifa + +# Source code +/src/ @euronion @finozzifa + +# Tests +/tests/ @euronion @finozzifa + +# CI/CD and workflows +/.github/ @euronion @finozzifa + +# Configuration files +*.toml @euronion @finozzifa +*.yaml @euronion @finozzifa +*.yml @euronion @finozzifa diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b963be11..6fca5bd0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,16 +15,16 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: "3.13" - name: Cache Python dependencies - uses: actions/cache@v3 + uses: actions/cache@v6 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/uv.lock') }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 00000000..bb985478 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,78 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '0 8 * * 1' + push: + branches: ["prototype-2"] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + # `publish_results: true` only works when run from the default branch. conditional can be removed if disabled. + if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request' + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore + # file_mode: git + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif diff --git a/docs/index.md b/docs/index.md index 0d96a8a1..1fe08fe8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,6 +5,7 @@ [![PyPI version](https://img.shields.io/pypi/v/technologydata.svg)](https://pypi.python.org/pypi/technologydata) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/open-energy-transition/technology-data/blob/prototype-2/LICENSE) [![Python](https://img.shields.io/pypi/pyversions/technologydata.svg)](https://pypi.python.org/pypi/technologydata) +[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/open-energy-transition/technology-data/badge)](https://scorecard.dev/viewer/?uri=github.com/open-energy-transition/technology-data) # technologydata: techno-economic assumptions for energy models @@ -16,7 +17,7 @@ The goal of this package is to make energy system modelling easier and more effi Techno-economic catalogues are published in different currencies, price years, physical units, heating-value conventions and parameter naming schemes. Harmonising to combine multiple sources into one energy system model therefore requires a sequence of conversions that is easy to get wrong and rarely recorded. -This package contains a data schema and represents the techno-economic assumpstions as Python objects. +This package contains a data schema and represents the techno-economic assumptions as Python objects. The objects called `Parameter` carry not only values ("magnitude"), but also unit information, currency year, energy carrier, heating-value basis, provenance and bibliographic sources. Commonly used conversions are available, parameters can be checked for consistency. Provenance information for modifying parameters is automatically recorded, e.g. to keep track of currency conversion factors or formulas used for calculation. From 85a38d7ec1d6b28e9853c8a0e23b6cedde082c57 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 15 Sep 2026 22:52:13 +0200 Subject: [PATCH 63/81] code: add dedicated test (#137) --- src/technologydata/source_collection.py | 12 +++--- src/technologydata/technology_collection.py | 29 ++++++++------ test/test_source_collection.py | 32 ++++++++++++++++ test/test_technology_collection.py | 42 +++++++++++++++++++++ 4 files changed, 99 insertions(+), 16 deletions(-) diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index 4ab8ddd4..ecafcb7e 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -70,16 +70,18 @@ def __str__(self) -> str: sources_str = ", ".join(str(source) for source in self.sources) return f"SourceCollection with {len(self.sources)} sources: {sources_str}" - def get(self, title: str, authors: str) -> Self: + def get(self, title: str | None = None, authors: str | None = None) -> Self: """ Filter sources based on regex patterns for non-optional attributes. + Parameters not provided will match any value (equivalent to .* regex). + Parameters ---------- - title : str - Regex pattern to filter titles. - authors : str - Regex pattern to filter authors. + title : str, optional + Regex pattern to filter titles. If None, matches all titles. + authors : str, optional + Regex pattern to filter authors. If None, matches all authors. Returns ------- diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index 084b8016..3768f90d 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -66,23 +66,30 @@ def __len__(self) -> int: return len(self.technologies) def get( - self, name: str, region: str, year: int, case: str, detailed_technology: str + self, + name: str | None = None, + region: str | None = None, + year: int | None = None, + case: str | None = None, + detailed_technology: str | None = None, ) -> Self: """ Filter technologies based on regex patterns for non-optional attributes. + Parameters not provided will match any value (equivalent to .* regex). + Parameters ---------- - name : str - Regex pattern to filter technology names. - region : str - Regex pattern to filter region identifiers. - year : int - Regex pattern to filter the year of the data. - case : str - Regex pattern to filter case or scenario identifiers. - detailed_technology : str - Regex pattern to filter detailed technology names. + name : str, optional + Regex pattern to filter technology names. If None, matches all names. + region : str, optional + Regex pattern to filter region identifiers. If None, matches all regions. + year : int, optional + Regex pattern to filter the year of the data. If None, matches all years. + case : str, optional + Regex pattern to filter case or scenario identifiers. If None, matches all cases. + detailed_technology : str, optional + Regex pattern to filter detailed technology names. If None, matches all detailed technologies. Returns ------- diff --git a/test/test_source_collection.py b/test/test_source_collection.py index faa95fb5..b86ed1bf 100644 --- a/test/test_source_collection.py +++ b/test/test_source_collection.py @@ -320,3 +320,35 @@ def test_get(self, title_pattern: str, authors_pattern: str) -> None: ) result = source_collection.get(title=title_pattern, authors=authors_pattern) assert len(result.sources) == 1 + + @pytest.mark.parametrize( + "filter_param, filter_value, expected_count", + [ + ["title", "atb_nrel", 1], + ["title", "tech_data_generation", 1], + ["authors", "NREL/ATB", 1], + ["authors", "Danish Energy Agency", 1], + ], + ) # type: ignore + def test_get_with_single_parameter( + self, filter_param: str, filter_value: str | int, expected_count: int + ) -> None: + """Check if get() with a single parameter filters correctly.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "sources.json", + ) + sources_collection = technologydata.SourceCollection.from_json(input_file) + # Use explicit conditionals to maintain type safety + if filter_param == "title": + result = sources_collection.get(title=str(filter_value)) + elif filter_param == "authors": + result = sources_collection.get(authors=str(filter_value)) + else: + raise ValueError(f"Unknown filter parameter: {filter_param}") + + assert isinstance(result, technologydata.SourceCollection) + assert len(result.sources) == expected_count diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index 26941c46..bf87c4f3 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -147,6 +147,48 @@ def test_get( assert isinstance(result, technologydata.TechnologyCollection) assert len(result.technologies) == 1 + @pytest.mark.parametrize( + "filter_param, filter_value, expected_count", + [ + ["name", "Solar photovoltaics", 2], + ["region", "DEU", 2], + ["year", 2022, 2], + ["case", "example-scenario", 1], + ["case", "example-project", 1], + ["detailed_technology", "Si-HC", 2], + ], + ) # type: ignore + def test_get_with_single_parameter( + self, filter_param: str, filter_value: str | int, expected_count: int + ) -> None: + """Check if get() with a single parameter filters correctly.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technologies_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + # Use explicit conditionals to maintain type safety + if filter_param == "name": + result = technologies_collection.get(name=str(filter_value)) + elif filter_param == "region": + result = technologies_collection.get(region=str(filter_value)) + elif filter_param == "year": + result = technologies_collection.get(year=int(filter_value)) + elif filter_param == "case": + result = technologies_collection.get(case=str(filter_value)) + elif filter_param == "detailed_technology": + result = technologies_collection.get(detailed_technology=str(filter_value)) + else: + raise ValueError(f"Unknown filter parameter: {filter_param}") + + assert isinstance(result, technologydata.TechnologyCollection) + assert len(result.technologies) == expected_count + def test_fit_linear_growth(self) -> None: """Test TechnologyCollection.fit with LinearGrowth model.""" tech = technologydata.Technology( From a3bfdc373d6183de10edb89e93c6ee7644a8a697 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Tue, 15 Sep 2026 22:59:45 +0200 Subject: [PATCH 64/81] Further security changes (#139) * doc: add pre-commit badge * code: add codeql * code: add dependabot * add SECURITY.md * modify scorecard.yml --- .github/dependabot.yml | 18 +++++++++++++ .github/workflows/codeql.yml | 48 +++++++++++++++++++++++++++++++++ .github/workflows/scorecard.yml | 20 +------------- SECURITY.md | 44 ++++++++++++++++++++++++++++++ docs/index.md | 1 + 5 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 SECURITY.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..505a9e4a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +# dependabot +# Ref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +# ------------------------------------------------------------------------------ +version: 2 +updates: +- package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + groups: + # open a single pull-request for all GitHub actions updates + github-actions: + patterns: + - '*' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..632a3de5 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +name: "CodeQL Advanced" + +on: + push: + branches: ["prototype-2"] + pull_request: + branches: ["prototype-2"] + schedule: + - cron: '0 8 * * 1' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + runs-on: ubuntu-latest + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + strategy: + fail-fast: false + matrix: + include: + - language: actions + build-mode: none + - language: python + build-mode: none + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index bb985478..1ebeb52c 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -13,6 +13,7 @@ on: - cron: '0 8 * * 1' push: branches: ["prototype-2"] + workflow_dispatch: # Declare default permissions as read only. permissions: read-all @@ -28,9 +29,6 @@ jobs: security-events: write # Needed to publish results and get a badge (see publish_results below). id-token: write - # Uncomment the permissions below if installing in a private repository. - # contents: read - # actions: read steps: - name: "Checkout code" @@ -43,24 +41,8 @@ jobs: with: results_file: results.sarif results_format: sarif - # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: - # - you want to enable the Branch-Protection check on a *public* repository, or - # - you are installing Scorecard on a *private* repository - # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. - # repo_token: ${{ secrets.SCORECARD_TOKEN }} - - # Public repositories: - # - Publish results to OpenSSF REST API for easy access by consumers - # - Allows the repository to include the Scorecard badge. - # - See https://github.com/ossf/scorecard-action#publishing-results. - # For private repositories: - # - `publish_results` will always be set to `false`, regardless - # of the value entered here. publish_results: true - # (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore - # file_mode: git - # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..d3e37d62 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,44 @@ + + +# Security Policy + +## Reporting a Vulnerability + +To report a vulnerability, the preferred method is to use the GitHub "Report a vulnerability" button under the repository's "Security and quality" tab. +This will create a private communication channel between the reporter and the repository maintainers. + +If you are absolutely unable to or have strong reasons not to use GitHub's vulnerability reporting workflow, please reach out to the OET security team: .org>. + +A lead maintainer or security team member will acknowledge your report within 2 business days, and will follow up with next steps shortly after. +The security team will endeavor to keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. + +Please report security bugs in third-party modules to the person or team maintaining that module. + +## Disclosure Policy + +When the team receives a security bug report, they will assign it to a primary handler. +This person will coordinate the fix and release process, involving the following steps: + +- Confirm the problem and determine the affected versions. +- Audit code to find any potential similar problems. +- Prepare fixes according to the patching targets below. + +Security fixes are given priority and might be enough to cause a new version to be released. + +## Patching Targets + +Time-to-patch targets from verification of the report: + +| Severity | Target | +| -------- | ------ | +| Critical | 48 hours | +| High | 14 days | +| Medium | 60 days | +| Low | Best effort / next scheduled release | + +## End of Life + +When this project is no longer maintained, the repository will be archived on GitHub and a notice added stating that security updates have ceased. diff --git a/docs/index.md b/docs/index.md index 1fe08fe8..2dd19191 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,6 +6,7 @@ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/open-energy-transition/technology-data/blob/prototype-2/LICENSE) [![Python](https://img.shields.io/pypi/pyversions/technologydata.svg)](https://pypi.python.org/pypi/technologydata) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/open-energy-transition/technology-data/badge)](https://scorecard.dev/viewer/?uri=github.com/open-energy-transition/technology-data) +[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/open-energy-transition/technology-data/prototype-2.svg)](https://results.pre-commit.ci/latest/github/open-energy-transition/technology-data/prototype-2) # technologydata: techno-economic assumptions for energy models From b353668d6deeb101d077160f90e4d32d626faae2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 09:55:06 +0200 Subject: [PATCH 65/81] build(deps): bump the github-actions group with 8 updates (#140) Bumps the github-actions group with 8 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `4` | `7` | | [actions/setup-python](https://github.com/actions/setup-python) | `5` | `7` | | [actions/cache](https://github.com/actions/cache) | `4` | `6` | | [github/codeql-action](https://github.com/github/codeql-action) | `3` | `4` | | [softprops/action-gh-release](https://github.com/softprops/action-gh-release) | `2` | `3` | | [actions/download-artifact](https://github.com/actions/download-artifact) | `6` | `8` | | [ossf/scorecard-action](https://github.com/ossf/scorecard-action) | `2.4.1` | `2.4.4` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4.6.1` | `7.0.1` | Updates `actions/checkout` from 4 to 7 - [Release notes](https://github.com/actions/checkout/releases) - [Commits](https://github.com/actions/checkout/compare/v4...v7) Updates `actions/setup-python` from 5 to 7 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v7) Updates `actions/cache` from 4 to 6 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4...v6) Updates `github/codeql-action` from 3 to 4 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v3...v4) Updates `softprops/action-gh-release` from 2 to 3 - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3) Updates `actions/download-artifact` from 6 to 8 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v6...v8) Updates `ossf/scorecard-action` from 2.4.1 to 2.4.4 - [Release notes](https://github.com/ossf/scorecard-action/releases) - [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md) - [Commits](https://github.com/ossf/scorecard-action/compare/f49aabe0b5af0936a0987cfb85d86b75731b0186...2d1146689b8cda280b9bc96326124645441f03bc) Updates `actions/upload-artifact` from 4.6.1 to 7.0.1 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/setup-python dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/cache dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: github/codeql-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: softprops/action-gh-release dependency-version: '3' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: ossf/scorecard-action dependency-version: 2.4.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 8 ++++---- .github/workflows/link-check.yml | 2 +- .github/workflows/release.yml | 14 +++++++------- .github/workflows/scorecard.yml | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 28920db5..4ba1b2b6 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -16,15 +16,15 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: "3.13" - name: Cache uv dependencies - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.cache/uv key: ${{ runner.os }}-uv-${{ hashFiles('**/uv.lock') }} @@ -35,7 +35,7 @@ jobs: # deflator data via pydeflate on first use. Caching it keeps reruns # fast and avoids hitting the network every time. - name: Cache pydeflate data - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: pydeflate_data key: pydeflate-worldbank-data diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml index 3d5fe21b..212e3664 100644 --- a/.github/workflows/link-check.yml +++ b/.github/workflows/link-check.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Check external links uses: lycheeverse/lychee-action@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2c180c1..b68cc356 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: outputs: prepared: ${{ steps.validate.outputs.prepared }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Validate commit message id: validate @@ -48,7 +48,7 @@ jobs: echo "Branch found: $branch" echo "BRANCH_NAME=$branch" >> $GITHUB_ENV - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 ref: ${{ env.BRANCH_NAME }} @@ -56,7 +56,7 @@ jobs: # Start of preparation script - - uses: actions/setup-python@v6 + - uses: actions/setup-python@v7 with: python-version: 3.12 @@ -106,7 +106,7 @@ jobs: if: ${{ needs.check-preparation.outputs.prepared == 'true' }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: hynek/build-and-inspect-python-package@v2 release: @@ -116,8 +116,8 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v6 - - uses: softprops/action-gh-release@v2 + - uses: actions/checkout@v7 + - uses: softprops/action-gh-release@v3 with: generate_release_notes: true @@ -131,7 +131,7 @@ jobs: permissions: id-token: write steps: - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v8 with: name: Packages path: dist diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 1ebeb52c..115f4fde 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -32,12 +32,12 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4 with: results_file: results.sarif results_format: sarif @@ -46,7 +46,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: SARIF file path: results.sarif @@ -55,6 +55,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@v3 + uses: github/codeql-action/upload-sarif@v4 with: sarif_file: results.sarif From 3f9617e40aae6635b6b9df61a80eeca693151033 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Wed, 16 Sep 2026 10:10:40 +0200 Subject: [PATCH 66/81] code: add cache (#142) --- src/technologydata/data_accessor.py | 59 +++++++++++++++++++---------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/technologydata/data_accessor.py b/src/technologydata/data_accessor.py index 1fc95632..fc38fac1 100644 --- a/src/technologydata/data_accessor.py +++ b/src/technologydata/data_accessor.py @@ -178,7 +178,7 @@ def load(self) -> DataPackage: dp = DataPackage.from_json(self.data_source, version, data_path) return dp - def download(self, base_url: str) -> DataPackage: + def download(self, base_url: str, use_cache: bool = True) -> DataPackage: """ Download and load technology data from a remote URL. @@ -186,6 +186,9 @@ def download(self, base_url: str) -> DataPackage: specified base URL and loads them into a DataPackage instance. The sources.json file is optional; if not found, sources will be extracted from technologies. + By default, if the data is already cached locally, it will be loaded from the + cache instead of re-downloading. Set ``use_cache=False`` to force a fresh download. + **Important:** The ``data_source`` and ``version`` attributes of the DataAccessor instance determine the **local storage location** for downloaded files. The ``base_url`` parameter determines **what data is downloaded**. @@ -206,6 +209,9 @@ def download(self, base_url: str) -> DataPackage: to the directory containing these files (without the filename itself). **The caller must ensure this URL corresponds to the data_source and version specified in the DataAccessor instance.** + use_cache : bool, optional + If True (default), check for locally cached files first and use them if available. + If False, always download from the URL even if cached files exist. Returns ------- @@ -228,33 +234,51 @@ def download(self, base_url: str) -> DataPackage: version - this is the caller's responsibility. - The downloaded files persist on disk and can be reused in subsequent sessions by calling ``load()`` with the same data source and version. + - When ``use_cache=True``, only the existence of technologies.json is checked to + determine if the cache is valid. Examples -------- - Download v10 data and store it as v10: + Download v10 data and store it as v10 (uses cache if available): >>> accessor = DataAccessor(data_source="dea_energy_storage", version="v10") >>> base_url = "https://example.com/data/dea_energy_storage/v10/" >>> dp = accessor.download(base_url) - >>> # Files are downloaded from the URL and stored at: + >>> # If not cached, files are downloaded from the URL and stored at: >>> # src/technologydata/parsers/dea_energy_storage/v10/ + Force a fresh download, ignoring cache: + + >>> dp = accessor.download(base_url, use_cache=False) + """ + # Validate that version is set + if not self.version: + raise ValueError("Version must be specified for downloading data.") + + # Define local paths + technologies_path = pathlib.Path( + self.data_path, self.data_source, self.version, "technologies.json" + ) + sources_path = pathlib.Path( + self.data_path, self.data_source, self.version, "sources.json" + ) + + # Check cache if use_cache is enabled + if use_cache and technologies_path.exists(): + logger.info( + f"Using cached data from {technologies_path.parent} (use_cache=True)" + ) + return self.load() + + # If not in cache or use_cache=False, proceed with download + # Ensure base_url ends with / using urljoin for proper URL normalization base_url = urljoin(base_url, "./") - # Download technologies.json + # Prepare download URLs technologies_url = f"{base_url}technologies.json" sources_url = f"{base_url}sources.json" - if self.version: - technologies_path = pathlib.Path( - self.data_path, self.data_source, self.version, "technologies.json" - ) - sources_path = pathlib.Path( - self.data_path, self.data_source, self.version, "sources.json" - ) - else: - raise ValueError("Version must be specified for downloading data.") # Ensure parent directories exist self.ensure_path_exists(technologies_path.parent) @@ -283,13 +307,8 @@ def download(self, base_url: str) -> DataPackage: raise # Load using DataPackage.from_json - # Construct path to folder containing the downloaded files - if self.version: - path_to_folder = pathlib.Path( - self.data_path, self.data_source, self.version - ) - else: - path_to_folder = pathlib.Path(self.data_path, self.data_source) + # Use the already defined technologies_path to determine folder location + path_to_folder = technologies_path.parent data_package = DataPackage.from_json( name=self.data_source, version=self.version, path_to_folder=path_to_folder From 4f5872efe66ae6a21179e58e5ec4d56e20fdcf90 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Wed, 16 Sep 2026 10:41:52 +0200 Subject: [PATCH 67/81] Set token permissions (#141) * code: set token permissions * code: update SECURITY.md * code: pin dependency for codeql-action/upload-sarif in scorecard.yml * code: pin depedendencies in workflows * code: pin depedendencies in workflows --- .github/workflows/ci.yaml | 8 +++++--- .github/workflows/codeql.yml | 8 +++++--- .github/workflows/docs.yml | 10 ++++++---- .github/workflows/link-check.yml | 6 ++++-- .github/workflows/release.yml | 22 ++++++++++++---------- .github/workflows/scorecard.yml | 2 +- SECURITY.md | 2 +- 7 files changed, 34 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6fca5bd0..2cdc3fb7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,6 +3,8 @@ # SPDX-License-Identifier: MIT name: Technologydata prototype CI +permissions: read-all + on: push: branches: [prototype-2] @@ -15,16 +17,16 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@v7 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.13" - name: Cache Python dependencies - uses: actions/cache@v6 + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v 6.1.0 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/uv.lock') }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 632a3de5..573b750f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -4,6 +4,8 @@ name: "CodeQL Advanced" +permissions: read-all + on: push: branches: ["prototype-2"] @@ -33,16 +35,16 @@ jobs: build-mode: none steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4 + uses: github/codeql-action/init@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 + uses: github/codeql-action/analyze@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4ba1b2b6..f25daada 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,6 +3,8 @@ # SPDX-License-Identifier: MIT name: Docs +permissions: read-all + on: push: branches: [master] @@ -16,15 +18,15 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@v7 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.13" - name: Cache uv dependencies - uses: actions/cache@v6 + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v 6.1.0 with: path: ~/.cache/uv key: ${{ runner.os }}-uv-${{ hashFiles('**/uv.lock') }} @@ -35,7 +37,7 @@ jobs: # deflator data via pydeflate on first use. Caching it keeps reruns # fast and avoids hitting the network every time. - name: Cache pydeflate data - uses: actions/cache@v6 + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v 6.1.0 with: path: pydeflate_data key: pydeflate-worldbank-data diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml index 212e3664..2d18f419 100644 --- a/.github/workflows/link-check.yml +++ b/.github/workflows/link-check.yml @@ -4,6 +4,8 @@ name: Check documentation links +permissions: read-all + on: schedule: - cron: "0 4 * * 1" # every Monday at 04:00 UTC @@ -16,10 +18,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Check external links - uses: lycheeverse/lychee-action@v2 + uses: lycheeverse/lychee-action@e7477775783ea5526144ba13e8db5eec57747ce8 # v2.9.0 with: args: "--config .lychee.toml --no-progress './docs/**/*.md' './README.md'" fail: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b68cc356..e0435d68 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,8 @@ name: Release +permissions: read-all + on: push: tags: @@ -19,7 +21,7 @@ jobs: outputs: prepared: ${{ steps.validate.outputs.prepared }} steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Validate commit message id: validate @@ -48,7 +50,7 @@ jobs: echo "Branch found: $branch" echo "BRANCH_NAME=$branch" >> $GITHUB_ENV - - uses: actions/checkout@v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1 with: fetch-depth: 0 ref: ${{ env.BRANCH_NAME }} @@ -56,7 +58,7 @@ jobs: # Start of preparation script - - uses: actions/setup-python@v7 + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: 3.12 @@ -92,7 +94,7 @@ jobs: git push origin --delete ${{ github.ref_name }} - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v7 + uses: stefanzweifel/git-auto-commit-action@4a55954c782fc1ea30b9056cd3e7a2b40ca8887d #v7.2.0 with: branch: ${{ env.BRANCH_NAME }} commit_message: '${{ env.PREPARATION_COMMIT }}' @@ -106,8 +108,8 @@ jobs: if: ${{ needs.check-preparation.outputs.prepared == 'true' }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 - - uses: hynek/build-and-inspect-python-package@v2 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1 + - uses: hynek/build-and-inspect-python-package@2abe76da66d0a6a4a227101f9348ee855797cfa5 #v3.0.1 release: name: Create GitHub release @@ -116,8 +118,8 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v7 - - uses: softprops/action-gh-release@v3 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1 + - uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 #v3.0.3 with: generate_release_notes: true @@ -131,8 +133,8 @@ jobs: permissions: id-token: write steps: - - uses: actions/download-artifact@v8 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: Packages path: dist - - uses: pypa/gh-action-pypi-publish@release/v1 + - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 115f4fde..698d3cc3 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -55,6 +55,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@v4 + uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 with: sarif_file: results.sarif diff --git a/SECURITY.md b/SECURITY.md index d3e37d62..2b96a3a8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,7 +10,7 @@ SPDX-License-Identifier: MIT To report a vulnerability, the preferred method is to use the GitHub "Report a vulnerability" button under the repository's "Security and quality" tab. This will create a private communication channel between the reporter and the repository maintainers. -If you are absolutely unable to or have strong reasons not to use GitHub's vulnerability reporting workflow, please reach out to the OET security team: .org>. +If you are absolutely unable to or have strong reasons not to use GitHub's vulnerability reporting workflow, please contact the repository maintainers. A lead maintainer or security team member will acknowledge your report within 2 business days, and will follow up with next steps shortly after. The security team will endeavor to keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. From fdf10591772a3d194e066078b6c0b54619b36099 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Mon, 21 Sep 2026 15:38:32 +0200 Subject: [PATCH 68/81] Enhance the `TechnologyCollection` and `Technology` classes (#145) * code: add __getitem__ to TechnologyCollection * code: add get_parameter to TechnologyCollection * code: add append and add methods * code: add append and add methods * code: new additions --- src/technologydata/technology.py | 50 +++++++ src/technologydata/technology_collection.py | 110 +++++++++++++- test/test_technology.py | 57 ++++++++ test/test_technology_collection.py | 154 ++++++++++++++++++++ 4 files changed, 370 insertions(+), 1 deletion(-) diff --git a/src/technologydata/technology.py b/src/technologydata/technology.py index 6880dedf..005b5432 100644 --- a/src/technologydata/technology.py +++ b/src/technologydata/technology.py @@ -79,6 +79,56 @@ def __setitem__(self, key: str, value: Parameter) -> None: """ self.parameters[key] = value + def __contains__(self, key: str) -> bool: + """ + Check if a parameter exists. + + Parameters + ---------- + key : str + Parameter name. + + Returns + ------- + bool + True if the parameter exists, False otherwise. + + """ + return key in self.parameters + + def __delitem__(self, key: str) -> None: + """ + Delete a parameter by name. + + Parameters + ---------- + key : str + Parameter name. + + """ + del self.parameters[key] + + def __str__(self) -> str: + """ + Return a compact human-readable summary of the Technology. + + Returns + ------- + str + Summary with name, region, year, case, and parameter names. + + """ + param_names = list(self.parameters.keys()) + param_str = ( + f"{len(param_names)} parameters: {param_names}" + if param_names + else "no parameters" + ) + return ( + f"Technology({self.name!r}, region={self.region!r}, year={self.year}, " + f"case={self.case!r}, {param_str})" + ) + def check_consistency( self, parameters: Sequence[str] | None = None, diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index 3768f90d..dfb4832b 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -10,7 +10,7 @@ import pathlib import re from collections.abc import Iterator, Sequence -from typing import TYPE_CHECKING, Annotated, Self +from typing import TYPE_CHECKING, Annotated, Self, overload import pandas import pydantic @@ -41,6 +41,35 @@ class TechnologyCollection(pydantic.BaseModel): list[Technology], pydantic.Field(description="List of Technology objects.") ] + # Given the fact that the return type depends on the input type + # We add the overload decorator to provide exact signatures + # index: int --> Technology + # index: slice --> TechnologyCollection + @overload + def __getitem__(self, index: int) -> Technology: ... + + @overload + def __getitem__(self, index: slice) -> Self: ... + + def __getitem__(self, index: int | slice) -> Technology | Self: + """ + Access a TechnologyCollection by index, slice. + + Parameters + ---------- + index : int | slice + Index or slice of the Technology to access. + + Returns + ------- + Technology | Self + The requested Technology (if an index is provided) or TechnologyCollection (if a slice is given). + + """ + if isinstance(index, slice): + return self.__class__(technologies=self.technologies[index]) + return self.technologies[index] + def __iter__(self) -> Iterator[Technology]: # type: ignore """ Return an iterator over the list of Technology objects. @@ -65,6 +94,51 @@ def __len__(self) -> int: """ return len(self.technologies) + def __str__(self) -> str: + """ + Return a compact human-readable summary of the TechnologyCollection. + + Returns + ------- + str + Summary with count and brief technology information. + + """ + count = len(self.technologies) + if count == 0: + return "TechnologyCollection(0 technologies)" + elif count <= 3: + tech_summaries = [ + f"{t.name} ({t.region}, {t.year})" for t in self.technologies + ] + return f"TechnologyCollection({count} technologies: {', '.join(tech_summaries)})" + else: + first_tech = self.technologies[0] + last_tech = self.technologies[-1] + return ( + f"TechnologyCollection({count} technologies: " + f"{first_tech.name} ({first_tech.region}, {first_tech.year}) ... " + f"{last_tech.name} ({last_tech.region}, {last_tech.year}))" + ) + + def get_parameter(self, name: str) -> list[Parameter | None]: + """ + Get parameter values across all technologies in the collection. + + Parameters + ---------- + name : str + Parameter name to retrieve. + + Returns + ------- + list[Parameter | None] + List with one entry per technology. None for technologies + that don't have this parameter. + + """ + return [tech.parameters.get(name) for tech in self.technologies] + def get( self, name: str | None = None, @@ -133,6 +207,40 @@ def get( return TechnologyCollection(technologies=filtered_technologies) # type: ignore + def __add__(self, other: Self) -> Self: + """ + Merge two TechnologyCollection objects using the + operator. + + Parameters + ---------- + other : TechnologyCollection + The collection to merge with. + + Returns + ------- + TechnologyCollection + A new TechnologyCollection containing technologies from both collections. + + """ + return self.__class__(technologies=self.technologies + other.technologies) + + def append(self, tech: Technology) -> Self: + """ + Append a technology to an existing TechnologyCollection. + + Parameters + ---------- + tech : Technology + The technology to add. + + Returns + ------- + TechnologyCollection + A new TechnologyCollection with the appended technology. + + """ + return self + self.__class__(technologies=[tech]) + def to_dataframe(self) -> pandas.DataFrame: """ Convert the TechnologyCollection to a pandas DataFrame. diff --git a/test/test_technology.py b/test/test_technology.py index bf0b0220..4c1665a8 100644 --- a/test/test_technology.py +++ b/test/test_technology.py @@ -494,3 +494,60 @@ def test_check_consistency_uses_custom_equation_registry(self) -> None: equations=custom_registry, ) assert status == {"z_sum": True} + + def test_contains(self) -> None: + """Test if __contains__ method works correctly.""" + tech = technologydata.Technology( + name="Test Technology", + detailed_technology="Test", + case="test-case", + region="USA", + year=2023, + parameters={ + "capacity": technologydata.Parameter(magnitude=100.0, units="MW"), + "lifetime": technologydata.Parameter(magnitude=25.0, units="year"), + }, + ) + assert "capacity" in tech + assert "lifetime" in tech + assert "nonexistent" not in tech + + def test_delitem(self) -> None: + """Test if __delitem__ method works correctly.""" + tech = technologydata.Technology( + name="Test Technology", + detailed_technology="Test", + case="test-case", + region="USA", + year=2023, + parameters={ + "capacity": technologydata.Parameter(magnitude=100.0, units="MW"), + "lifetime": technologydata.Parameter(magnitude=25.0, units="year"), + }, + ) + assert "capacity" in tech + del tech["capacity"] + assert "capacity" not in tech + assert "lifetime" in tech + + def test_str(self) -> None: + """Test if __str__ method returns a compact summary.""" + tech = technologydata.Technology( + name="Solar PV", + detailed_technology="Si-HC", + case="baseline", + region="DEU", + year=2025, + parameters={ + "capacity": technologydata.Parameter(magnitude=100.0, units="MW"), + "lifetime": technologydata.Parameter(magnitude=25.0, units="year"), + }, + ) + result = str(tech) + assert "Solar PV" in result + assert "DEU" in result + assert "2025" in result + assert "baseline" in result + assert "2 parameters" in result + assert "capacity" in result + assert "lifetime" in result diff --git a/test/test_technology_collection.py b/test/test_technology_collection.py index bf87c4f3..56d341ad 100644 --- a/test/test_technology_collection.py +++ b/test/test_technology_collection.py @@ -531,3 +531,157 @@ def test_check_consistency_returns_one_status_dict_per_technology(self) -> None: status[1]["eac_via_annuity_factor"] == "inapplicable: ['eac', 'specific_investment', 'annuity_factor']" ) + + def test_getitem(self) -> None: + """Test if the __getitem__ method works correctly.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + assert isinstance(technology_collection[0], technologydata.Technology) + assert isinstance( + technology_collection[0:1], technologydata.TechnologyCollection + ) + assert technology_collection[0].case == "example-scenario" + assert technology_collection[1].case == "example-project" + + def test_get_parameter(self) -> None: + """Test if the get_parameter method works correctly.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + technology_collection = technologydata.TechnologyCollection.from_json( + input_file + ) + assert len(technology_collection.get_parameter("capacity")) == 2 + capacity_params = technology_collection.get_parameter("capacity") + assert isinstance(capacity_params[0], technologydata.Parameter) + assert isinstance(capacity_params[1], technologydata.Parameter) + assert capacity_params[0].magnitude == 1.0 + assert capacity_params[1].magnitude == 3.0 + assert len(technology_collection.get_parameter("yeah")) == 2 + assert technology_collection.get_parameter("yeah")[0] is None + assert technology_collection.get_parameter("yeah")[1] is None + + def test_append(self) -> None: + """Test if the append method works correctly and is non-mutating.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + original_collection = technologydata.TechnologyCollection.from_json(input_file) + original_length = len(original_collection) + + new_tech = technologydata.Technology( + name="New Technology", + detailed_technology="New Tech", + region="USA", + case="test-case", + year=2023, + parameters={}, + ) + + new_collection = original_collection.append(new_tech) + + # Check that append returns a new collection + assert isinstance(new_collection, technologydata.TechnologyCollection) + assert len(new_collection) == original_length + 1 + # Check that the original collection is unchanged (non-mutating) + assert len(original_collection) == original_length + # Check that the new technology is in the new collection + assert new_collection[-1].name == "New Technology" + assert new_collection[-1].region == "USA" + + def test_add(self) -> None: + """Test if the __add__ method works correctly for merging collections.""" + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + collection_a = technologydata.TechnologyCollection.from_json(input_file) + collection_b = technologydata.TechnologyCollection( + technologies=[ + technologydata.Technology( + name="Tech A", + detailed_technology="A", + region="EUR", + case="case-a", + year=2025, + parameters={}, + ), + technologydata.Technology( + name="Tech B", + detailed_technology="B", + region="USA", + case="case-b", + year=2026, + parameters={}, + ), + ] + ) + + # Merge using + operator + merged_collection = collection_a + collection_b + + # Check that merge creates a new collection with combined technologies + assert isinstance(merged_collection, technologydata.TechnologyCollection) + assert len(merged_collection) == len(collection_a) + len(collection_b) + # Check that original collections are unchanged + assert len(collection_a) == 2 + assert len(collection_b) == 2 + # Check that technologies from both collections are present + assert merged_collection[0].case == "example-scenario" + assert merged_collection[-1].name == "Tech B" + + def test_str(self) -> None: + """Test if __str__ method returns a compact summary.""" + # Test with empty collection + empty_collection = technologydata.TechnologyCollection(technologies=[]) + assert str(empty_collection) == "TechnologyCollection(0 technologies)" + + # Test with single technology + single_tech = technologydata.Technology( + name="Solar PV", + detailed_technology="Si-HC", + case="baseline", + region="DEU", + year=2025, + parameters={}, + ) + single_collection = technologydata.TechnologyCollection( + technologies=[single_tech] + ) + result = str(single_collection) + assert "1 technologies" in result + assert "Solar PV" in result + assert "DEU" in result + assert "2025" in result + + # Test with larger collection + input_file = pathlib.Path( + path_cwd, + "test", + "test_data", + "solar_photovoltaics_example", + "technologies.json", + ) + collection = technologydata.TechnologyCollection.from_json(input_file) + result = str(collection) + assert "2 technologies" in result + assert "Solar photovoltaics" in result From 1ea3584df7615c6371650a8358da347a26b955c0 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 23 Sep 2026 22:17:07 +0200 Subject: [PATCH 69/81] fix(data_accessor): default data_path to the installed package (#149) The default data_path was resolved relative to the working directory, so load() only worked from the root of a repository checkout and created empty directories elsewhere. Default to the package's parsers directory, which is the same path in a checkout. Co-authored-by: Claude Opus 5.5 (1M context) --- docs/user_guide/data_accessor.md | 2 +- src/technologydata/data_accessor.py | 10 ++++++---- test/test_parser_data_accessor.py | 7 +++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 4016927c..9c3f63a9 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -131,7 +131,7 @@ Downloaded files are saved to: {data_path}/{data_source}/{version}/sources.json ``` -Where `data_path` defaults to `src/technologydata/parsers/`. Once downloaded, the data can be accessed later using the `load()` method without re-downloading. +Where `data_path` defaults to the `parsers/` directory of the installed package (`src/technologydata/parsers/` in a repository checkout). Once downloaded, the data can be accessed later using the `load()` method without re-downloading. ### Parsing Raw Data diff --git a/src/technologydata/data_accessor.py b/src/technologydata/data_accessor.py index fc38fac1..13302137 100644 --- a/src/technologydata/data_accessor.py +++ b/src/technologydata/data_accessor.py @@ -21,7 +21,8 @@ from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser from technologydata.parsers.manual_input_usa import ManualInputUsaParser -path_cwd = pathlib.Path.cwd() +# The datasets are shipped inside the package, next to their parsers. +path_parsers = pathlib.Path(__file__).parent / "parsers" logger = logging.getLogger(__name__) @@ -52,8 +53,9 @@ class DataAccessor(pydantic.BaseModel): If not provided, the latest version will be automatically determined and used. Default is None. data_path : pathlib.Path, optional - The path to the data source directory. If not provided, the default - path will be used. + The path to the data source directory. If not provided, the + `parsers` directory of the installed package is used + (`src/technologydata/parsers` in a repository checkout). """ @@ -66,7 +68,7 @@ class DataAccessor(pydantic.BaseModel): Field( description="The base directory path where data sources are located.", ), - ] = pathlib.Path(path_cwd, "src", "technologydata", "parsers") + ] = path_parsers @staticmethod def ensure_path_exists(input_data_path: pathlib.Path) -> None: diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index 2dc38837..b7ab5367 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -10,6 +10,7 @@ import pytest +import technologydata from technologydata import DataAccessor from technologydata.data_accessor import DataSourceName @@ -66,6 +67,12 @@ def test_access_data_dea_energy_storage(self) -> None: assert data_package.version == "v10" assert len(data_package.technologies) == 136 + def test_default_data_path_is_package_directory(self) -> None: + """Test that the bundled data is found independent of the working directory.""" + accessor = DataAccessor(data_source="dea_energy_storage", version="v10") + expected = pathlib.Path(technologydata.__file__).parent / "parsers" + assert accessor.data_path == expected + def test_access_data_dea_energy_storage_validation(self) -> None: """Test load data for dea_energy_storage with a wrong data set name.""" with pytest.raises(ValueError): From 495e31413c562087b43c6bde0bf2c73b1bd13e23 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 23 Sep 2026 22:18:31 +0200 Subject: [PATCH 70/81] docs(tutorial): update Technology print output after #145 (#147) Co-authored-by: Claude Opus 5.5 (1M context) --- docs/tutorial/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index c1397b71..4638c64c 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -73,10 +73,10 @@ A `Technology` groups parameters that describe the same technology for a year an ... }, ... ) >>> print(battery) -name='lithium ion battery' detailed_technology='lithium-ion battery (utility-scale)' case='control' region='EU' year=2025 parameters={'specific investment': Parameter(magnitude=288000.0, units='EUR_2020 / megawatt_hour', carrier='hydrogen', heating_value='lower_heating_value', provenance=None, note=None, sources=SourceCollection(sources=[])), 'lifetime': Parameter(magnitude=30, units='year', carrier=None, heating_value=None, provenance=None, note=None, sources=SourceCollection(sources=[]))} +Technology('lithium ion battery', region='EU', year=2025, case='control', 2 parameters: ['specific investment', 'lifetime']) ``` -Printed in full, a `Technology` is just its identifying fields (`name`, `detailed_technology`, `case`, `region`, `year`) plus a `parameters` dictionary of named `Parameter` objects β€” nothing more is hidden inside it. +A `Technology` is just its identifying fields (`name`, `detailed_technology`, `case`, `region`, `year`) plus a `parameters` dictionary of named `Parameter` objects β€” nothing more is hidden inside it. Printing it shows a compact summary with the parameter names. ## 3. Track a technology across years From 74afbf417ecea4e1c90580a8698caa6e193d9a40 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 23 Sep 2026 22:19:23 +0200 Subject: [PATCH 71/81] fix(parameter): do not modify the original in to() (#150) to() overwrote the internal pint quantity of the original parameter with the converted one, while magnitude and units stayed unchanged. Equations read the pint quantity, so a unit conversion changed the result of later calculations; isclose() had the same side effect. Co-authored-by: Claude Opus 5.5 (1M context) --- src/technologydata/parameter.py | 6 +++--- test/test_parameter.py | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 3ed3bc8e..2433934f 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -154,10 +154,10 @@ def to(self, units: str) -> Self: "Use `to_currency` for currency conversions." ) - self._pint_quantity = self._pint_quantity.to(units) + new_quantity = self._pint_quantity.to(units) return Parameter( - magnitude=self._pint_quantity.magnitude, - units=str(self._pint_quantity.units), + magnitude=new_quantity.magnitude, + units=str(new_quantity.units), carrier=self.carrier, heating_value=self.heating_value, provenance=self.provenance, diff --git a/test/test_parameter.py b/test/test_parameter.py index 36409fa9..a5ccb379 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -650,6 +650,13 @@ def test_parameter_mul_scalar(self) -> None: assert result.magnitude == param.magnitude * factor assert result.units == param.units + def test_parameter_to_does_not_modify_original(self) -> None: + """Test that unit conversion leaves the original Parameter unchanged.""" + param = technologydata.Parameter(magnitude=250_000, units="EUR_2020/MWh") + param.to("EUR_2020/kWh") + assert param._pint_quantity.magnitude == 250_000 + assert str(param._pint_quantity.units) == "EUR_2020 / megawatt_hour" + def test_parameter_div_scalar(self) -> None: """Test division of a Parameter by a scalar.""" # Test division by an float From 6663da2f66923c162d8276715ba73b8ab2a96ea3 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Wed, 23 Sep 2026 22:26:31 +0200 Subject: [PATCH 72/81] fix(parameter): multiply parameters without carrier or heating value (#148) Multiplying two parameters without heating value raised a TypeError (None * None), and a missing carrier was stored as the string "None". Handle missing carrier and heating value like __truediv__ does. Co-authored-by: Claude Opus 5.5 (1M context) Co-authored-by: Fabrizio Finozzi --- src/technologydata/parameter.py | 11 ++++++++--- test/test_parameter.py | 12 ++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 2433934f..be1187e6 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -652,12 +652,17 @@ def __mul__(self, other: int | float | Self) -> Self: else None ) - new_heating_value = self._pint_heating_value * other._pint_heating_value + new_heating_value = ( + self._pint_heating_value * other._pint_heating_value + if self._pint_heating_value and other._pint_heating_value + else None + ) + return Parameter( magnitude=new_quantity.magnitude, units=str(new_quantity.units), - carrier=str(new_carrier), - heating_value=str(new_heating_value), + carrier=new_carrier, + heating_value=new_heating_value, provenance=(self.provenance or []) + (other.provenance or []), note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( diff --git a/test/test_parameter.py b/test/test_parameter.py index a5ccb379..df5ee84d 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -650,6 +650,18 @@ def test_parameter_mul_scalar(self) -> None: assert result.magnitude == param.magnitude * factor assert result.units == param.units + def test_parameter_mul_without_carrier_and_heating_value(self) -> None: + """Test multiplication of two Parameters that have no carrier or heating value.""" + specific_investment = technologydata.Parameter( + magnitude=250_000, units="EUR_2020/MWh" + ) + capacity = technologydata.Parameter(magnitude=100, units="MWh") + result = specific_investment * capacity + assert result.magnitude == 25_000_000 + assert result.units == "EUR_2020" + assert result.carrier is None + assert result.heating_value is None + def test_parameter_to_does_not_modify_original(self) -> None: """Test that unit conversion leaves the original Parameter unchanged.""" param = technologydata.Parameter(magnitude=250_000, units="EUR_2020/MWh") From d922f4aafa4506a3e0ca62b840d10738aeb94751 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 24 Sep 2026 15:05:26 +0200 Subject: [PATCH 73/81] feat: add integer schema version to JSON data files (#152) * code: add version * code: update commit hash * code: add schema version * code: add schema version * feat: add integer schema version to JSON data files Store `schema_version` as the first key of `technologies.json` and `sources.json`, validated on load. Files with a different version are rejected; nested source collections inside parameters omit the key. Co-Authored-By: Claude Opus 5.5 * test: pin data download test to commit with schema version Co-Authored-By: Claude Opus 5.5 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Fabrizio Finozzi Co-authored-by: Claude Opus 5.5 Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/user_guide/datapackage.md | 21 +- src/technologydata/__init__.py | 2 + src/technologydata/datapackage.py | 10 +- src/technologydata/parameter.py | 27 +- .../parsers/dea_energy_storage/parser_v10.py | 1 + .../dea_energy_storage/v10/sources.json | 2 + .../dea_energy_storage/v10/technologies.json | 815 ++++++++++++++++++ .../parsers/manual_input_usa/parser_v0134.py | 3 +- .../manual_input_usa/v0.13.4/sources.json | 2 + .../v0.13.4/technologies.json | 170 ++++ src/technologydata/schema_version.py | 48 ++ src/technologydata/source.py | 3 + src/technologydata/source_collection.py | 34 +- src/technologydata/technology_collection.py | 18 +- .../solar_photovoltaics_example/sources.json | 3 + .../technologies.json | 21 + test/test_parser_data_accessor.py | 2 +- test/test_schema_version.py | 122 +++ 18 files changed, 1286 insertions(+), 18 deletions(-) create mode 100644 src/technologydata/schema_version.py create mode 100644 test/test_schema_version.py diff --git a/docs/user_guide/datapackage.md b/docs/user_guide/datapackage.md index dda9507c..d2852118 100644 --- a/docs/user_guide/datapackage.md +++ b/docs/user_guide/datapackage.md @@ -13,7 +13,7 @@ The `DataPackage` class in `technologydata` provides a container for managing co ## Features -- **Name & Version**: Stores the dataset name (required) and version (optional) as first-class attributes. +- **Name & Version**: Stores the dataset name (required) and version (required) as first-class attributes. - **Technology Collection**: Stores a collection of `Technology` objects via the `TechnologyCollection` class. - **Source Collection**: Stores a collection of `Source` objects via the `SourceCollection` class. - **Batch Operations**: Supports batch export to JSON and CSV formats. @@ -24,7 +24,7 @@ The `DataPackage` class in `technologydata` provides a container for managing co ### Creating a DataPackage -You can create a `DataPackage` by instantiating it directly or by loading from JSON files. The `name` field is required; `version` is optional. +You can create a `DataPackage` by instantiating it directly or by loading from JSON files. Both the `name` and `version` fields are required. ```python from technologydata import DataPackage, TechnologyCollection, SourceCollection @@ -40,7 +40,7 @@ dp = DataPackage( ### Loading from JSON -To load a `DataPackage` from a folder containing `technologies.json` and (optionally) `sources.json`, pass the dataset `name`, an optional `version`, and the path to the folder: +To load a `DataPackage` from a folder containing `technologies.json` and (optionally) `sources.json`, pass the dataset `name`, `version`, and the path to the folder: ```python from technologydata import DataPackage @@ -72,6 +72,21 @@ not a bug. - For generating bibliography or citation lists - For archival/documentation purposes +#### Schema Version + +Every `technologies.json` and `sources.json` file has a `schema_version` at the beginning, which is an integer describing the layout of the file (see `technologydata.SCHEMA_VERSION`): + +```json +{ + "schema_version": 1, + "technologies": [...] +} +``` + +The schema version is independent of the package version and of the dataset `version` and incremented whenever the data schema chanes. +When loading with `from_json()` a `ValueError` is raised if the file's `schema_version` differs from the one supported by the installed `technologydata`. +In that case the file either needs to be regenerated with the current version of `technologydata` or migrated to the new data schema. + ### Exporting to JSON Export the data package to JSON files in a specified folder: diff --git a/src/technologydata/__init__.py b/src/technologydata/__init__.py index 65f68feb..d3f742b9 100644 --- a/src/technologydata/__init__.py +++ b/src/technologydata/__init__.py @@ -11,6 +11,7 @@ ) from technologydata.equations import Equation, EquationRegistry from technologydata.parameter import Parameter +from technologydata.schema_version import SCHEMA_VERSION from technologydata.source import Source from technologydata.source_collection import SourceCollection from technologydata.technology import Technology @@ -35,6 +36,7 @@ "EquationRegistry", "FileExtensionEnum", "Parameter", + "SCHEMA_VERSION", "Source", "SourceCollection", "Technology", diff --git a/src/technologydata/datapackage.py b/src/technologydata/datapackage.py index 60a60bd7..87984389 100644 --- a/src/technologydata/datapackage.py +++ b/src/technologydata/datapackage.py @@ -31,7 +31,7 @@ class DataPackage(pydantic.BaseModel): ---------- name : str The name of the dataset stored in the DataPackage object. - version : Optional[str] + version : str The version of the dataset stored in the DataPackage object. technologies : Optional[TechnologyCollection] List of Technology objects. @@ -47,11 +47,11 @@ class DataPackage(pydantic.BaseModel): ), ] version: Annotated[ - str | None, + str, pydantic.Field( description="The version of the dataset stored in the DataPackage object." ), - ] = None + ] technologies: Annotated[ TechnologyCollection | None, pydantic.Field(description="List of Technology objects."), @@ -87,7 +87,7 @@ def get_source_collection(self) -> None: @classmethod def from_json( - cls, name: str, version: str | None, path_to_folder: pathlib.Path | str + cls, name: str, version: str, path_to_folder: pathlib.Path | str ) -> Self: """ Load a DataPackage from a JSON file. @@ -96,7 +96,7 @@ def from_json( ---------- name : str The name of the dataset stored in the DataPackage object. - version: Optional[str] + version : str The version of the dataset stored in the DataPackage object. path_to_folder : pathlib.Path or str Path to the data package folder. diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index be1187e6..01901399 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -6,10 +6,16 @@ import logging import math -from typing import Annotated, Self +from typing import Annotated, Any, Self import pint -from pydantic import BaseModel, Field, PrivateAttr +from pydantic import ( + BaseModel, + Field, + PrivateAttr, + SerializerFunctionWrapHandler, + field_serializer, +) import technologydata from technologydata.source_collection import SourceCollection @@ -66,6 +72,23 @@ class Parameter(BaseModel): Field(description="List of sources for this parameter."), ] = SourceCollection(sources=[]) + @field_serializer("sources", mode="wrap") + def _serialize_sources( + self, value: SourceCollection, handler: SerializerFunctionWrapHandler + ) -> Any: + """ + Serialize sources without their ``schema_version``. + + `SourceCollection` carries a schema version for standalone ``sources.json`` + files. Nested here, it would be repeated for every parameter in + ``technologies.json``. Since the top level already carries the version, + this serializer leaves it out of the nested objects. + """ + serialized = handler(value) + if isinstance(serialized, dict): + serialized.pop("schema_version", None) + return serialized + # Private attributes for derived pint objects _pint_quantity: pint.Quantity = PrivateAttr(None) _pint_carrier: pint.Unit = PrivateAttr(None) diff --git a/src/technologydata/parsers/dea_energy_storage/parser_v10.py b/src/technologydata/parsers/dea_energy_storage/parser_v10.py index b342bada..fe4d71a7 100644 --- a/src/technologydata/parsers/dea_energy_storage/parser_v10.py +++ b/src/technologydata/parsers/dea_energy_storage/parser_v10.py @@ -434,6 +434,7 @@ def _build_technology_collection( source = Source( title="Technology Data for Energy storage (May 2025)", authors="Danish Energy Agency", + version="v10", url="https://ens.dk/media/6589/download", url_date="2025-10-08 09:24:00", ) diff --git a/src/technologydata/parsers/dea_energy_storage/v10/sources.json b/src/technologydata/parsers/dea_energy_storage/v10/sources.json index 7b84d367..f0c2e722 100644 --- a/src/technologydata/parsers/dea_energy_storage/v10/sources.json +++ b/src/technologydata/parsers/dea_energy_storage/v10/sources.json @@ -1,8 +1,10 @@ { + "schema_version": 1, "sources": [ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", diff --git a/src/technologydata/parsers/dea_energy_storage/v10/technologies.json b/src/technologydata/parsers/dea_energy_storage/v10/technologies.json index 72a8b737..041a58a8 100644 --- a/src/technologydata/parsers/dea_energy_storage/v10/technologies.json +++ b/src/technologydata/parsers/dea_energy_storage/v10/technologies.json @@ -1,4 +1,5 @@ { + "schema_version": 1, "technologies": [ { "name": "caes", @@ -21,6 +22,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -43,6 +45,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -65,6 +68,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -87,6 +91,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -109,6 +114,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -131,6 +137,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -153,6 +160,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -184,6 +192,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -206,6 +215,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -228,6 +238,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -250,6 +261,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -272,6 +284,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -294,6 +307,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -316,6 +330,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -347,6 +362,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -369,6 +385,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -391,6 +408,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -413,6 +431,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -435,6 +454,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -457,6 +477,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -479,6 +500,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -510,6 +532,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -532,6 +555,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -554,6 +578,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -576,6 +601,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -598,6 +624,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -620,6 +647,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -642,6 +670,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -673,6 +702,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -695,6 +725,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -717,6 +748,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -739,6 +771,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -761,6 +794,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -792,6 +826,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -814,6 +849,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -836,6 +872,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -858,6 +895,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -880,6 +918,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -911,6 +950,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -933,6 +973,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -955,6 +996,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -986,6 +1028,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1008,6 +1051,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1030,6 +1074,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1052,6 +1097,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1074,6 +1120,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1096,6 +1143,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1118,6 +1166,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1149,6 +1198,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1171,6 +1221,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1193,6 +1244,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1215,6 +1267,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1237,6 +1290,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1259,6 +1313,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1281,6 +1336,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1312,6 +1368,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1334,6 +1391,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1356,6 +1414,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1378,6 +1437,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1400,6 +1460,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1422,6 +1483,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1453,6 +1515,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1475,6 +1538,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1497,6 +1561,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1519,6 +1584,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1541,6 +1607,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1563,6 +1630,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1585,6 +1653,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1616,6 +1685,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1638,6 +1708,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1660,6 +1731,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1682,6 +1754,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1704,6 +1777,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1726,6 +1800,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1748,6 +1823,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1779,6 +1855,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1801,6 +1878,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1823,6 +1901,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1845,6 +1924,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1867,6 +1947,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1889,6 +1970,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1911,6 +1993,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1942,6 +2025,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1964,6 +2048,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -1986,6 +2071,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2008,6 +2094,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2030,6 +2117,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2052,6 +2140,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2074,6 +2163,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2105,6 +2195,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2127,6 +2218,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2149,6 +2241,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2171,6 +2264,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2193,6 +2287,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2215,6 +2310,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2246,6 +2342,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2268,6 +2365,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2290,6 +2388,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2312,6 +2411,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2334,6 +2434,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2356,6 +2457,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2378,6 +2480,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2409,6 +2512,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2431,6 +2535,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2453,6 +2558,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2475,6 +2581,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2497,6 +2604,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2528,6 +2636,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2550,6 +2659,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2572,6 +2682,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2594,6 +2705,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2616,6 +2728,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2647,6 +2760,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2669,6 +2783,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2691,6 +2806,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2713,6 +2829,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2735,6 +2852,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2757,6 +2875,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2779,6 +2898,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2810,6 +2930,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2832,6 +2953,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2854,6 +2976,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2885,6 +3008,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2907,6 +3031,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2929,6 +3054,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2951,6 +3077,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2973,6 +3100,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -2995,6 +3123,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3017,6 +3146,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3048,6 +3178,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3070,6 +3201,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3092,6 +3224,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3123,6 +3256,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3145,6 +3279,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3167,6 +3302,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3189,6 +3325,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3211,6 +3348,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3242,6 +3380,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3264,6 +3403,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3286,6 +3426,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3308,6 +3449,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3330,6 +3472,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3352,6 +3495,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3374,6 +3518,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3405,6 +3550,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3427,6 +3573,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3449,6 +3596,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3471,6 +3619,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3493,6 +3642,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3515,6 +3665,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3537,6 +3688,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3568,6 +3720,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3590,6 +3743,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3612,6 +3766,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3634,6 +3789,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3656,6 +3812,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3678,6 +3835,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3700,6 +3858,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3731,6 +3890,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3753,6 +3913,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3775,6 +3936,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3797,6 +3959,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3819,6 +3982,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3850,6 +4014,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3872,6 +4037,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3894,6 +4060,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3916,6 +4083,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3938,6 +4106,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3969,6 +4138,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -3991,6 +4161,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4013,6 +4184,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4035,6 +4207,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4057,6 +4230,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4079,6 +4253,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4101,6 +4276,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4132,6 +4308,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4154,6 +4331,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4176,6 +4354,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4198,6 +4377,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4220,6 +4400,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4242,6 +4423,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4264,6 +4446,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4295,6 +4478,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4317,6 +4501,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4339,6 +4524,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4361,6 +4547,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4383,6 +4570,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4405,6 +4593,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4427,6 +4616,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4458,6 +4648,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4480,6 +4671,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4502,6 +4694,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4524,6 +4717,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4546,6 +4740,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4568,6 +4763,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4590,6 +4786,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4621,6 +4818,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4643,6 +4841,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4665,6 +4864,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4687,6 +4887,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4709,6 +4910,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4731,6 +4933,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4762,6 +4965,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4784,6 +4988,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4806,6 +5011,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4828,6 +5034,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4850,6 +5057,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4872,6 +5080,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4894,6 +5103,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4925,6 +5135,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4947,6 +5158,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4969,6 +5181,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -4991,6 +5204,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5013,6 +5227,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5035,6 +5250,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5057,6 +5273,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5088,6 +5305,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5110,6 +5328,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5132,6 +5351,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5154,6 +5374,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5176,6 +5397,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5198,6 +5420,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5220,6 +5443,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5251,6 +5475,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5273,6 +5498,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5295,6 +5521,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5317,6 +5544,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5339,6 +5567,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5370,6 +5599,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5392,6 +5622,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5414,6 +5645,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5436,6 +5668,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5458,6 +5691,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5489,6 +5723,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5511,6 +5746,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5533,6 +5769,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5555,6 +5792,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5577,6 +5815,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5599,6 +5838,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5621,6 +5861,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5652,6 +5893,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5674,6 +5916,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5696,6 +5939,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5727,6 +5971,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5749,6 +5994,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5771,6 +6017,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5793,6 +6040,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5815,6 +6063,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5846,6 +6095,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5868,6 +6118,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5890,6 +6141,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5912,6 +6164,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5934,6 +6187,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5956,6 +6210,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -5978,6 +6233,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6009,6 +6265,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6031,6 +6288,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6053,6 +6311,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6084,6 +6343,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6106,6 +6366,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6128,6 +6389,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6150,6 +6412,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6172,6 +6435,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6203,6 +6467,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6225,6 +6490,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6247,6 +6513,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6269,6 +6536,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6291,6 +6559,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6313,6 +6582,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6335,6 +6605,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6366,6 +6637,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6388,6 +6660,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6410,6 +6683,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6432,6 +6706,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6454,6 +6729,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6476,6 +6752,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6498,6 +6775,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6529,6 +6807,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6551,6 +6830,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6573,6 +6853,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6595,6 +6876,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6617,6 +6899,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6639,6 +6922,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6670,6 +6954,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6692,6 +6977,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6714,6 +7000,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6736,6 +7023,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6758,6 +7046,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6789,6 +7078,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6811,6 +7101,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6833,6 +7124,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6855,6 +7147,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6877,6 +7170,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6908,6 +7202,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6930,6 +7225,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6952,6 +7248,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6974,6 +7271,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -6996,6 +7294,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7018,6 +7317,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7040,6 +7340,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7071,6 +7372,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7093,6 +7395,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7115,6 +7418,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7137,6 +7441,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7159,6 +7464,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7181,6 +7487,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7203,6 +7510,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7234,6 +7542,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7256,6 +7565,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7278,6 +7588,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7300,6 +7611,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7322,6 +7634,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7344,6 +7657,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7375,6 +7689,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7397,6 +7712,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7419,6 +7735,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7441,6 +7758,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7463,6 +7781,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7485,6 +7804,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7507,6 +7827,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7538,6 +7859,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7560,6 +7882,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7582,6 +7905,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7604,6 +7928,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7626,6 +7951,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7648,6 +7974,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7670,6 +7997,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7701,6 +8029,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7723,6 +8052,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7745,6 +8075,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7767,6 +8098,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7789,6 +8121,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7811,6 +8144,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7833,6 +8167,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7864,6 +8199,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7886,6 +8222,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7908,6 +8245,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7930,6 +8268,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7952,6 +8291,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7974,6 +8314,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -7996,6 +8337,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8027,6 +8369,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8049,6 +8392,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8071,6 +8415,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8093,6 +8438,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8115,6 +8461,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8146,6 +8493,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8168,6 +8516,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8190,6 +8539,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8212,6 +8562,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8234,6 +8585,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8256,6 +8608,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8278,6 +8631,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8309,6 +8663,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8331,6 +8686,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8353,6 +8709,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8384,6 +8741,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8406,6 +8764,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8428,6 +8787,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8450,6 +8810,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8472,6 +8833,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8503,6 +8865,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8525,6 +8888,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8547,6 +8911,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8569,6 +8934,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8591,6 +8957,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8613,6 +8980,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8635,6 +9003,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8666,6 +9035,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8688,6 +9058,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8710,6 +9081,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8732,6 +9104,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8754,6 +9127,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8776,6 +9150,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8798,6 +9173,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8829,6 +9205,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8851,6 +9228,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8873,6 +9251,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8895,6 +9274,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8917,6 +9297,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8939,6 +9320,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8961,6 +9343,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -8992,6 +9375,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9014,6 +9398,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9036,6 +9421,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9058,6 +9444,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9080,6 +9467,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9102,6 +9490,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9124,6 +9513,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9155,6 +9545,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9177,6 +9568,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9199,6 +9591,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9221,6 +9614,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9243,6 +9637,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9265,6 +9660,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9296,6 +9692,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9318,6 +9715,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9340,6 +9738,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9362,6 +9761,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9384,6 +9784,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9406,6 +9807,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9428,6 +9830,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9459,6 +9862,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9481,6 +9885,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9503,6 +9908,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9525,6 +9931,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9547,6 +9954,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9569,6 +9977,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9591,6 +10000,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9622,6 +10032,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9644,6 +10055,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9666,6 +10078,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9688,6 +10101,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9710,6 +10124,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9732,6 +10147,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9754,6 +10170,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9785,6 +10202,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9807,6 +10225,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9829,6 +10248,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9851,6 +10271,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9873,6 +10294,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9904,6 +10326,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9926,6 +10349,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9948,6 +10372,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9970,6 +10395,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -9992,6 +10418,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10023,6 +10450,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10045,6 +10473,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10067,6 +10496,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10089,6 +10519,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10111,6 +10542,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10133,6 +10565,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10155,6 +10588,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10186,6 +10620,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10208,6 +10643,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10230,6 +10666,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10261,6 +10698,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10283,6 +10721,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10305,6 +10744,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10327,6 +10767,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10349,6 +10790,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10380,6 +10822,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10402,6 +10845,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10424,6 +10868,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10446,6 +10891,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10468,6 +10914,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10490,6 +10937,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10512,6 +10960,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10543,6 +10992,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10565,6 +11015,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10587,6 +11038,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10618,6 +11070,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10640,6 +11093,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10662,6 +11116,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10684,6 +11139,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10706,6 +11162,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10737,6 +11194,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10759,6 +11217,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10781,6 +11240,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10803,6 +11263,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10825,6 +11286,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10847,6 +11309,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10878,6 +11341,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10900,6 +11364,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10922,6 +11387,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10944,6 +11410,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10966,6 +11433,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -10988,6 +11456,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11010,6 +11479,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11041,6 +11511,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11063,6 +11534,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11085,6 +11557,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11107,6 +11580,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11129,6 +11603,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11151,6 +11626,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11173,6 +11649,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11204,6 +11681,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11226,6 +11704,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11248,6 +11727,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11270,6 +11750,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11292,6 +11773,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11314,6 +11796,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11345,6 +11828,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11367,6 +11851,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11389,6 +11874,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11411,6 +11897,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11433,6 +11920,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11455,6 +11943,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11486,6 +11975,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11508,6 +11998,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11530,6 +12021,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11552,6 +12044,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11574,6 +12067,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11596,6 +12090,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11618,6 +12113,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11649,6 +12145,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11671,6 +12168,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11693,6 +12191,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11715,6 +12214,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11737,6 +12237,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11768,6 +12269,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11790,6 +12292,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11812,6 +12315,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11834,6 +12338,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11856,6 +12361,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11887,6 +12393,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11909,6 +12416,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11931,6 +12439,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11953,6 +12462,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11975,6 +12485,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -11997,6 +12508,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12019,6 +12531,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12050,6 +12563,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12072,6 +12586,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12103,6 +12618,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12125,6 +12641,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12147,6 +12664,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12169,6 +12687,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12191,6 +12710,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12213,6 +12733,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12235,6 +12756,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12266,6 +12788,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12288,6 +12811,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12310,6 +12834,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12332,6 +12857,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12354,6 +12880,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12376,6 +12903,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12398,6 +12926,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12429,6 +12958,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12451,6 +12981,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12473,6 +13004,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12495,6 +13027,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12517,6 +13050,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12548,6 +13082,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12570,6 +13105,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12592,6 +13128,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12614,6 +13151,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12636,6 +13174,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12658,6 +13197,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12680,6 +13220,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12711,6 +13252,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12733,6 +13275,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12755,6 +13298,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12777,6 +13321,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12799,6 +13344,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12830,6 +13376,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12852,6 +13399,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12874,6 +13422,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12896,6 +13445,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12918,6 +13468,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12940,6 +13491,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12962,6 +13514,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -12993,6 +13546,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13015,6 +13569,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13037,6 +13592,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13059,6 +13615,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13081,6 +13638,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13103,6 +13661,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13125,6 +13684,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13156,6 +13716,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13178,6 +13739,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13200,6 +13762,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13222,6 +13785,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13244,6 +13808,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13266,6 +13831,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13288,6 +13854,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13319,6 +13886,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13341,6 +13909,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13363,6 +13932,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13385,6 +13955,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13407,6 +13978,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13429,6 +14001,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13460,6 +14033,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13482,6 +14056,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13504,6 +14079,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13526,6 +14102,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13548,6 +14125,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13570,6 +14148,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13601,6 +14180,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13623,6 +14203,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13645,6 +14226,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13667,6 +14249,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13689,6 +14272,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13711,6 +14295,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13733,6 +14318,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13764,6 +14350,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13786,6 +14373,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13808,6 +14396,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13830,6 +14419,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13852,6 +14442,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13874,6 +14465,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13896,6 +14488,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13927,6 +14520,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13949,6 +14543,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13971,6 +14566,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -13993,6 +14589,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14015,6 +14612,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14037,6 +14635,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14059,6 +14658,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14090,6 +14690,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14112,6 +14713,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14134,6 +14736,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14156,6 +14759,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14178,6 +14782,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14209,6 +14814,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14231,6 +14837,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14253,6 +14860,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14275,6 +14883,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14297,6 +14906,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14328,6 +14938,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14350,6 +14961,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14372,6 +14984,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14394,6 +15007,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14416,6 +15030,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14438,6 +15053,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14460,6 +15076,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14491,6 +15108,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14513,6 +15131,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14544,6 +15163,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14566,6 +15186,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14588,6 +15209,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14610,6 +15232,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14632,6 +15255,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14663,6 +15287,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14685,6 +15310,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14707,6 +15333,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14729,6 +15356,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14751,6 +15379,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14773,6 +15402,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14795,6 +15425,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14826,6 +15457,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14848,6 +15480,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14870,6 +15503,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14892,6 +15526,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14914,6 +15549,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14945,6 +15581,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14967,6 +15604,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -14989,6 +15627,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15011,6 +15650,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15033,6 +15673,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15055,6 +15696,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15086,6 +15728,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15108,6 +15751,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15130,6 +15774,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15152,6 +15797,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15174,6 +15820,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15196,6 +15843,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15218,6 +15866,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15249,6 +15898,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15271,6 +15921,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15293,6 +15944,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15315,6 +15967,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15337,6 +15990,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15359,6 +16013,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15381,6 +16036,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15412,6 +16068,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15434,6 +16091,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15456,6 +16114,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15478,6 +16137,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15500,6 +16160,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15522,6 +16183,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15553,6 +16215,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15575,6 +16238,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15597,6 +16261,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15619,6 +16284,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15641,6 +16307,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15663,6 +16330,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15694,6 +16362,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15716,6 +16385,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15738,6 +16408,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15760,6 +16431,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15782,6 +16454,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15804,6 +16477,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15826,6 +16500,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15857,6 +16532,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15879,6 +16555,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15901,6 +16578,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15923,6 +16601,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15945,6 +16624,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15976,6 +16656,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -15998,6 +16679,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16020,6 +16702,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16042,6 +16725,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16064,6 +16748,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16095,6 +16780,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16117,6 +16803,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16139,6 +16826,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16161,6 +16849,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16183,6 +16872,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16205,6 +16895,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16227,6 +16918,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16258,6 +16950,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16280,6 +16973,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16311,6 +17005,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16333,6 +17028,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16355,6 +17051,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16377,6 +17074,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16399,6 +17097,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16421,6 +17120,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16443,6 +17143,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16474,6 +17175,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16496,6 +17198,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16518,6 +17221,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16540,6 +17244,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16562,6 +17267,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16584,6 +17290,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16606,6 +17313,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16637,6 +17345,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16659,6 +17368,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16681,6 +17391,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16703,6 +17414,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16725,6 +17437,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16756,6 +17469,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16778,6 +17492,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16800,6 +17515,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16822,6 +17538,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16844,6 +17561,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16866,6 +17584,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16888,6 +17607,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16919,6 +17639,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16941,6 +17662,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16963,6 +17685,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -16985,6 +17708,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17007,6 +17731,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17038,6 +17763,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17060,6 +17786,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17082,6 +17809,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17104,6 +17832,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17126,6 +17855,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17148,6 +17878,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17170,6 +17901,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17201,6 +17933,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17223,6 +17956,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17245,6 +17979,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17267,6 +18002,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17289,6 +18025,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17311,6 +18048,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17333,6 +18071,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17364,6 +18103,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17386,6 +18126,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17408,6 +18149,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17430,6 +18172,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17452,6 +18195,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17474,6 +18218,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17496,6 +18241,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17527,6 +18273,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17549,6 +18296,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17571,6 +18319,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17593,6 +18342,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17615,6 +18365,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17637,6 +18388,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17668,6 +18420,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17690,6 +18443,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17712,6 +18466,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17734,6 +18489,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17756,6 +18512,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17778,6 +18535,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17809,6 +18567,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17831,6 +18590,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17853,6 +18613,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17875,6 +18636,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17897,6 +18659,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17919,6 +18682,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17941,6 +18705,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17972,6 +18737,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -17994,6 +18760,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18016,6 +18783,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18038,6 +18806,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18060,6 +18829,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18082,6 +18852,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18104,6 +18875,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18135,6 +18907,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18157,6 +18930,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18179,6 +18953,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18201,6 +18976,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18223,6 +18999,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18245,6 +19022,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18267,6 +19045,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18298,6 +19077,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18320,6 +19100,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18342,6 +19123,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18364,6 +19146,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18386,6 +19169,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18417,6 +19201,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18439,6 +19224,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18461,6 +19247,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18483,6 +19270,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18505,6 +19293,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18536,6 +19325,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18558,6 +19348,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18580,6 +19371,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18602,6 +19394,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18624,6 +19417,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18646,6 +19440,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18668,6 +19463,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18699,6 +19495,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18721,6 +19518,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18752,6 +19550,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18774,6 +19573,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18796,6 +19596,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18818,6 +19619,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18840,6 +19642,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18871,6 +19674,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18893,6 +19697,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18915,6 +19720,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18937,6 +19743,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18959,6 +19766,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -18981,6 +19789,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -19003,6 +19812,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -19034,6 +19844,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -19056,6 +19867,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -19078,6 +19890,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -19100,6 +19913,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", @@ -19122,6 +19936,7 @@ { "title": "Technology Data for Energy storage (May 2025)", "authors": "Danish Energy Agency", + "version": "v10", "url": "https://ens.dk/media/6589/download", "url_archive": "https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download", "url_date": "2025-10-08 09:24:00", diff --git a/src/technologydata/parsers/manual_input_usa/parser_v0134.py b/src/technologydata/parsers/manual_input_usa/parser_v0134.py index 674bcb4b..03da710e 100644 --- a/src/technologydata/parsers/manual_input_usa/parser_v0134.py +++ b/src/technologydata/parsers/manual_input_usa/parser_v0134.py @@ -120,7 +120,8 @@ def _build_technology_collection( source = Source( title="Energy system technology data for the US", authors="Contributors to technology-data. Data source: manual_input_usa.csv", - url="https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + version="v0.13.4", + url="https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", ) source.ensure_in_wayback() sources = SourceCollection(sources=[source]) diff --git a/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json b/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json index 0d0db8fc..9abc1c0f 100644 --- a/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json +++ b/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json @@ -1,8 +1,10 @@ { + "schema_version": 1, "sources": [ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", diff --git a/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json b/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json index 2e87e336..63486e97 100644 --- a/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json +++ b/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json @@ -1,4 +1,5 @@ { + "schema_version": 1, "technologies": [ { "name": "Alkaline electrolyzer large size", @@ -19,6 +20,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -39,6 +41,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -68,6 +71,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -88,6 +92,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -117,6 +122,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -137,6 +143,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -166,6 +173,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -186,6 +194,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -215,6 +224,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -235,6 +245,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -264,6 +275,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -284,6 +296,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -313,6 +326,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -333,6 +347,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -362,6 +377,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -382,6 +398,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -411,6 +428,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -431,6 +449,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -460,6 +479,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -480,6 +500,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -509,6 +530,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -529,6 +551,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -558,6 +581,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -587,6 +611,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -616,6 +641,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -645,6 +671,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -665,6 +692,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -694,6 +722,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -714,6 +743,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -743,6 +773,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -763,6 +794,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -792,6 +824,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -812,6 +845,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -841,6 +875,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -861,6 +896,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -890,6 +926,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -910,6 +947,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -939,6 +977,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -959,6 +998,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -988,6 +1028,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1008,6 +1049,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1037,6 +1079,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1057,6 +1100,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1086,6 +1130,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1106,6 +1151,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1135,6 +1181,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1155,6 +1202,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1184,6 +1232,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1204,6 +1253,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1233,6 +1283,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1253,6 +1304,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1282,6 +1334,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1302,6 +1355,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1331,6 +1385,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1351,6 +1406,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1380,6 +1436,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1400,6 +1457,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1429,6 +1487,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1449,6 +1508,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1478,6 +1538,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1498,6 +1559,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1527,6 +1589,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1556,6 +1619,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1585,6 +1649,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1614,6 +1679,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1634,6 +1700,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1663,6 +1730,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1683,6 +1751,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1712,6 +1781,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1732,6 +1802,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1761,6 +1832,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1781,6 +1853,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1810,6 +1883,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1830,6 +1904,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1859,6 +1934,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1879,6 +1955,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1908,6 +1985,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1928,6 +2006,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1957,6 +2036,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -1977,6 +2057,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2006,6 +2087,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2026,6 +2108,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2055,6 +2138,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2075,6 +2159,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2104,6 +2189,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2124,6 +2210,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2153,6 +2240,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2173,6 +2261,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2202,6 +2291,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2222,6 +2312,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2251,6 +2342,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2271,6 +2363,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2300,6 +2393,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2320,6 +2414,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2349,6 +2444,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2369,6 +2465,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2398,6 +2495,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2418,6 +2516,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2447,6 +2546,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2467,6 +2567,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2496,6 +2597,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2525,6 +2627,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2554,6 +2657,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2583,6 +2687,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2603,6 +2708,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2632,6 +2738,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2652,6 +2759,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2681,6 +2789,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2701,6 +2810,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2730,6 +2840,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2750,6 +2861,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2779,6 +2891,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2799,6 +2912,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2828,6 +2942,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2848,6 +2963,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2877,6 +2993,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2897,6 +3014,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2926,6 +3044,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2955,6 +3074,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -2975,6 +3095,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3004,6 +3125,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3024,6 +3146,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3044,6 +3167,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3064,6 +3188,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3084,6 +3209,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3104,6 +3230,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3124,6 +3251,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3153,6 +3281,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3182,6 +3311,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3211,6 +3341,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3240,6 +3371,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3260,6 +3392,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3280,6 +3413,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3309,6 +3443,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3329,6 +3464,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3349,6 +3485,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3369,6 +3506,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3398,6 +3536,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3418,6 +3557,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3438,6 +3578,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3458,6 +3599,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3487,6 +3629,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3516,6 +3659,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3545,6 +3689,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3565,6 +3710,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3594,6 +3740,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3614,6 +3761,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3643,6 +3791,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3663,6 +3812,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3683,6 +3833,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3712,6 +3863,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3732,6 +3884,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3752,6 +3905,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3781,6 +3935,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3801,6 +3956,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3821,6 +3977,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3850,6 +4007,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3879,6 +4037,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3899,6 +4058,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3928,6 +4088,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3948,6 +4109,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3968,6 +4130,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -3997,6 +4160,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -4017,6 +4181,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -4037,6 +4202,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -4066,6 +4232,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -4086,6 +4253,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -4115,6 +4283,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", @@ -4135,6 +4304,7 @@ { "title": "Energy system technology data for the US", "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", "url_archive": null, "url_date": "2025-10-20", diff --git a/src/technologydata/schema_version.py b/src/technologydata/schema_version.py new file mode 100644 index 00000000..a9ef086a --- /dev/null +++ b/src/technologydata/schema_version.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Schema version of the JSON files written and read by technologydata.""" + +from typing import Any + +# Version of the data schema. Increment on any change. +# It is independent of the package version and of dataset versions. +SCHEMA_VERSION = 1 + + +def check_schema_version(data: dict[str, Any], model_name: str) -> None: + """ + Check that serialised data was written with the current schema version. + + Parameters + ---------- + data : dict[str, Any] + The deserialised JSON content, containing a ``schema_version`` key. + model_name : str + Name of the model being loaded, used in error messages. + + Raises + ------ + ValueError + If ``schema_version`` is not an integer or differs from `SCHEMA_VERSION`. + + """ + version = data["schema_version"] + if not isinstance(version, int) or isinstance(version, bool): + raise ValueError( + f"{model_name} 'schema_version' must be an integer, got {version!r}." + ) + if version > SCHEMA_VERSION: + raise ValueError( + f"{model_name} data has schema version {version}, but this version of " + f"technologydata supports up to schema version {SCHEMA_VERSION}. " + f"Upgrade technologydata to load this file." + ) + if version < SCHEMA_VERSION: + # No migrations exist yet; add them here when the schema changes. + raise ValueError( + f"{model_name} data has schema version {version}, which is no longer " + f"supported (current schema version: {SCHEMA_VERSION}). Migrate or regenerate " + f"the file with the current version of technologydata." + ) diff --git a/src/technologydata/source.py b/src/technologydata/source.py index 73dcd338..11b6777a 100644 --- a/src/technologydata/source.py +++ b/src/technologydata/source.py @@ -49,6 +49,9 @@ class Source(pydantic.BaseModel): title: Annotated[str, pydantic.Field(description="Title of the source.")] authors: Annotated[str, pydantic.Field(description="Authors of the source.")] + version: Annotated[ + str | None, pydantic.Field(description="Version of the source.") + ] = None url: Annotated[str | None, pydantic.Field(description="URL of the source.")] = None url_archive: Annotated[str | None, pydantic.Field(description="Archived URL.")] = ( None diff --git a/src/technologydata/source_collection.py b/src/technologydata/source_collection.py index ecafcb7e..351c62fb 100644 --- a/src/technologydata/source_collection.py +++ b/src/technologydata/source_collection.py @@ -9,12 +9,13 @@ import pathlib import re from collections.abc import Iterator -from typing import Annotated, Self +from typing import Annotated, Any, Self import pandas import pydantic import pydantic_core +from technologydata.schema_version import SCHEMA_VERSION, check_schema_version from technologydata.source import Source @@ -24,15 +25,28 @@ class SourceCollection(pydantic.BaseModel): Attributes ---------- + schema_version : int + Version of the data schema, see `SCHEMA_VERSION`. sources : List[Source] List of Source objects. """ + schema_version: Annotated[ + int, pydantic.Field(description="Version of the data schema.") + ] = SCHEMA_VERSION sources: Annotated[ list[Source], pydantic.Field(description="List of Source objects.") ] + @pydantic.model_validator(mode="before") + @classmethod + def _validate_schema_version(cls, data: Any) -> Any: + """Reject data with an explicit schema version other than the current one.""" + if isinstance(data, dict) and "schema_version" in data: + check_schema_version(data, cls.__name__) + return data + def __iter__(self) -> Iterator["Source"]: # type: ignore """ Return an iterator over the list of Source objects. @@ -226,20 +240,30 @@ def from_json( file_path : pathlib.Path | str The path to the JSON file to be imported. + Returns + ------- + SourceCollection + An instance of SourceCollection initialized with the data from the JSON file. + + Raises + ------ + TypeError + If `file_path` is not a pathlib.Path or str. + ValueError + If the file's ``schema_version`` differs from `SCHEMA_VERSION`. + """ if isinstance(file_path, (pathlib.Path | str)): file_path = pathlib.Path(file_path) else: raise TypeError("file_path must be a pathlib.Path or str") - json_data = None - - # Load data from file if file_path is provided + # Load data from file with open(file_path, encoding="utf-8") as jsonfile: json_data = jsonfile.read() # pydantic_core.from_json return Any. Therefore, typing.cast makes sure that - # the output is indeed a TechnologyCollection + # the output is indeed a SourceCollection return cls.model_validate( pydantic_core.from_json(json_data, allow_partial=True) ) diff --git a/src/technologydata/technology_collection.py b/src/technologydata/technology_collection.py index dfb4832b..bf20d2c4 100644 --- a/src/technologydata/technology_collection.py +++ b/src/technologydata/technology_collection.py @@ -10,13 +10,14 @@ import pathlib import re from collections.abc import Iterator, Sequence -from typing import TYPE_CHECKING, Annotated, Self, overload +from typing import TYPE_CHECKING, Annotated, Any, Self, overload import pandas import pydantic import pydantic_core from technologydata.parameter import Parameter +from technologydata.schema_version import SCHEMA_VERSION, check_schema_version from technologydata.technologies.growth_models import GrowthModel, LinearGrowth from technologydata.technology import Technology @@ -32,15 +33,28 @@ class TechnologyCollection(pydantic.BaseModel): Attributes ---------- + schema_version : int + Version of the data schema, see `SCHEMA_VERSION`. technologies : List[Technology] List of Technology objects. """ + schema_version: Annotated[ + int, pydantic.Field(description="Version of the data schema.") + ] = SCHEMA_VERSION technologies: Annotated[ list[Technology], pydantic.Field(description="List of Technology objects.") ] + @pydantic.model_validator(mode="before") + @classmethod + def _validate_schema_version(cls, data: Any) -> Any: + """Reject data with an explicit schema version other than the current one.""" + if isinstance(data, dict) and "schema_version" in data: + check_schema_version(data, cls.__name__) + return data + # Given the fact that the return type depends on the input type # We add the overload decorator to provide exact signatures # index: int --> Technology @@ -349,6 +363,8 @@ def from_json(cls, file_path: pathlib.Path | str) -> Self: ------ TypeError If `file_path` is not a pathlib.Path or str. + ValueError + If the file's ``schema_version`` differs from `SCHEMA_VERSION`. """ if isinstance(file_path, (pathlib.Path | str)): diff --git a/test/test_data/solar_photovoltaics_example/sources.json b/test/test_data/solar_photovoltaics_example/sources.json index 770b0e69..1ae7b5a0 100644 --- a/test/test_data/solar_photovoltaics_example/sources.json +++ b/test/test_data/solar_photovoltaics_example/sources.json @@ -1,8 +1,10 @@ { + "schema_version": 1, "sources": [ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -11,6 +13,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", diff --git a/test/test_data/solar_photovoltaics_example/technologies.json b/test/test_data/solar_photovoltaics_example/technologies.json index a0866666..31d0f9ea 100644 --- a/test/test_data/solar_photovoltaics_example/technologies.json +++ b/test/test_data/solar_photovoltaics_example/technologies.json @@ -1,4 +1,5 @@ { + "schema_version": 1, "technologies": [ { "name": "Solar photovoltaics", @@ -21,6 +22,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -29,6 +31,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -51,6 +54,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -59,6 +63,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -81,6 +86,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -89,6 +95,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -111,6 +118,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -119,6 +127,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -141,6 +150,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -149,6 +159,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -180,6 +191,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -188,6 +200,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -210,6 +223,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -218,6 +232,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -240,6 +255,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -248,6 +264,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -270,6 +287,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -278,6 +296,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", @@ -300,6 +319,7 @@ { "title": "atb_nrel", "authors": "NREL/ATB", + "version": "1.0", "url": "https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_archive": "https://web.archive.org/web/20250522150802/https://oedi-data-lake.s3.amazonaws.com/ATB/electricity/parquet/2024/v3.0.0/ATBe.parquet", "url_date": "2025-05-22 15:08:02", @@ -308,6 +328,7 @@ { "title": "tech_data_generation", "authors": "Danish Energy Agency", + "version": "2.0", "url": "https://ens.dk/media/3273/download", "url_archive": "http://web.archive.org/web/20250506160204/https://ens.dk/media/3273/download", "url_date": "2025-05-06 16:02:04", diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index b7ab5367..c758d8ae 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -135,7 +135,7 @@ def test_download( "https://raw.githubusercontent.com/open-energy-transition/technology-data/" ) # Use specific commit SHA instead of branch name for test stability - commit_sha = "65a6aa6454493dbb56f5d12d8efab2a3a40104d7/" + commit_sha = "83bf906f714dac438a212ed871ad078e96c83a06/" data_source = DataSourceName.MANUAL_INPUT_USA version = "v0.13.4" target_url = f"src/technologydata/parsers/{data_source}/{version}/" diff --git a/test/test_schema_version.py b/test/test_schema_version.py new file mode 100644 index 00000000..e7e25a79 --- /dev/null +++ b/test/test_schema_version.py @@ -0,0 +1,122 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Test the schema version of serialised collections.""" + +import json +import pathlib + +import pytest + +import technologydata +from technologydata import SCHEMA_VERSION, SourceCollection, TechnologyCollection + +path_cwd = pathlib.Path.cwd() +example_folder = pathlib.Path( + path_cwd, "test", "test_data", "solar_photovoltaics_example" +) + +COLLECTIONS = [ + pytest.param(TechnologyCollection, "technologies.json", id="technologies"), + pytest.param(SourceCollection, "sources.json", id="sources"), +] +COLLECTION_CLASSES: list[type[TechnologyCollection | SourceCollection]] = [ + TechnologyCollection, + SourceCollection, +] + + +def _write_with_version( + tmp_path: pathlib.Path, file_name: str, version: object +) -> pathlib.Path: + """Copy an example file, replacing its schema version.""" + data = json.loads(pathlib.Path(example_folder, file_name).read_text()) + data["schema_version"] = version + output_file = pathlib.Path(tmp_path, file_name) + output_file.write_text(json.dumps(data)) + return output_file + + +def test_schema_version_is_integer() -> None: + """Check that the schema version is a positive integer.""" + assert isinstance(SCHEMA_VERSION, int) + assert SCHEMA_VERSION >= 1 + + +@pytest.mark.parametrize("collection_cls, file_name", COLLECTIONS) # type: ignore +def test_to_json_writes_schema_version_first( + collection_cls: type[TechnologyCollection | SourceCollection], + file_name: str, + tmp_path: pathlib.Path, +) -> None: + """Check that to_json writes the schema version as the first key.""" + collection = collection_cls.from_json(pathlib.Path(example_folder, file_name)) + output_file = pathlib.Path(tmp_path, file_name) + collection.to_json(output_file) + + data = json.loads(output_file.read_text()) + assert next(iter(data)) == "schema_version" + assert data["schema_version"] == SCHEMA_VERSION + + +def test_nested_sources_have_no_schema_version(tmp_path: pathlib.Path) -> None: + """Check that only the top level of technologies.json carries the version.""" + collection = TechnologyCollection.from_json( + pathlib.Path(example_folder, "technologies.json") + ) + output_file = pathlib.Path(tmp_path, "technologies.json") + collection.to_json(output_file) + + assert output_file.read_text().count('"schema_version"') == 1 + + +def test_new_collection_has_current_schema_version() -> None: + """Check that collections created in memory get the current version.""" + assert TechnologyCollection(technologies=[]).schema_version == SCHEMA_VERSION + assert SourceCollection(sources=[]).schema_version == SCHEMA_VERSION + + +@pytest.mark.parametrize( + "version, message", + [ + (SCHEMA_VERSION + 1, "Upgrade technologydata"), + (SCHEMA_VERSION - 1, "no longer supported"), + ("1", "must be an integer"), + ], +) # type: ignore +@pytest.mark.parametrize("collection_cls, file_name", COLLECTIONS) # type: ignore +def test_from_json_rejects_other_schema_version( + collection_cls: type[TechnologyCollection | SourceCollection], + file_name: str, + version: object, + message: str, + tmp_path: pathlib.Path, +) -> None: + """Check that files with a different or invalid schema version are rejected.""" + input_file = _write_with_version(tmp_path, file_name, version) + with pytest.raises(ValueError, match=message): + collection_cls.from_json(input_file) + + +def test_model_validate_rejects_other_schema_version() -> None: + """Check that the version is also checked when validating a dict.""" + with pytest.raises(ValueError, match="Upgrade technologydata"): + SourceCollection.model_validate( + {"schema_version": SCHEMA_VERSION + 1, "sources": []} + ) + + +@pytest.mark.parametrize("collection_cls", COLLECTION_CLASSES) # type: ignore +def test_json_schema_contains_schema_version( + collection_cls: type[TechnologyCollection | SourceCollection], +) -> None: + """Check that the generated JSON schema documents the schema version.""" + schema = collection_cls.model_json_schema() + assert schema["properties"]["schema_version"]["default"] == SCHEMA_VERSION + assert schema["properties"]["schema_version"]["type"] == "integer" + + +def test_schema_version_exported() -> None: + """Check that SCHEMA_VERSION is part of the public API.""" + assert "SCHEMA_VERSION" in technologydata.__all__ From 8c9822013cc264dfa96ef8f53fd1821d00b54baf Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Thu, 24 Sep 2026 17:55:07 +0200 Subject: [PATCH 74/81] docs: Add dataset factsheets (#146) * doc: lead the parser examples with runnable code Both example pages opened with narrative before showing anything runnable, and neither showed how the raw data becomes the parsed output. Restructure both to the same shape: Quick start, pipeline diagram, worked row, parser steps, regeneration and outputs. Correct four inaccurate claims, on unit resolution, currency form, schema output paths and the worked row index. * docs: Simplify documentation for DEA storage data v10 * docs(tutorial): update Technology print output after #145 Co-Authored-By: Claude Opus 5.5 (1M context) * docs(datasets): add dataset fact sheets and template Add standardized fact sheets for dea_energy_storage and manual_input_usa, a contributor page with a checklist and fact sheet template, and run the code blocks of all fact sheets as doctests so their content tables stay in sync with the shipped data. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: replace dataset examples with Datasets section Add a top-level Datasets tab, remove the per-dataset example pages, shorten the parser user guide pages to class usage and point links to the fact sheets. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: fix undefined names in landing page example Co-Authored-By: Claude Opus 5.5 (1M context) * docs: Small tweaks * docs(datasets): rename quick start, move reproduce section, add license to citation Co-Authored-By: Claude Opus 5.5 (1M context) * docs(datasets): rename Versions section to Available versions Co-Authored-By: Claude Opus 5.5 (1M context) * docs: add dataset-factsheet agent skill Add a Claude Code skill with step-by-step instructions for writing a dataset fact sheet: where each fact comes from, how to generate the doctest outputs, checks for known limitations and for the reproduce call. The template stays in docs/contributing/adding_a_dataset.md, which now points to the skill; AGENTS.md points other agents to it. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: addendum * chore: untrack stray agent worktree and ignore .claude/worktrees/ --------- Co-authored-by: cdgaete Co-authored-by: Claude Opus 5.5 (1M context) --- .claude/skills/dataset-factsheet/SKILL.md | 97 ++++++++++ .codespell.ignore | 1 + .gitignore | 3 + AGENTS.md | 3 + README.md | 2 +- docs/contributing/adding_a_dataset.md | 192 +++++++++++++++++++ docs/contributing/instructions.md | 1 + docs/datasets/dea_energy_storage.md | 190 ++++++++++++++++++ docs/datasets/index.md | 22 +++ docs/datasets/manual_input_usa.md | 189 ++++++++++++++++++ docs/examples/dea_storage_v10.md | 112 ----------- docs/examples/manual_input_usa_v0134.md | 107 ----------- docs/index.md | 2 +- docs/tutorial/index.md | 2 +- docs/user_guide/dea_energy_storage_parser.md | 84 ++------ docs/user_guide/manual_input_usa_parser.md | 82 ++------ mkdocs.yaml | 8 +- test/test_docs.py | 7 +- 18 files changed, 754 insertions(+), 350 deletions(-) create mode 100644 .claude/skills/dataset-factsheet/SKILL.md create mode 100644 docs/contributing/adding_a_dataset.md create mode 100644 docs/datasets/dea_energy_storage.md create mode 100644 docs/datasets/index.md create mode 100644 docs/datasets/manual_input_usa.md delete mode 100644 docs/examples/dea_storage_v10.md delete mode 100644 docs/examples/manual_input_usa_v0134.md diff --git a/.claude/skills/dataset-factsheet/SKILL.md b/.claude/skills/dataset-factsheet/SKILL.md new file mode 100644 index 00000000..64f8b494 --- /dev/null +++ b/.claude/skills/dataset-factsheet/SKILL.md @@ -0,0 +1,97 @@ +--- +name: dataset-factsheet +description: Create or update the fact sheet in docs/datasets/.md for a dataset shipped with technologydata, once its parser and parsed JSON exist. Use when a data source or a new version of one is added, or when a fact sheet's doctests fail after the data changed. +--- + +# Dataset fact sheet + + + +The template, section order and writing guidelines are in `docs/contributing/adding_a_dataset.md`; read it first and follow it exactly. +`docs/datasets/dea_energy_storage.md` and `docs/datasets/manual_input_usa.md` are finished examples. +This skill covers how to find each fact and how to check it. + +Readers are experienced modellers and AI agents: tables and short bullets, no description of the parser code. +Only state what you verified in the code or the data; if something cannot be verified (e.g. the upstream license), write what is known and tell the user. + +## Inputs + +Determine, or ask the user if unclear: + +- ``: the `DataSourceName` value in `src/technologydata/data_accessor.py`. +- ``: the directory in `src/technologydata/parsers//`. +- The parser module `src/technologydata/parsers//`, the raw file in `src/technologydata/parsers/raw/`, and `sources.json` of the version. + +For a new version of an existing dataset, update the existing page instead (see the end of the checklist in `adding_a_dataset.md`). + +## Where each fact comes from + +| Section | Source | +|---|---| +| Front matter, At a glance | `sources.json` (title, authors, `url`, `url_archive`, `url_date`), the license in `REUSE.toml` and upstream, the parser (region, currency) | +| Years, cases, currency | the loaded data, see the snippet below | +| Available versions | `get_supported_versions()` of the parser, the parse options that reproduce the shipped JSON | +| Field mapping | the raw file's columns and the parser; trace one real row from raw value to parsed value | +| Naming conventions | the parser's cleaning functions (regexes, renames, case maps, unit replacements); one real example each | +| Assumptions and deviations | hard-coded values in the parser: fixed region, parameter filters, filled-in units, dropped rows, merged cases, row-level sources not kept | +| Known limitations | checks below | + +```python +from technologydata import DataAccessor + +df = DataAccessor(data_source="", version="").load().technologies.to_dataframe() +print(df[["region", "case"]].value_counts(), df["year"].min(), df["year"].max()) +``` + +Run all Python from the repository root: `DataAccessor.load()` resolves the data relative to the working directory. + +## Generate the code block outputs + +Copy the `Accessing the data` and `Contents` blocks from the template, change only `data_source` and `version`, and pick a representative technology and parameter for `Accessing the data`. +Put a placeholder line as the expected output, then run: + +```bash +uv run pytest test/test_docs.py --test-docs -k +``` + +The failure report shows `Got:` for each block; paste that output into the page and run the test again until it passes. +Do not edit the output by hand; the tests compare it with whitespace normalised only. + +## Checks for known limitations + +Look for these and quantify them where cheap ("7 of about 76 parameters"): + +- **Overwritten values**: parameters are stored in a dict per technology, so raw rows mapping to the same technology, case, year and parameter key overwrite each other. + Count duplicates in the raw data after applying the parser's name cleaning. +- **Dropped data**: raw columns not mapped, rows removed by filters or failed parsing (compare raw row count with parsed parameter count). +- **Heterogeneous units**: visible in the `Parameters` table when one parameter has several reference units. +- **Order of operations** that loses precision, such as rounding before unit scaling. +- **Provenance**: whether row-level sources are kept, whether an archived copy of the source exists. + +## Verify Reproduce + +The documented `parse()` call must reproduce the shipped files. +It overwrites them, so check the working tree is clean for that directory first: + +```bash +git status --short src/technologydata/parsers// +uv run python -c 'from technologydata import DataAccessor; DataAccessor(data_source="", version="").parse(input_file_name="", num_digits=3)' +git diff --stat src/technologydata/parsers// +git checkout -- src/technologydata/parsers// +``` + +Only a trailing-newline difference is acceptable; otherwise adjust the documented options until the output matches. +Never use `archive_source=True` here: it calls the Wayback Machine and rewrites `sources.json`. + +## Wire up and check + +1. Add the page to the `Datasets` nav in `mkdocs.yaml` and a row to the table in `docs/datasets/index.md`. +2. If a user guide page `docs/user_guide/_parser.md` exists, keep it to structure and usage and link to the fact sheet's `#reproduce`. +3. Run `uv run pytest test/test_docs.py --test-docs` and `uv run pre-commit run --all-files`. + Codespell may flag domain abbreviations; add real terms to `.codespell.ignore`. +4. Report to the user: anything not verified, and parser problems found (such as overwritten values) as candidates for issues. diff --git a/.codespell.ignore b/.codespell.ignore index a706ba1e..7afa8c2b 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -2,3 +2,4 @@ # # SPDX-License-Identifier: MIT CAF +FOM diff --git a/.gitignore b/.gitignore index 99f3d196..8bb76875 100644 --- a/.gitignore +++ b/.gitignore @@ -81,3 +81,6 @@ pydeflate_data/ # site site/ + +# Claude Code agent worktrees +.claude/worktrees/ diff --git a/AGENTS.md b/AGENTS.md index 3930922a..2dda564b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,6 +16,9 @@ maintained by a community of maintainers, based on an initiative of Open Energy - `src/technologydata/parsers/` β€” parsers for external data sources (e.g. DEA energy storage). JSON files under `parsers/*/v*/` are parser output β€” regenerate them via the parser, do not hand-edit. + Each data source has a fact sheet in `docs/datasets/.md`; when adding + or changing a data source, follow `docs/contributing/adding_a_dataset.md`; + for writing the fact sheet, follow `.claude/skills/dataset-factsheet/SKILL.md`. - `src/technologydata/data_accessor.py` β€” `DataAccessor` class for accessing external data either from the package or from a remote source. Import as `from technologydata import DataAccessor`. diff --git a/README.md b/README.md index c49ac5eb..844fc0c4 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ A Python package to manage techno-economic assumptions for energy system models. It provides a structured way to store, retrieve, and manipulate data related to various technologies used in energy systems, including unit-ful parameters, currency conversions, inflation adjustment, and temporal modelling. -The package currently includes a pre-parsed dataset from the DEA's Technology Catalogue focusing on energy storage technologies and a dedicated parser (see [DEA parser documentation](docs/examples/dea_storage_v10.md)). In the future it will include other common public data sources such NREL's ATB. +The package includes pre-parsed datasets, such as the DEA's Technology Catalogue for energy storage, together with the parsers that produce them (see the [dataset fact sheets](docs/datasets/index.md)). In the future it will include other common public data sources such as NREL's ATB. The goal of this package is to make energy system modelling easier and more efficient, automating common tasks and transformations to reduce errors and allowing for easier data exchange between models. diff --git a/docs/contributing/adding_a_dataset.md b/docs/contributing/adding_a_dataset.md new file mode 100644 index 00000000..b97fa9cb --- /dev/null +++ b/docs/contributing/adding_a_dataset.md @@ -0,0 +1,192 @@ +# Adding a dataset + + + +Every dataset shipped with `technologydata` has a fact sheet in `docs/datasets/`. +Fact sheets are short and structured information: what the data is, where it comes from, how to load and reproduce it, what it contains, and which important choices made for parsing the original data. + +## Checklist + +0. Clone the repository. +1. Add the raw file to `src/technologydata/parsers/raw/` and its license to `REUSE.toml`. +2. Add a parser under `src/technologydata/parsers//` and register `` in `DataSourceName` and `DataAccessor.parse()`. +3. Run the parser and commit the output in `src/technologydata/parsers///`. +4. Copy the template below to `docs/datasets/.md` and fill it in. +5. Add the fact sheet to the `Datasets` section in `mkdocs.yaml` and a row to `docs/datasets/index.md`. +6. Run `uv run pytest test/test_docs.py --test-docs`. + The code blocks of every fact sheet are run as doctests, and their output must match the page. + For the `Contents` section, run the code once and paste its output below it. + +When the data of a dataset changes, the doctest will fail because the output of the code will no longer match the output in the documentation; +paste the new output into the fact sheet then to resolve. +When a new version is added, add a row to the `Available versions` table, add the version to the front matter and update `Accessing the data` and `Contents` to the new version. + +!!! tip "Delegate work to AI agents" + Once the parser and the parsed data exist, writing the fact sheet can be delegated to an AI agent. + The repository contains the skill [`dataset-factsheet`](https://github.com/open-energy-transition/technology-data/blob/master/.claude/skills/dataset-factsheet/SKILL.md) with step-by-step instructions: where each fact comes from, how to generate the tables and which checks to run. + Claude Code picks it up automatically (ask e.g. "create the fact sheet for ``" or run `/dataset-factsheet`); other agents are pointed to it by `AGENTS.md`. + Always review the result created by AI; other people want to build their work on it. + Pay particular attention to the assumptions, limitations and license. + +## Guidelines + +- Keep the fact sheet concise: tables and short bullets, no step-by-step description of the parser code - this should go into the parser itself. +- The front matter is the machine-readable summary hidden in the online documentation; keep it in sync with the `At a glance` table. +- *Assumptions and deviations* are choices that make the parsed data differ from the source (filters, fixed regions, filled-in units, merged cases). +- *Known limitations* are what gets lost or can mislead (dropped or overwritten values, heterogeneous units, missing sources). +- Code blocks meant to be tested use ` ``` py ``` ` with `>>>` prompts. Code that should not be automatically tested uses ` ```python ``` `. + +## Template + +````markdown +--- +id: +name: +description: +publisher: +upstream_url: +documentation_url: +license: +versions: [] +region: +raw_file: src/technologydata/parsers/raw/ +parser: technologydata.parsers.. +--- + +# + + + + + +## At a glance + +| | | +|---|---| +| Package key | `` | +| Publisher | | +| Original data | []() ([archived]()) | +| Documentation | []() | +| License | | +| Region | `` | +| Years | – | +| Cases | | +| Currency | `` | +| Raw format | | +| Parser | [``](../api/_parser.md) | + +## Available versions + +| Version key | Upstream release | Raw file | Parse options | Status | +|---|---|---|---|---| +| `` | | `` | `num_digits=3`, … | latest | + +## Accessing the data + +``` py +>>> from technologydata import DataAccessor +>>> data = DataAccessor(data_source="", version="").load() +>>> tech = data.technologies.get(name="", case="")[0] +>>> print(tech.parameters[""]) + +``` + +See the [tutorial](../tutorial/index.md) for filtering, unit and currency conversion. + +## Contents + +### Technologies + +``` py +>>> import pandas as pd +>>> techs = DataAccessor(data_source="", version="").load().technologies +>>> def join(values): +... return ", ".join(sorted({str(v) for v in values} - {"None"})) +>>> print( +... techs.to_dataframe() +... .groupby(["name", "detailed_technology"], as_index=False) +... .agg(cases=("case", join), years=("year", join)) +... .to_markdown(index=False) +... ) + +``` + +### Parameters + +`entries` counts the technology entries (one per name, case and year) that carry the parameter. + +``` py +>>> params = pd.DataFrame( +... [(key, str(p.units), str(p.carrier)) for t in techs for key, p in t.parameters.items()], +... columns=["parameter", "units", "carriers"], +... ) +>>> print( +... params.groupby("parameter", as_index=False) +... .agg(units=("units", join), carriers=("carriers", join), entries=("units", "size")) +... .to_markdown(index=False) +... ) + +``` + +## Field mapping + +| Raw column | Example raw value | Schema field | Example parsed value | +|---|---|---|---| +| `` | `` | `Technology.name` | `` | +| β€” | β€” | `Technology.region` | `` | +| `` | | not kept | | + +## Naming conventions + +- **Technology names**: +- **Parameter keys**: <…> +- **Cases**: <…> +- **Units**: <…> + +## Assumptions and deviations from the source + +- ****: + +## Reproduce + +Run from the root of a repository checkout. +The parser overwrites the files shipped with the package. + +```python +from technologydata import DataAccessor + +DataAccessor(data_source="", version="").parse( + input_file_name="", + num_digits=3, +) +``` + +With `archive_source=False` (the default) the existing `sources.json` is reused; `archive_source=True` archives the source on the Wayback Machine and rewrites `sources.json`. + +## Known limitations + +- ****: + +## Citation + +> + +License: [](), if known + +Please also cite `technologydata`, see [Citing](../index.md#citing). + +## See also + +- [ Parser](../user_guide/_parser.md) (user guide) and [API reference](../api/_parser.md) +- [Data Accessor](../user_guide/data_accessor.md) +```` diff --git a/docs/contributing/instructions.md b/docs/contributing/instructions.md index 41fc243b..d40696b1 100644 --- a/docs/contributing/instructions.md +++ b/docs/contributing/instructions.md @@ -8,6 +8,7 @@ We enthusiastically invite anyone interested in `technologydata` to share new id - [Code contributions](#code-contributions): Implement new features, fix bugs, or improve the performance. - [Documentation contributions](#documentation-contributions): Improve the documentation by adding new sections, fixing typos, or clarifying existing content. +- [Adding a dataset](adding_a_dataset.md): Add a parser and fact sheet for a new data source. ## Where to go for help diff --git a/docs/datasets/dea_energy_storage.md b/docs/datasets/dea_energy_storage.md new file mode 100644 index 00000000..c94d08f8 --- /dev/null +++ b/docs/datasets/dea_energy_storage.md @@ -0,0 +1,190 @@ +--- +id: dea_energy_storage +name: DEA Technology Data for Energy Storage +description: Techno-economic data for electricity, heat, gas and hydrogen storage technologies from the Danish Energy Agency. +publisher: Danish Energy Agency +upstream_url: https://ens.dk/media/6589/download +documentation_url: https://ens.dk/media/6588/download +license: CC-BY-4.0 +versions: [v10] +region: EU +raw_file: src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx +parser: technologydata.parsers.dea_energy_storage.DeaEnergyStorageParser +--- + +# DEA Technology Data for Energy Storage + + + +The Danish Energy Agency (DEA) technology catalogue for energy storage: costs, efficiencies, lifetimes and capacities for electricity, heat, gas and hydrogen storage technologies, with a central estimate and an uncertainty range for projection years up to 2050. + +## At a glance + +| | | +|---|---| +| Package key | `dea_energy_storage` | +| Publisher | Danish Energy Agency | +| Original data | [Excel data sheet](https://ens.dk/media/6589/download) ([archived](https://web.archive.org/web/20251008092400/https://ens.dk/media/6589/download)) | +| Documentation | [Technology descriptions (PDF)](https://ens.dk/media/6588/download) | +| License | CC-BY-4.0, attribution to the Danish Energy Agency required | +| Region | `EU` (set by the parser) | +| Years | 2015–2050 | +| Cases | `control` (central estimate), `lower`, `upper` (uncertainty range) | +| Currency | `EUR_2020` | +| Raw format | Excel, sheet `alldata_flat` | +| Parser | [`DeaEnergyStorageParser`](../api/dea_energy_storage_parser.md) | + +## Available versions + +| Version key | Upstream release | Raw file | Parse options | Status | +|---|---|---|---|---| +| `v10` | May 2025, downloaded 2025-10-08 | `Technology_datasheet_for_energy_storage.xlsx` | `num_digits=3`, `filter_params=True` | latest | + +## Accessing the data + +``` py +>>> from technologydata import DataAccessor +>>> dea = DataAccessor(data_source="dea_energy_storage", version="v10").load() +>>> batteries = dea.technologies.get(name="lithium ion battery", case="control") +>>> [t.year for t in batteries] +[2025, 2030, 2035, 2040, 2050] +>>> print(batteries[0].parameters["specific investment"]) +288000.0 EUR_2020 / megawatt_hour +``` + +See the [tutorial](../tutorial/index.md) for filtering, unit and currency conversion. + +## Contents + +### Technologies + +``` py +>>> import pandas as pd +>>> techs = DataAccessor(data_source="dea_energy_storage", version="v10").load().technologies +>>> def join(values): +... return ", ".join(sorted({str(v) for v in values} - {"None"})) +>>> print( +... techs.to_dataframe() +... .groupby(["name", "detailed_technology"], as_index=False) +... .agg(cases=("case", join), years=("year", join)) +... .to_markdown(index=False) +... ) +| name | detailed_technology | cases | years | +|:----------------------------|:-----------------------------------------------------------------------------|:----------------------|:-----------------------------------| +| caes | compressed air energy storage | control, lower, upper | 2015, 2020, 2030, 2050 | +| flywheels | flywheels | control, lower, upper | 2018, 2020, 2030, 2050 | +| hydrogen storage - caverns | hydrogen storage - caverns | control, lower, upper | 2015, 2020, 2030, 2040, 2050 | +| hydrogen storage - lohc | hydrogen storage - lohc | control, lower, upper | 2015, 2020, 2030, 2040, 2050 | +| hydrogen storage - tanks | pressurized hydrogen gas storage system (compressor & type i tanks @ 200bar) | control, lower, upper | 2019, 2020, 2030, 2040, 2050 | +| large hot water tank | large-scale hot water tanks (steel) | control, lower, upper | 2015, 2020, 2030, 2040, 2050 | +| lithium ion battery | lithium-ion battery (utility-scale) | control, lower, upper | 2025, 2030, 2035, 2040, 2050 | +| molten salt carnot battery | carnot battery | control, lower, upper | 2025, 2030, 2035, 2040, 2050 | +| na-nicl2 battery | na-nicl2 battery | control, lower, upper | 2015, 2020, 2030, 2050 | +| na-s battery | nas battery | control, lower, upper | 2015, 2020, 2030, 2050 | +| ptes seasonal | pit thermal energy storage [ptes] | control, lower, upper | 2020, 2025, 2030, 2035, 2040, 2050 | +| pumped hydro storage | pumped hydro storage | control, lower, upper | 2015, 2020, 2030, 2050 | +| rock-based carnot battery | carnot battery | control, lower, upper | 2025, 2030, 2035, 2040, 2050 | +| small scale hot water tank | small-scale hot water tanks (steel) | control, lower, upper | 2015, 2020, 2030, 2040, 2050 | +| underground storage of gas | natural gas storage underground | control | 2020, 2030, 2040, 2050 | +| vanadium redox flow battery | vanadium redox battery (vrb) | control, lower, upper | 2020, 2025, 2030, 2035, 2040, 2050 | +``` + +### Parameters + +`entries` counts the technology entries (one per name, case and year) that carry the parameter. + +``` py +>>> params = pd.DataFrame( +... [(key, str(p.units), str(p.carrier)) for t in techs for key, p in t.parameters.items()], +... columns=["parameter", "units", "carriers"], +... ) +>>> print( +... params.groupby("parameter", as_index=False) +... .agg(units=("units", join), carriers=("carriers", join), entries=("units", "size")) +... .to_markdown(index=False) +... ) +| parameter | units | carriers | entries | +|:---------------------|:---------------------------------------------------------------------------------------------------------------------------------------|:-----------|----------:| +| capacity | liter, megawatt_hour, meter ** 3 | | 126 | +| charge efficiency | percent | | 94 | +| discharge efficiency | percent | | 98 | +| fixed o&m | EUR_2020 / gigawatt_hour / year, EUR_2020 / megawatt / year, EUR_2020 / megawatt_hour / year, EUR_2020 / year, percent, percent / year | | 127 | +| specific investment | EUR_2020 / gigawatt_hour, EUR_2020 / kilowatt, EUR_2020 / kilowatt_hour, EUR_2020 / megawatt, EUR_2020 / megawatt_hour | | 128 | +| technical lifetime | year | | 128 | +| variable o&m | EUR_2020 / megawatt_hour, percent / year | | 113 | +``` + +## Field mapping + +| Raw column | Example raw value | Schema field | Example parsed value | +|---|---|---|---| +| `ws` | `180 Lithium Ion Battery` | `Technology.name` | `lithium ion battery` | +| `Technology` | `Lithium-ion battery (Utility-scale)` | `Technology.detailed_technology` | `lithium-ion battery (utility-scale)` | +| `year` | `2025` | `Technology.year` | `2025` | +| `est` | `ctrl` | `Technology.case` | `control` | +| β€” | β€” | `Technology.region` | `EU` | +| `par` | `Specific investment [MEUR2020/MWh]` | parameter key | `specific investment` | +| `val` | `0.288` | `Parameter.magnitude` | `288000.0` | +| `unit`, `priceyear` | `MEUR/MWh`, `2020` | `Parameter.units` | `EUR_2020 / megawatt_hour` | +| `cat`, `note`, `ref` | | not kept | | + +## Naming conventions + +- **Technology names** (`ws`, `Technology`): leading three-digit code with optional letter removed, whitespace trimmed, lower-cased (`143a Rock-based Carnot battery` β†’ `rock-based carnot battery`). +- **Parameter keys** (`par`): leading hyphens and bracketed unit text removed, lower-cased (`- Charge efficiency [%]` β†’ `charge efficiency`). + `energy storage capacity for one unit` and `tank volume of example` are both renamed to `capacity`. +- **Cases** (`est`): `ctrl` β†’ `control`, `Lower`/`Upper` β†’ `lower`/`upper`. +- **Years**: first number in the cell (`Uncertainty (2050)` β†’ `2050`). +- **Units**: made readable by pint, currencies written as `EUR_2020`. + `MEUR` and `kEUR` are converted to `EUR` with the value scaled accordingly; `pct.` to `percent`, `m3` to `meter**3`, and `⁰C` to `C`. + +## Assumptions and deviations from the source + +- **Parameter subset**: only 7 parameters are shipped (`filter_params=True`). + The raw sheet has about 76 distinct parameters, e.g. round trip efficiency, cycle life, energy density, construction time; re-run the parser with `filter_params=False` to get all of them. +- **Region**: every entry is assumed to be valid for Europe (region = `EU`). The sources used by the DEA are not specific enough to only assume Danish conditions. +- **Missing units** are filled from the parameter name, e.g. `fixed o&m` without a unit becomes `percent / year`, `energy storage capacity for one unit` becomes `MWh`. +- **Non-numeric values** and values with comparators (`<1`, `>20,000`) are dropped, as are rows without technology, parameter, value or a four-digit year. +- **Sources**: every parameter cites the catalogue as a whole; the row-level `ref` and `note` columns are dropped. + +## Reproduce + +Run from the root of a repository checkout. +The parser overwrites the files shipped with the package. + +```python +from technologydata import DataAccessor + +DataAccessor(data_source="dea_energy_storage", version="v10").parse( + input_file_name="Technology_datasheet_for_energy_storage.xlsx", + num_digits=3, + filter_params=True, +) +``` + +With `archive_source=False` (the default) the existing `sources.json` is reused; `archive_source=True` re-archives the source on the Wayback Machine and rewrites `sources.json`. + +## Known limitations + +- **Duplicate parameters are overwritten.** Where a technology reports the same parameter twice in different units, only the last row in the sheet is kept: + `specific investment` of `caes` (per MWh and per kW, the kept unit varies by year) and `flywheels` (per MW kept, per MWh dropped), and `capacity` of hot water tanks and Carnot batteries (volume kept, energy dropped). +- **Heterogeneous units**: `specific investment`, `fixed o&m` and `capacity` use different reference units across technologies (per MWh, MW, kW, percent of investment, …). Check units before comparing technologies. +- **Rounding before scaling**: values are rounded to `num_digits` in the original unit, before `MEUR`/`kEUR` are converted, so `MEUR` values are precise to 1,000 EUR. + +## Citation + +> Danish Energy Agency (2025): Technology Data for Energy Storage. + +License: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/) + +Please also cite `technologydata`, see [Citing](../index.md#citing). + +## See also + +- [DEA Energy Storage Parser](../user_guide/dea_energy_storage_parser.md) (user guide) and [API reference](../api/dea_energy_storage_parser.md) +- [Data Accessor](../user_guide/data_accessor.md) diff --git a/docs/datasets/index.md b/docs/datasets/index.md new file mode 100644 index 00000000..ca0548b0 --- /dev/null +++ b/docs/datasets/index.md @@ -0,0 +1,22 @@ +# Datasets + + + +`technologydata` ships parsed versions of the following datasets. +Load any of them with `DataAccessor(data_source="", version="").load()`. + +| Dataset | Key | Versions | Region | Technologies | License | +|---|---|---|---|---|---| +| [DEA Technology Data for Energy Storage](dea_energy_storage.md) | `dea_energy_storage` | `v10` | EU | Electricity, heat, gas and hydrogen storage | CC-BY-4.0 | +| [PyPSA technology-data manual inputs for the USA](manual_input_usa.md) | `manual_input_usa` | `v0.13.4` | USA | Electrolysis, batteries, CCS power plants, Fischer-Tropsch, direct air capture | CC-BY-4.0 | + +Each fact sheet follows the same structure: at a glance, available versions, accessing the data, contents, field mapping, naming conventions, assumptions and deviations from the source, reproduce, known limitations, citation. +The front matter of each page holds the same key facts in machine-readable form. +The code blocks on every fact sheet are tested against the shipped data. + +To add a dataset, see [Adding a dataset](../contributing/adding_a_dataset.md). diff --git a/docs/datasets/manual_input_usa.md b/docs/datasets/manual_input_usa.md new file mode 100644 index 00000000..88027d6e --- /dev/null +++ b/docs/datasets/manual_input_usa.md @@ -0,0 +1,189 @@ +--- +id: manual_input_usa +name: PyPSA technology-data manual inputs for the USA +description: USA-specific costs and efficiencies for electrolysis, batteries, CCS power plants, Fischer-Tropsch and direct air capture, compiled in PyPSA technology-data. +publisher: PyPSA technology-data contributors +upstream_url: https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv +license: CC-BY-4.0 +versions: [v0.13.4] +region: USA +raw_file: src/technologydata/parsers/raw/manual_input_usa.csv +parser: technologydata.parsers.manual_input_usa.ManualInputUsaParser +--- + +# PyPSA technology-data manual inputs for the USA + + + +A hand-curated CSV from [PyPSA technology-data](https://github.com/PyPSA/technology-data) with USA-specific parameters for electrolysers, battery storage, CCS power plants, Fischer-Tropsch synthesis, direct air capture and hydrogen storage. +The values are compiled from NREL ATB 2024, ICCT IRA e-fuels assumptions, JRC-EU-TIMES and StΓΆckl et al. (2021). + +## At a glance + +| | | +|---|---| +| Package key | `manual_input_usa` | +| Publisher | PyPSA technology-data contributors | +| Original data | [`inputs/US/manual_input_usa.csv`](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv) (no archived copy) | +| Underlying sources | [NREL ATB 2024](https://atb.nrel.gov/electricity/2024/data), ICCT IRA e-fuels assumptions, [JRC-EU-TIMES](https://zenodo.org/records/3544900), [StΓΆckl et al. (2021)](https://doi.org/10.48550/arXiv.2005.03464) | +| License | CC-BY-4.0 | +| Region | `USA` (set by the parser) | +| Years | 2020–2050 | +| Cases | NREL ATB scenario and financial case, e.g. `Moderate - Market`; `not_available` for rows without a scenario | +| Currency | `USD_2022`, `USD_2023` | +| Raw format | CSV | +| Parser | [`ManualInputUsaParser`](../api/manual_input_usa_parser.md) | + +## Available versions + +| Version key | Upstream release | Raw file | Parse options | Status | +|---|---|---|---|---| +| `v0.13.4` | PyPSA technology-data v0.13.4 | `manual_input_usa.csv` | `num_digits=3` | latest | + +## Accessing the data + +``` py +>>> from technologydata import DataAccessor +>>> usa = DataAccessor(data_source="manual_input_usa", version="v0.13.4").load() +>>> fischer_tropsch = usa.technologies.get(name="Fischer-Tropsch", year=2020)[0] +>>> print(fischer_tropsch.parameters["hydrogen-input"]) +1.43 dimensionless, carrier=hydrogen / fischer_tropsch, heating_value=lower_heating_value +``` + +See the [tutorial](../tutorial/index.md) for filtering, unit and currency conversion. + +## Contents + +### Technologies + +``` py +>>> import pandas as pd +>>> techs = DataAccessor(data_source="manual_input_usa", version="v0.13.4").load().technologies +>>> def join(values): +... return ", ".join(sorted({str(v) for v in values} - {"None"})) +>>> print( +... techs.to_dataframe() +... .groupby(["name", "detailed_technology"], as_index=False) +... .agg(cases=("case", join), years=("year", join)) +... .to_markdown(index=False) +... ) +| name | detailed_technology | cases | years | +|:------------------------------------------------------|:------------------------------------------------------|:---------------------------------------------------------------------------|:-----------------------| +| Alkaline electrolyzer large size | Alkaline electrolyzer large size | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | +| Coal integrated retrofit 90%-CCS | Coal integrated retrofit 90%-CCS | not_available | 2030 | +| Coal integrated retrofit 95%-CCS | Coal integrated retrofit 95%-CCS | not_available | 2030 | +| Coal-95%-CCS | Coal-95%-CCS | not_available | 2030 | +| Coal-99%-CCS | Coal-99%-CCS | not_available | 2030 | +| Coal-IGCC | Coal-IGCC | not_available | 2020 | +| Coal-IGCC-90%-CCS | Coal-IGCC-90%-CCS | not_available | 2030 | +| Fischer-Tropsch | Fischer-Tropsch | not_available | 2020, 2030 | +| NG 2-on-1 Combined Cycle (F-Frame) | NG 2-on-1 Combined Cycle (F-Frame) | not_available | 2020, 2030 | +| NG 2-on-1 Combined Cycle (F-Frame) 95% CCS | NG 2-on-1 Combined Cycle (F-Frame) 95% CCS | not_available | 2030 | +| NG 2-on-1 Combined Cycle (F-Frame) 97% CCS | NG 2-on-1 Combined Cycle (F-Frame) 97% CCS | not_available | 2030 | +| NG Combined Cycle F-Class integrated retrofit 90%-CCS | NG Combined Cycle F-Class integrated retrofit 90%-CCS | not_available | 2030 | +| NG Combined Cycle F-Class integrated retrofit 95%-CCS | NG Combined Cycle F-Class integrated retrofit 95%-CCS | not_available | 2030 | +| PEM electrolyzer small size | PEM electrolyzer small size | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | +| SOEC | SOEC | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | +| battery inverter | battery inverter | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2022, 2030, 2040, 2050 | +| battery storage | battery storage | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2022, 2030, 2040, 2050 | +| direct air capture | direct air capture | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020 | +| hydrogen storage compressor | hydrogen storage compressor | not_available | 2020 | +| hydrogen storage tank type 1 | hydrogen storage tank type 1 | not_available | 2020 | +``` + +### Parameters + +`entries` counts the technology entries (one per name, case and year) that carry the parameter. + +``` py +>>> params = pd.DataFrame( +... [(key, str(p.units), str(p.carrier)) for t in techs for key, p in t.parameters.items()], +... columns=["parameter", "units", "carriers"], +... ) +>>> print( +... params.groupby("parameter", as_index=False) +... .agg(units=("units", join), carriers=("carriers", join), entries=("units", "size")) +... .to_markdown(index=False) +... ) +| parameter | units | carriers | entries | +|:------------------------------|:-------------------------------------------------------------------------------------------------|:------------------------------------------------------------|----------:| +| FOM | percent / year | | 57 | +| capture_rate | percent | | 9 | +| carbondioxide-input | metric_ton / megawatt_hour | carbon_dioxide / fischer_tropsch | 1 | +| compression-electricity-input | dimensionless | electricity / hydrogen | 1 | +| efficiency | percent | | 13 | +| electricity-input | dimensionless, megawatt_hour / metric_ton | electricity / carbon_dioxide, electricity / fischer_tropsch | 2 | +| heat-input | megawatt_hour / metric_ton | thermal / carbon_dioxide | 1 | +| hydrogen-input | dimensionless | hydrogen / fischer_tropsch | 1 | +| investment | USD_2022 / kilowatt, USD_2022 / kilowatt_hour, USD_2022 / megawatt, USD_2023 / hour / metric_ton | 1 / carbon_dioxide, 1 / fischer_tropsch, 1 / hydrogen | 66 | +| lifetime | year | | 17 | +| min_fill_level | percent | | 1 | +``` + +## Field mapping + +| Raw column | Example raw value | Schema field | Example parsed value | +|---|---|---|---| +| `technology` | `Fischer-Tropsch` | `Technology.name`, `Technology.detailed_technology` | `Fischer-Tropsch` | +| `year` | `2020` | `Technology.year` | `2020` | +| `scenario`, `financial_case` | `Moderate`, `Market` | `Technology.case` | `Moderate - Market` | +| β€” | β€” | `Technology.region` | `USA` | +| `parameter` | `hydrogen-input` | parameter key | `hydrogen-input` | +| `value` | `1.43` | `Parameter.magnitude` | `1.43` | +| `unit`, `currency_year` | `MWh_H2/MWh_FT`, empty | `Parameter.units`, `.carrier`, `.heating_value` | `dimensionless`, `hydrogen / fischer_tropsch`, `lower_heating_value` | +| `further_description` | `0.995 MWh_H2 per output, …` | `Parameter.note` | same text | +| `source` | `NREL, 2024 ATB Excel Workbook, …` | not kept | | + +## Naming conventions + +- **Technology names and parameter keys** are kept verbatim from PyPSA technology-data (`FOM`, `investment`, `hydrogen-input`, …), so they match PyPSA naming. +- **Cases**: `"{scenario} - {financial_case}"`, or `scenario` alone; rows without a scenario get `not_available`. +- **Units**: `per unit` is converted to `percent` (value Γ— 100); `currency_year` is folded into the currency (`USD` + `2022` β†’ `USD_2022`). +- **Compound units** such as `MWh_H2/MWh_FT` are split into unit, carrier and heating value by a fixed mapping of nine patterns in `ManualInputUSAV0134Parser._extract_units_carriers_heating_value`; carrier and heating value names are then expanded by the package registries (`H2` β†’ `hydrogen`, `LHV` β†’ `lower_heating_value`). + +## Assumptions and deviations from the source + +- **Heating value**: all compound energy units are assumed to be on a lower heating value basis; the raw file does not state it. +- **Financial case**: `R&D` and `Market` rows of the same scenario, technology and year are merged, and the case is labelled `- Market`. + In v0.13.4 both financial cases carry identical values, so no numbers are lost, only the `R&D` label. +- **Region**: every entry is labelled `USA`. + +## Reproduce + +Run from the root of a repository checkout. +The parser overwrites the files shipped with the package. + +```python +from technologydata import DataAccessor + +DataAccessor(data_source="manual_input_usa", version="v0.13.4").parse( + input_file_name="manual_input_usa.csv", + num_digits=3, +) +``` + +With `archive_source=False` (the default) the existing `sources.json` is reused; `archive_source=True` archives the source on the Wayback Machine and rewrites `sources.json`. + +## Known limitations + +- **Row-level sources are dropped.** Every parameter cites the CSV as a single source; the original reference (NREL ATB 2024, ICCT, JRC-EU-TIMES, StΓΆckl et al.) is only in the `source` column of the raw file. +- **No archived source**: `sources.json` has no Wayback Machine copy. +- **Sparse coverage**: most technologies outside the NREL ATB have a single year and no scenario (`not_available`). + +## Citation + +> PyPSA technology-data contributors: technology-data v0.13.4, `inputs/US/manual_input_usa.csv`, accessed 2025-10-20. + +License: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/); the underlying sources may have their own terms. + +Please also cite the underlying sources listed above and `technologydata`, see [Citing](../index.md#citing). + +## See also + +- [Manual Input USA Parser](../user_guide/manual_input_usa_parser.md) (user guide) and [API reference](../api/manual_input_usa_parser.md) +- [Data Accessor](../user_guide/data_accessor.md) diff --git a/docs/examples/dea_storage_v10.md b/docs/examples/dea_storage_v10.md deleted file mode 100644 index a63e237e..00000000 --- a/docs/examples/dea_storage_v10.md +++ /dev/null @@ -1,112 +0,0 @@ -# Danish Energy Agency Parser Documentation - - - -## Overview - -!!! note - This example refers specifically to **version 10** (`v10`) of the DEA Energy Storage dataset. Details such as file names, sheet structure, and parser behaviour may differ for other versions. - -The Danish Energy Agency (DEA) data parser demonstrates a full data-cleaning and transformation pipeline for converting raw tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/dea_energy_storage/`. - -## Dataset Description - -The original dataset is available from the [Danish Energy Agency website](https://ens.dk/media/6589/download). A full description of the dataset is available in the [DEA documentation](https://ens.dk/media/6588/download). The raw source file is included in the repository at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`. - -The dataset is in Excel format, and it includes, under the data sheet `alldata_flat`, a flat table of technology parameters for a range of energy storage technologies. Columns include `Technology`, `ws`, `par` (parameter name), `val` (value), `unit`, `year`, `est` (case/estimate), `priceyear`, plus metadata columns such as `cat`, `ref`, `note`. Rows are individual parameter records (parameter value + unit + context) for technologies and estimation cases. - -## Parser description - -The parser is articulated in the following steps. - -### Read the raw data - -The script reads the raw data available at `src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx`, under sheet `alldata_flat`, in a `pandas` dataframe. It uses `pandas.read_excel(..., engine=calamine, dtype=str)`. All entries are handled as strings initially. - -### Data cleaning, validation and dealing with missing/null values - -The data cleaning and validation happens with the following steps. - -Function `_drop_invalid_rows(df)` validates whether required columns are present. It drops rows with missing/null or empty critical fields (`Technology`, `par`, `val`, `year`) and keeps rows where `year` contains a 4-digit year and `val` contains numeric characters and no comparator symbols (`<`, `>`, `≀`, `β‰₯`). - -Function `_clean_technology_string()` normalizes text fields by removing leading 3-digit numeric codes, trims whitespace and lower-cases the string for consistent matching. It is applied to the columns `Technology` and `ws`. As an example, `_clean_technology_string()` converts `151b Hydrogen Storage - LOHC` to `hydrogen storage - lohc`. - -Function `_extract_year()` extracts the first sequence of digits from the `year` column and converts it to an integer. The column contains in fact entries like `Uncertainty (2050)` (str) which are converted to `2050` (int). - -Function `_clean_parameter_string()` removes leading hyphens, removes text inside square brackets (units/notes), collapses extra spaces and lower-cases the parameter name. It is applied to the `par` column. - -Function `_standardize_units()` is applied to columns `par` and `unit`. It completes missing units based on parameter name (e.g., `energy storage capacity for one unit` is mapped to the unit `MWh`) via a parameter-to-unit map. Moreover, it replaces known incorrect unit strings as `⁰C` -> `C` or `m2` to `meter**2`. The unit substitutions are driven by the [pint default units definition](https://github.com/hgrecco/pint/blob/master/pint/default_en.txt). - -Function `Commons.update_unit_with_currency_year(unit, priceyear)`, if present, appends `priceyear` information to currency units. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `EUR_2021`. - -Function `_format_val_number(value, num_decimals)` parses numeric formats including comma decimal separators and scientific notation variants (e.g., `Γ—10`) and converts them to float and rounds them to `num_decimals`. - -The parser also applies the following corrections and substitutions: - -- Convert `MEUR_2020` and `kEUR_2020`/`KEUR_2020` to `EUR_2020` and scale numeric `val` accordingly (Γ—1e6 or Γ—1e3). -- Specific unit fixes (example: `mol/s/m/MPa1/2` β†’ `mol/s/m/Pa` with value scaling). -- Certain `par` values (e.g., `energy storage capacity for one unit`, `tank volume of example`) are normalized to `capacity`. - -Function `_clean_est_string()` normalizes the `est` column by casefolding it and by replacing `ctrl` with `control`. - -Function `_filter_parameters(df, filter_flag)`, if `filter_flag` is true, keeps only an allowed set of parameters (e.g., `technical lifetime`, `fixed o&m`, `specific investment`, `variable o&m`, `charge efficiency`, `discharge efficiency`, `capacity`). Otherwise returns the full set. - -### Populate and export the source and technology collections - -Function `_build_technology_collection()`: - -- if `archive_source` is set, constructs a `Source` object for the DEA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. -- groups the cleaned DataFrame by `est`, `year`, `ws`, `Technology`. -- for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `units`, `sources`, `provenance`). -- creates a `Technology` object for each group, with `name` = `ws`, `detailed_technology` = `Technology`, `year`=`year`, `region` = `EU`, `case` = `est` and collects them into a `TechnologyCollection` object. -- writes the `TechnologyCollection` object to a `technologies.json`. -- if `export_schema` is used, schema files produced during export are moved to the sub-folder `src/technologydata/parsers/schemas`. - -## Running the parser - -### Execution instructions - -The parser is run using the `DataAccessor` class. You need to create an instance of `DataAccessor` with the desired `data_source` and `version`, and then call the `parse()` method. - -Here is an example of how to run the parser from a Python script: - -```python -from technologydata import DataAccessor - -# Create an accessor for the version to be parsed -parser_accessor = DataAccessor( - data_source="dea_energy_storage", - version="v10" -) - -# Run the parser with desired options -parser_accessor.parse( - input_file_name="Technology_datasheet_for_energy_storage.xlsx", - num_digits=3, - archive_source=True, - filter_params=True, - export_schema=True, -) -``` - -The `parse` method accepts the following arguments: - -- `input_file_name` (str): The name of the raw data file located in `src/technologydata/parsers/raw/`. -- `num_digits` (int, default 4): Number of decimals for rounding numeric values. -- `archive_source` (bool, default False): Whether to store the source on the Wayback Machine. -- `filter_params` (bool, default False): Whether to filter parameters. -- `export_schema` (bool, default False): Whether to export Pydantic schemas. - -### Outputs - -The parser generates the following outputs inside `src/technologydata/parsers/dea_energy_storage/v10/`: - -- `technologies.json` -- `sources.json` - -If `export_schema` is set to `True`, the Pydantic schema files are generated and moved to `src/technologydata/parsers/schemas/`. diff --git a/docs/examples/manual_input_usa_v0134.md b/docs/examples/manual_input_usa_v0134.md deleted file mode 100644 index d1384c88..00000000 --- a/docs/examples/manual_input_usa_v0134.md +++ /dev/null @@ -1,107 +0,0 @@ -# Manual Input USA Parser Documentation - - - -## Overview - -!!! note - This example refers specifically to **version 0.13.4** (`v0134`) of the Manual Input USA dataset. - -The Manual Input USA data parser demonstrates a data-cleaning and transformation pipeline for converting manually curated, USA-specific tabular data into the `technologydata` schema files `technologies.json` and `sources.json`. The parser is implemented in `src/technologydata/parsers/manual_input_usa/`. - -## Dataset Description - -The original dataset is a manually curated CSV file containing USA-specific technology parameters available from the [PyPSA technology-data repository](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv). The raw source file is included in the repository at `src/technologydata/parsers/raw/manual_input_usa.csv`. - -The dataset is in CSV format and includes a flat table of technology parameters for various energy technologies relevant to the USA context. Columns include `technology`, `parameter`, `year`, `value`, `unit`, `currency_year`, `source`, `further_description`, `financial_case`, and `scenario`. Rows are individual parameter records (parameter value + unit + context) for technologies with different scenarios and financial cases. - -## Parser description - -The parser is articulated in the following steps. - -### Read the raw data - -The script reads the raw data available at `src/technologydata/parsers/raw/manual_input_usa.csv` in a `pandas` dataframe. It uses `pandas.read_csv(..., dtype=str, na_values="None")`. All entries are handled as strings initially except for the `value` column which is converted to float. - -### Data cleaning, validation and dealing with missing/null values - -The data cleaning and validation happens with the following steps. - -Function `_extract_units_carriers_heating_value()` extracts standardized units, carriers, and heating values from input unit strings. This function maps complex unit representations to simplified unit, carrier, and heating value combinations using a predefined dictionary of special patterns. Examples include: - -- `USD_2022/MW_FT` β†’ unit: `USD_2022/MW`, carrier: `1/FT`, heating_value: `1/LHV` -- `MWh_H2/MWh_FT` β†’ unit: `MWh/MWh`, carrier: `H2/FT`, heating_value: `LHV` -- `MWh_el/MWh_FT` β†’ unit: `MWh/MWh`, carrier: `el/FT`, heating_value: `LHV` -- `t_CO2/MWh_FT` β†’ unit: `t/MWh`, carrier: `CO2/FT`, heating_value: `LHV` -- `USD_2022/kWh_H2` β†’ unit: `USD_2022/kWh`, carrier: `1/H2`, heating_value: `LHV` -- `USD_2023/t_CO2/h` β†’ unit: `USD_2023/t/h`, carrier: `1/CO2`, heating_value: `None` -- `MWh_el/t_CO2` β†’ unit: `MWh/t`, carrier: `el/CO2`, heating_value: `LHV` -- `MWh_th/t_CO2` β†’ unit: `MWh/t`, carrier: `thermal/CO2`, heating_value: `LHV` - -The parser also fills missing values in the `scenario` column with `"not_available"`. - -The parser applies the following unit conversions: - -- Convert `per unit` to `%` and multiply the corresponding `value` by 100.0, rounding to `num_digits` decimals. - -Function `Commons.update_unit_with_currency_year(unit, currency_year)` appends `currency_year` information to currency units when present. This is because `technologydata` follows the currency pattern `\b(?P[A-Z]{3})_(?P\d{4})\b`, as for example `USD_2022`. - -### Populate and export the source and technology collections - -Function `_build_technology_collection()`: - -- if `archive_source` is set, constructs a `Source` object for the manual input USA dataset, calls `ensure_in_wayback()` and writes `sources.json`; otherwise reads an existing `sources.json`. -- groups the cleaned DataFrame by `scenario`, `year`, `technology`. -- for each group, builds a dictionary of `Parameter` objects (each with `magnitude`, `sources`, and optionally `carrier`, `heating_value`, `units`, `note`). -- captures the `financial_case` value from rows within each group to combine with `scenario`. -- creates a `case` value by combining `scenario` and `financial_case` in the format `"{scenario} - {financial_case}"` when `financial_case` is present; otherwise uses `scenario` alone. -- creates a `Technology` object for each group, with `name` = `technology`, `detailed_technology` = `technology`, `year` = `year`, `region` = `USA`, `case` = combined case value, and collects them into a `TechnologyCollection` object. -- writes the `TechnologyCollection` object to a `technologies.json`. - -## Running the parser - -### Execution instructions - -The parser is run using the `DataAccessor` class. You need to create an instance of `DataAccessor` with the desired `data_source` and `version`, and then call the `parse()` method. - -Here is an example of how to run the parser from a Python script: - -```python -from technologydata import DataAccessor - -# Create an accessor for the version to be parsed -parser_accessor = DataAccessor( - data_source="manual_input_usa", - version="v0.13.4" -) - -# Run the parser with desired options -parser_accessor.parse( - input_file_name="manual_input_usa.csv", - num_digits=3, - archive_source=True, - export_schema=True, -) -``` - -The `parse` method accepts the following arguments: - -- `input_file_name` (str): The name of the raw data file located in `src/technologydata/parsers/raw/`. -- `num_digits` (int, default 4): Number of decimals for rounding numeric values. -- `archive_source` (bool, default False): Whether to store the source on the Wayback Machine. -- `filter_params` (bool, default False): Whether to filter parameters (not used by this parser). -- `export_schema` (bool, default False): Whether to export Pydantic schemas. - -### Outputs - -The parser generates the following outputs inside `src/technologydata/parsers/manual_input_usa/v0.13.4/`: - -- `technologies.json` -- `sources.json` - -If `export_schema` is set to `True`, the Pydantic schema files are generated and moved to `src/technologydata/parsers/schemas/`. diff --git a/docs/index.md b/docs/index.md index 2dd19191..b7698256 100644 --- a/docs/index.md +++ b/docs/index.md @@ -89,7 +89,7 @@ import technologydata # Load data provided by the DEA dea = technologydata.DataAccessor(data_source="dea_energy_storage", version="v10").load() # Load data from NREL's ATB2024 -atb = DataAccessor(data_source="manual_input_usa", version="v0.13.4", data_path=data).load() +atb = technologydata.DataAccessor(data_source="manual_input_usa", version="v0.13.4").load() # We get the data specific to battery storage and adjust the currency year # from 2022 to 2023. By default the inflation adjustment uses World Bank data diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index 4638c64c..dc811b17 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -334,7 +334,7 @@ A published catalogue only covers the years its source measured. Growth-model cu - [`Parameter`](../user_guide/parameter.md), [`TechnologyCollection`](../user_guide/technology_collection.md) and [`DataPackage`](../user_guide/datapackage.md) β€” reference for the classes built above. - [`DataAccessor`](../user_guide/data_accessor.md) β€” every option for locating and loading a catalogue. -- [Danish Energy Agency parser](../examples/dea_storage_v10.md) and [Manual Input USA parser](../examples/manual_input_usa_v0134.md) β€” how each bundled catalogue is produced from its raw file. +- [Datasets](../datasets/index.md) β€” fact sheets of the bundled catalogues: contents, assumptions and how each is produced from its raw file. - [Parameter formula system](../user_guide/equations.md) β€” every built-in formula, how to register your own, and the details of how a formula is solved. - [`Technology`](../user_guide/technology.md) and [Models](../user_guide/models.md) β€” more on `calculate_parameters()`, `check_consistency()` and the growth-model curves. - [Use cases](../user_guide/design.md) β€” the scenarios the package was designed around. diff --git a/docs/user_guide/dea_energy_storage_parser.md b/docs/user_guide/dea_energy_storage_parser.md index 7bff1f98..f71492c3 100644 --- a/docs/user_guide/dea_energy_storage_parser.md +++ b/docs/user_guide/dea_energy_storage_parser.md @@ -1,80 +1,38 @@ # DEA Energy Storage Parser -The `DeaEnergyStorageParser` is responsible for parsing data from the Danish Energy Agency (DEA) Energy Storage dataset. It is designed to handle different versions of the dataset, with a specific implementation for `v10`. +`DeaEnergyStorageParser` produces the `dea_energy_storage` dataset from the Danish Energy Agency's energy storage catalogue. +For what the dataset contains and which choices the parser makes, see the [fact sheet](../datasets/dea_energy_storage.md). -## Main Parser: `DeaEnergyStorageParser` +## Structure -The main parser, `DeaEnergyStorageParser`, acts as a dispatcher that selects the appropriate version-specific parser based on the user's request. +- `DeaEnergyStorageParser` dispatches to a version-specific parser; `get_supported_versions()` lists the versions it knows (currently `v10`). +- `DeaEnergyStorageV10Parser` reads the `alldata_flat` sheet of the Excel file, cleans names, years, parameters and units, and writes `technologies.json` and `sources.json` to `src/technologydata/parsers/dea_energy_storage/v10/`. -### Key Features +## Usage -- **Version Dispatching**: Dynamically selects the correct parser for a given dataset version (e.g., `v10`). -- **Supported Versions**: Provides a method to get a list of all supported dataset versions. - -### Usage - -While it is possible to use the parser directly, the recommended way to access the data is through the `DataAccessor` class, which provides a higher-level interface and handles the parsing process internally. See the [Data Accessor](./data_accessor.md) documentation for more details. - -If you need to use the parser directly, you can instantiate `DeaEnergyStorageParser` and call the `parse` method with the desired version and other parameters. +The recommended entry point is `DataAccessor.parse()`, see [Reproduce](../datasets/dea_energy_storage.md#reproduce). +The parser can also be called directly: ```python -from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser import pathlib -# Instantiate the main parser -dea_parser = DeaEnergyStorageParser() - -# Define parameters -version = "v10" -input_file = pathlib.Path("path/to/your/data.xlsx") -num_digits = 3 -archive_source = False -filter_params = True -export_schema = False +from technologydata.parsers.dea_energy_storage import DeaEnergyStorageParser -# Parse the data -dea_parser.parse( - version=version, - input_path=input_file, - num_digits=num_digits, - archive_source=archive_source, - filter_params=filter_params, - export_schema=export_schema, +DeaEnergyStorageParser().parse( + version="v10", + input_path=pathlib.Path("src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx"), + num_digits=3, + archive_source=False, + filter_params=True, + export_schema=False, ) ``` -## Version-Specific Parser: `DeaEnergyStorageV10Parser` - -The `DeaEnergyStorageV10Parser` is a concrete implementation that handles version 10 of the DEA Energy Storage dataset. It inherits from `ParserBase` and contains the logic for reading, cleaning, and transforming the raw data. - -### Key Responsibilities - -- **Data Loading**: Reads data from the specified Excel file (`alldata_flat` sheet). -- **Data Cleaning**: - - Removes invalid or incomplete rows. - - Cleans and standardizes technology names, parameters, and units. - - Extracts and formats year values. -- **Data Transformation**: - - Converts currency units (e.g., `MEUR_2020` to `EUR_2020`) and adjusts values accordingly. - - Standardizes parameter names (e.g., maps `energy storage capacity for one unit` to `capacity`). -- **Object Creation**: Builds a `TechnologyCollection` from the processed data. -- **Output Generation**: Exports the final `TechnologyCollection` and `SourceCollection` to JSON files. - -### `parse` Method - -The `parse` method orchestrates the entire parsing process for the `v10` dataset. - -**Parameters:** - -- `input_path` (`pathlib.Path`): Path to the raw input Excel file. -- `num_digits` (`int`): Number of significant digits for rounding numerical values. -- `archive_source` (`bool`): If `True`, archives the data source on the Wayback Machine. -- `**kwargs`: - - `filter_params` (`bool`): If `True`, filters parameters to a predefined allowed set. - - `export_schema` (`bool`): If `True`, exports the Pydantic schema for the data models. - -The processed data is saved to `technologies.json` and `sources.json` in the `src/technologydata/parsers/dea_energy_storage/v10/` directory. +- `num_digits`: number of decimals values are rounded to. +- `archive_source`: archive the source on the Wayback Machine and rewrite `sources.json`; otherwise the existing `sources.json` is reused. +- `filter_params`: keep only a predefined set of parameters. +- `export_schema`: also export the JSON schemas of the data models. ## API Reference -Please refer to the [API documentation](../api/dea_energy_storage_parser.md) for detailed information on the class methods and attributes. +See the [API documentation](../api/dea_energy_storage_parser.md). diff --git a/docs/user_guide/manual_input_usa_parser.md b/docs/user_guide/manual_input_usa_parser.md index 9fda8214..8984b917 100644 --- a/docs/user_guide/manual_input_usa_parser.md +++ b/docs/user_guide/manual_input_usa_parser.md @@ -1,78 +1,38 @@ # Manual Input USA Parser -The `ManualInputUsaParser` is responsible for parsing data from the `manual_input_usa.csv` dataset. It is designed to handle different versions of the dataset, with a specific implementation for `v0.13.4`. +`ManualInputUsaParser` produces the `manual_input_usa` dataset from the `manual_input_usa.csv` file of PyPSA technology-data. +For what the dataset contains and which choices the parser makes, see the [fact sheet](../datasets/manual_input_usa.md). -## Main Parser: `ManualInputUsaParser` +## Structure -The main parser, `ManualInputUsaParser`, acts as a dispatcher that selects the appropriate version-specific parser based on the user's request. +- `ManualInputUsaParser` dispatches to a version-specific parser; `get_supported_versions()` lists the versions it knows (currently `v0.13.4`). +- `ManualInputUSAV0134Parser` reads the CSV, splits compound units into unit, carrier and heating value, and writes `technologies.json` and `sources.json` to `src/technologydata/parsers/manual_input_usa/v0.13.4/`. -### Key Features +## Usage -- **Version Dispatching**: Dynamically selects the correct parser for a given dataset version (e.g., `v0.13.4`). -- **Supported Versions**: Provides a method to get a list of all supported dataset versions. - -### Usage - -While it is possible to use the parser directly, the recommended way to access the data is through the `DataAccessor` class, which provides a higher-level interface and handles the parsing process internally. See the [Data Accessor](./data_accessor.md) documentation for more details. - -If you need to use the parser directly, you can instantiate `ManualInputUsaParser` and call the `parse` method with the desired version and other parameters. +The recommended entry point is `DataAccessor.parse()`, see [Reproduce](../datasets/manual_input_usa.md#reproduce). +The parser can also be called directly: ```python -from technologydata.parsers.manual_input_usa import ManualInputUsaParser import pathlib -# Instantiate the main parser -manual_input_parser = ManualInputUsaParser() - -# Define parameters -version = "v0.13.4" -input_file = pathlib.Path("path/to/your/manual_input_usa.csv") -num_digits = 3 -archive_source = False -filter_params = True -export_schema = False +from technologydata.parsers.manual_input_usa import ManualInputUsaParser -# Parse the data -manual_input_parser.parse( - version=version, - input_path=input_file, - num_digits=num_digits, - archive_source=archive_source, - filter_params=filter_params, - export_schema=export_schema, +ManualInputUsaParser().parse( + version="v0.13.4", + input_path=pathlib.Path("src/technologydata/parsers/raw/manual_input_usa.csv"), + num_digits=3, + archive_source=False, + filter_params=False, + export_schema=False, ) ``` -## Version-Specific Parser: `ManualInputUSAV0134Parser` - -The `ManualInputUSAV0134Parser` is a concrete implementation that handles version `v0.13.4` of the `manual_input_usa.csv` dataset. It inherits from `ParserBase` and contains the logic for reading, cleaning, and transforming the raw data. - -### Key Responsibilities - -- **Data Loading**: Reads data from the specified CSV file. -- **Data Cleaning**: - - Handles missing values in the `scenario` column. - - Converts `per unit` to `%` and adjusts the corresponding values. - - Includes `currency_year` in the `unit` column where applicable. -- **Data Transformation**: - - Extracts standardized units, carriers, and heating values from complex unit strings using the `_extract_units_carriers_heating_value` method. -- **Object Creation**: Builds a `TechnologyCollection` from the processed data using the `_build_technology_collection` method. -- **Output Generation**: Exports the final `TechnologyCollection` and `SourceCollection` to JSON files. - -### `parse` Method - -The `parse` method orchestrates the entire parsing process for the `v0.13.4` dataset. - -**Parameters:** - -- `input_path` (`pathlib.Path`): Path to the raw input CSV file. -- `num_digits` (`int`): Number of significant digits for rounding numerical values. -- `archive_source` (`bool`): If `True`, archives the data source on the Wayback Machine. -- `**kwargs`: - - `export_schema` (`bool`): If `True`, exports the Pydantic schema for the data models. - -The processed data is saved to `technologies.json` and `sources.json` in the `src/technologydata/parsers/manual_input_usa/v0.13.4/` directory. +- `num_digits`: number of decimals values are rounded to. +- `archive_source`: archive the source on the Wayback Machine and rewrite `sources.json`; otherwise the existing `sources.json` is reused. +- `filter_params`: required by the dispatcher, ignored by this parser. +- `export_schema`: also export the JSON schemas of the data models. ## API Reference -Please refer to the [API documentation](../api/manual_input_usa_parser.md) for detailed information on the class methods and attributes. +See the [API documentation](../api/manual_input_usa_parser.md). diff --git a/mkdocs.yaml b/mkdocs.yaml index 0b5e0383..2aa59039 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -28,9 +28,10 @@ nav: - Data Accessor: user_guide/data_accessor.md - Use Cases: user_guide/design.md -- Examples: - - Danish Energy Agency Parser (version 10): examples/dea_storage_v10.md - - Manual Input USA Parser (version 0.13.4): examples/manual_input_usa_v0134.md +- Datasets: + - datasets/index.md + - DEA Energy Storage: datasets/dea_energy_storage.md + - Manual Input USA: datasets/manual_input_usa.md - API Reference: - Data Package: api/datapackage.md @@ -57,6 +58,7 @@ nav: - Instructions: contributing/instructions.md - Code of Conduct: contributing/CODE_OF_CONDUCT.md - Contributors: contributing/contributors.md + - Adding a Dataset: contributing/adding_a_dataset.md - API Improvement Proposals: contributing/api_improvement_proposals.md # Theme settings diff --git a/test/test_docs.py b/test/test_docs.py index c7db712a..2a588369 100644 --- a/test/test_docs.py +++ b/test/test_docs.py @@ -19,7 +19,12 @@ import pytest -DOCS = [Path(__file__).parent.parent / "docs" / "tutorial" / "index.md"] +DOCS_DIR = Path(__file__).parent.parent / "docs" + +# Every dataset fact sheet is tested, so their tables stay in sync with the data. +DOCS = [DOCS_DIR / "tutorial" / "index.md"] + sorted( + p for p in (DOCS_DIR / "datasets").glob("*.md") if p.name != "index.md" +) @pytest.mark.parametrize("fpath", DOCS, ids=str) # type: ignore From 9c32118ac98a426cb61252cc6577cacd8183f894 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Sep 2026 18:08:50 +0200 Subject: [PATCH 75/81] build(deps): bump the github-actions group with 3 updates (#153) Bumps the github-actions group with 3 updates: [github/codeql-action/init](https://github.com/github/codeql-action), [github/codeql-action/analyze](https://github.com/github/codeql-action) and [github/codeql-action/upload-sarif](https://github.com/github/codeql-action). Updates `github/codeql-action/init` from 4.38.0 to 4.38.1 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...1c5b675653bb5c22dbe9b12b556ec555138e09fd) Updates `github/codeql-action/analyze` from 4.38.0 to 4.38.1 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...1c5b675653bb5c22dbe9b12b556ec555138e09fd) Updates `github/codeql-action/upload-sarif` from 4.38.0 to 4.38.1 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...1c5b675653bb5c22dbe9b12b556ec555138e09fd) --- updated-dependencies: - dependency-name: github/codeql-action/init dependency-version: 4.38.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action/analyze dependency-version: 4.38.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.38.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 4 ++-- .github/workflows/scorecard.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 573b750f..d40ac0f0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -39,12 +39,12 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 + uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 + uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 698d3cc3..a1647a46 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -55,6 +55,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 + uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 with: sarif_file: results.sarif From 3dc363eda705ec8cd64bf737dd69f535111f0a54 Mon Sep 17 00:00:00 2001 From: Johannes HAMPP <42553970+euronion@users.noreply.github.com> Date: Fri, 25 Sep 2026 18:07:35 +0200 Subject: [PATCH 76/81] code: Track provenance for parameter operations (#155) * code: Track provenance for parameter operations * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../contributing/api_improvement_proposals.md | 15 +- docs/user_guide/parameter.md | 19 ++- src/technologydata/parameter.py | 128 +++++++++++++-- test/test_parameter.py | 149 +++++++++++++++++- test/test_technology.py | 9 +- 5 files changed, 286 insertions(+), 34 deletions(-) diff --git a/docs/contributing/api_improvement_proposals.md b/docs/contributing/api_improvement_proposals.md index f2f1d94c..9e15b244 100644 --- a/docs/contributing/api_improvement_proposals.md +++ b/docs/contributing/api_improvement_proposals.md @@ -69,18 +69,7 @@ parameter) covers the use case without overloading `__getitem__` semantics. - `add_provenance(entry: str) -> Self`: clean, supported way to append one history entry now that `provenance` is a `list[str]`. -## 4. Provenance recording in transformations (behavior change) - -`to()`, `to_currency()`, and `change_heating_value()` currently copy `provenance` unchanged -(see the `TODO` in `change_heating_value`). They should append a human-readable history entry, -e.g. `"Converted from USD_2020/kW to EUR_2020/kW."`, completing the provenance-history design -introduced with `provenance: list[str]`. - -Note this is an observable behavior change: converted parameters gain provenance entries, and -`test/test_parameter.py` asserts `converted.provenance == param.provenance` after -`to_currency`, which would need updating. - -## 5. Collection and technology conveniences +## 4. Collection and technology conveniences - `TechnologyCollection.append(tech)` and `__add__(other) -> Self`: merge primitive for combining harmonized datasets (design.md UC-002); currently requires @@ -92,7 +81,7 @@ Note this is an observable behavior change: converted parameters gain provenance nested parameters, which is unreadable in a REPL. A summary (name/region/year/case + parameter names) matches the `__str__` methods recently added to `Parameter` and `Equation`. -## 6. Deferred code simplifications (behavior-preserving) +## 5. Deferred code simplifications (behavior-preserving) Cleanups identified in review but scoped out of the equations-focused simplification pass: diff --git a/docs/user_guide/parameter.md b/docs/user_guide/parameter.md index d48561f3..e053b01d 100644 --- a/docs/user_guide/parameter.md +++ b/docs/user_guide/parameter.md @@ -161,13 +161,30 @@ param_mixed_hhv = param_mixed.change_heating_value("HHV") 0.13 kWh/kg higher_heating_value ``` +### Provenance Tracking + +Every transformation on a `Parameter` returns a new `Parameter` object with the transformation tracked in the `provenance` field. +This history keeps track in a human-readable way. +Operations that do not change the parameter, e.g. converting to the units it already has, add no entry. + +```python +param = Parameter(magnitude=1000, units="USD_2020/kW", provenance=["Directly extracted from literature"]) +converted = param.to("USD_2020/MW") * 2 +>>> print("\n".join(converted.provenance)) +Directly extracted from literature +Converted units from 'USD_2020 / kilowatt' to 'USD_2020 / megawatt': 1000 USD_2020 / kilowatt -> 1000000.0 USD_2020 / megawatt +Multiplied by 2: 1000000.0 -> 2000000.0 +``` + +For arithmetic between two parameters, the histories of both parameters are concatenated (left parameter first), followed by an entry describing the operation, e.g. `Calculated as (3 kilowatt) + (1 kilowatt) = 4 kilowatt`. + ## API Reference Please refer to the [API documentation](../api/parameter.md) for detailed information on the `Parameter` class methods and attributes. ## Notes -- **Provenance/Note/Sources in Arithmetic**: When performing arithmetic operations, `provenance` lists are concatenated (preserving both operands' full history); merging of `note` and `sources` is not yet implemented (see `TODO` comments in the code). +- **Note/Sources in Arithmetic**: When performing arithmetic operations, `provenance` is tracked as described above; proper merging of `note` and `sources` is not yet implemented (see `TODO` comments in the code). - **Unit Conversion**: The `.to()` method does not support currency conversion; use `.to_currency()` for that. - **Partial Unit Compatibility**: Only certain combinations of units, carriers, and heating values are supported for arithmetic operations. - **No Uncertainty Handling**: There is currently no support for uncertainty or error propagation. diff --git a/src/technologydata/parameter.py b/src/technologydata/parameter.py index 01901399..0883db42 100644 --- a/src/technologydata/parameter.py +++ b/src/technologydata/parameter.py @@ -164,8 +164,59 @@ def __str__(self) -> str: parts.append(f"heating_value={self.heating_value}") return ", ".join(parts) + def _extend_provenance(self, entry: str) -> list[str]: + """ + Return a copy of the provenance history with a new entry appended. + + Parameters + ---------- + entry : str + Concise description of the transformation applied. + + Returns + ------- + list[str] + The existing provenance entries followed by `entry`. + + """ + return [*(self.provenance or []), entry] + + def _merge_provenance(self, other: Self, entry: str) -> list[str]: + """ + Return the combined provenance history of two operands with a new entry appended. + + Parameters + ---------- + other : Parameter + The second operand of the operation. + entry : str + Human-readable description of the operation applied. + + Returns + ------- + list[str] + The provenance entries of `self`, then of `other`, followed by `entry`. + + """ + return [*(self.provenance or []), *(other.provenance or []), entry] + def to(self, units: str) -> Self: - """Convert the parameter's quantity to new units.""" + """ + Convert the parameter's quantity to new units. + + A provenance entry recording the conversion is appended, unless the units are unchanged. + + Parameters + ---------- + units : str + The target units, which must not change the currency. + + Returns + ------- + Parameter + A new Parameter object in the target units. + + """ self._update_pint_attributes() # Do not allow for currency conversion here, as it requires additional information @@ -178,12 +229,20 @@ def to(self, units: str) -> Self: ) new_quantity = self._pint_quantity.to(units) + from_units = str(self._pint_quantity.units) + to_units = str(new_quantity.units) + provenance = self.provenance + if to_units != from_units: + provenance = self._extend_provenance( + f"Converted units from '{from_units}' to '{to_units}': " + f"{self._pint_quantity} -> {new_quantity}" + ) return Parameter( magnitude=new_quantity.magnitude, - units=str(new_quantity.units), + units=to_units, carrier=self.carrier, heating_value=self.heating_value, - provenance=self.provenance, + provenance=provenance, note=self.note, sources=self.sources, ) # type: ignore @@ -262,6 +321,7 @@ def to_currency( ------- Parameter A new Parameter object with the converted currency. + Records a provenance entry for the conversion. Examples -------- @@ -333,12 +393,20 @@ def to_currency( # Actual conversion using pint quantity = self._pint_quantity.to(to_units, context) + provenance = self.provenance + if str(quantity.units) != str(from_units): + provenance = self._extend_provenance( + f"Converted currency from '{from_units}' to '{quantity.units}' " + f"using inflation data for country '{country}' from source '{source}': " + f"{self._pint_quantity} -> {quantity}" + ) + return Parameter( magnitude=quantity.magnitude, units=str(quantity.units), carrier=self.carrier, heating_value=self.heating_value, - provenance=self.provenance, + provenance=provenance, note=self.note, sources=self.sources, ) # type: ignore @@ -359,6 +427,7 @@ def change_heating_value(self, to_heating_value: str) -> Self: ------- Parameter A new Parameter object with the converted heating value. + Records a provenance entry for the conversion. Raises ------ @@ -444,7 +513,12 @@ def change_heating_value(self, to_heating_value: str) -> Self: units=self.units, carrier=self.carrier, heating_value=to_heating_value, - provenance=self.provenance, # TODO implement for this function + provenance=self._extend_provenance( + f"Converted heating value from '{self.heating_value}' to " + f"'{to_heating_value_pint}' for carrier '{self.carrier}' " + f"using factor {multiplier:g}: " + f"{self.magnitude} -> {self.magnitude * multiplier}" + ), note=self.note, sources=self.sources, ) # type: ignore @@ -502,17 +576,21 @@ def __add__(self, other: Self) -> Self: ----- This method checks for parameter compatibility before performing the addition. The resulting Parameter retains the carrier, heating value, and combines provenance, - notes, and sources from both operands. + notes, and sources from both operands. Preserves the provenance of both parameters + and adds a provenance entry for the operation. """ self._check_parameter_compatibility(other) new_quantity = self._pint_quantity + other._pint_quantity + provenance = self._merge_provenance( + other, f"Calculated as ({self}) + ({other}) = {new_quantity}" + ) return Parameter( magnitude=new_quantity.magnitude, units=new_quantity.units, carrier=self.carrier, heating_value=self.heating_value, - provenance=(self.provenance or []) + (other.provenance or []), + provenance=provenance, note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -537,16 +615,20 @@ def __sub__(self, other: Self) -> Self: ----- This method checks for parameter compatibility before performing the subtraction. The resulting Parameter retains the carrier, heating value, and combines provenance, notes, and sources. + Preserves the provenance of both parameters and adds a provenance entry for the operation. """ self._check_parameter_compatibility(other) new_quantity = self._pint_quantity - other._pint_quantity + provenance = self._merge_provenance( + other, f"Calculated as ({self}) - ({other}) = {new_quantity}" + ) return Parameter( magnitude=new_quantity.magnitude, units=str(new_quantity.units), carrier=self.carrier, heating_value=self.heating_value, - provenance=(self.provenance or []) + (other.provenance or []), + provenance=provenance, note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -571,6 +653,8 @@ def __truediv__(self, other: int | float | Self) -> Self: ------ ValueError If the heating values of the two parameters are different. + Preserves the provenance of both parameters and adds a provenance + entry for the operation. Notes ----- @@ -584,7 +668,9 @@ def __truediv__(self, other: int | float | Self) -> Self: units=self.units, carrier=self.carrier, heating_value=self.heating_value, - provenance=self.provenance, + provenance=self._extend_provenance( + f"Divided by {other}: {self.magnitude} -> {self.magnitude / other}" + ), note=self.note, sources=self.sources, ) # type: ignore @@ -598,6 +684,9 @@ def __truediv__(self, other: int | float | Self) -> Self: ) new_quantity = self._pint_quantity / other._pint_quantity + provenance = self._merge_provenance( + other, f"Calculated as ({self}) / ({other}) = {new_quantity}" + ) new_carrier = ( self._pint_carrier / other._pint_carrier if self._pint_carrier and other._pint_carrier @@ -614,7 +703,7 @@ def __truediv__(self, other: int | float | Self) -> Self: units=str(new_quantity.units), carrier=new_carrier, heating_value=new_heating_value, - provenance=(self.provenance or []) + (other.provenance or []), + provenance=provenance, note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -645,7 +734,9 @@ def __mul__(self, other: int | float | Self) -> Self: - Multiplication is only performed if the heating values are compatible. - The method multiplies the underlying quantities and carriers (if present). - The heating value of the resulting parameter is the product of the input heating values. - - Provenance, notes, and sources are combined from both parameters. + - Provenance, notes, and sources are combined from both parameters, and a + provenance entry describing the multiplication is appended. + - Multiplying by a scalar appends a provenance entry recording the factor. - Compatibility checks beyond heating values are not performed. """ @@ -655,7 +746,9 @@ def __mul__(self, other: int | float | Self) -> Self: units=self.units, carrier=self.carrier, heating_value=self.heating_value, - provenance=self.provenance, + provenance=self._extend_provenance( + f"Multiplied by {other}: {self.magnitude} -> {self.magnitude * other}" + ), note=self.note, sources=self.sources, ) # type: ignore @@ -669,6 +762,9 @@ def __mul__(self, other: int | float | Self) -> Self: ) new_quantity = self._pint_quantity * other._pint_quantity + provenance = self._merge_provenance( + other, f"Calculated as ({self}) * ({other}) = {new_quantity}" + ) new_carrier = ( self._pint_carrier * other._pint_carrier if self._pint_carrier and other._pint_carrier @@ -686,7 +782,7 @@ def __mul__(self, other: int | float | Self) -> Self: units=str(new_quantity.units), carrier=new_carrier, heating_value=new_heating_value, - provenance=(self.provenance or []) + (other.provenance or []), + provenance=provenance, note=(self.note or "") + (other.note or ""), # TODO make nicer sources=SourceCollection( sources=(self.sources.sources + other.sources.sources) @@ -742,6 +838,7 @@ def __pow__(self, exponent: float | int) -> Self: ----- This method updates the internal pint attributes before applying the power operation. If the parameter has a carrier, it is also raised to the specified power. + A provenance entry recording the exponent is appended. """ self._update_pint_attributes() @@ -752,7 +849,10 @@ def __pow__(self, exponent: float | int) -> Self: units=str(new_quantity.units), carrier=self._pint_carrier**exponent if self._pint_carrier else None, heating_value=self.heating_value, - provenance=self.provenance, + provenance=self._extend_provenance( + f"Raised to the power of {exponent}: " + f"{self._pint_quantity} -> {new_quantity}" + ), note=self.note, sources=self.sources, ) # type: ignore diff --git a/test/test_parameter.py b/test/test_parameter.py index df5ee84d..1ad4260c 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -5,6 +5,7 @@ """Test the initialization and methods of the Parameter class.""" import pathlib +from collections.abc import Callable import numpy as np import pandas as pd @@ -320,8 +321,15 @@ def test_parameter_unchanged_other_attributes(self) -> None: # Check that other attributes remain unchanged assert converted.carrier == param.carrier assert converted.heating_value == param.heating_value - assert converted.provenance == param.provenance assert converted.note == param.note + # Provenance history is kept and the conversion is appended + assert converted.provenance is not None + assert converted.provenance[:-1] == param.provenance + assert converted.provenance[-1].startswith( + "Converted currency from 'USD_2020 / kilowatt' to 'EUR_2023 / kilowatt' " + "using inflation data for country 'DEU' from source 'worldbank'" + ) + assert param.provenance == ["literature"] def test_parameter_heating_value_compatibility(self) -> None: """Test that we do not permit operations on mixed heating values.""" @@ -742,7 +750,10 @@ def test_parameter_pow_preserves_metadata(self) -> None: result = param**2 assert result.carrier == f"{param.carrier} ** 2" assert result.heating_value == param.heating_value - assert result.provenance == param.provenance + assert result.provenance == [ + "test", + "Raised to the power of 2: 3 kilogram -> 9 kilogram ** 2", + ] assert result.note == param.note def test_change_heating_value_h2_lhv_to_hhv(self) -> None: @@ -894,3 +905,137 @@ def test_to_currency(self, folder_id: str) -> None: reference_param.magnitude, rel=1e-2 ) assert output_param.units == reference_param.units + + +class TestParameterProvenance: + """Test that transformations of a Parameter append to its provenance history.""" + + def test_to_records_unit_conversion(self) -> None: + """Test that `to` appends a unit conversion entry.""" + param = technologydata.Parameter( + magnitude=1000, units="USD_2020/kW", provenance=["literature"] + ) + converted = param.to("USD_2020/MW") + assert converted.provenance == [ + "literature", + "Converted units from 'USD_2020 / kilowatt' to 'USD_2020 / megawatt': " + "1000 USD_2020 / kilowatt -> 1000000.0 USD_2020 / megawatt", + ] + assert param.provenance == ["literature"] + + def test_to_same_units_records_nothing(self) -> None: + """Test that a no-op unit conversion does not add an entry.""" + param = technologydata.Parameter( + magnitude=1, units="kW", provenance=["literature"] + ) + assert param.to("kilowatt").provenance == ["literature"] + + def test_to_without_prior_provenance(self) -> None: + """Test that a conversion entry is recorded even without prior history.""" + converted = technologydata.Parameter(magnitude=1, units="kW").to("W") + assert converted.provenance is not None + assert len(converted.provenance) == 1 + assert converted.provenance[0].startswith("Converted units from 'kilowatt'") + + def test_to_currency_same_currency_records_nothing(self) -> None: + """Test that a no-op currency conversion does not add an entry.""" + param = technologydata.Parameter( + magnitude=1, units="USD_2020/kW", provenance=["literature"] + ) + assert param.to_currency("USD_2020", "USA").provenance == ["literature"] + + def test_to_currency_records_country_and_source(self) -> None: + """Test that the currency conversion entry names country and data source.""" + param = technologydata.Parameter(magnitude=1, units="USD_2020/kW") + converted = param.to_currency("EUR_2020", "DEU", source="imf") + assert converted.provenance is not None + assert len(converted.provenance) == 1 + assert "country 'DEU'" in converted.provenance[0] + assert "source 'imf'" in converted.provenance[0] + + def test_change_heating_value_records_conversion(self) -> None: + """Test that `change_heating_value` appends an entry with the factor used.""" + param = technologydata.Parameter( + magnitude=1, + units="kWh", + carrier="H2", + heating_value="LHV", + provenance=["literature"], + ) + converted = param.change_heating_value("HHV") + assert converted.provenance is not None + assert converted.provenance[0] == "literature" + assert converted.provenance[1].startswith( + "Converted heating value from 'lower_heating_value' to " + "'higher_heating_value' for carrier 'hydrogen' using factor " + ) + assert len(converted.provenance) == 2 + + def test_change_heating_value_same_hv_records_nothing(self) -> None: + """Test that a no-op heating value change does not add an entry.""" + param = technologydata.Parameter( + magnitude=1, + units="kWh", + carrier="H2", + heating_value="LHV", + provenance=["literature"], + ) + assert param.change_heating_value("LHV").provenance == ["literature"] + + @pytest.mark.parametrize( # type: ignore + ("result_fn", "expected"), + [ + (lambda p: p * 2, "Multiplied by 2: 4 -> 8"), + (lambda p: p / 2, "Divided by 2: 4 -> 2.0"), + ( + lambda p: p**2, + "Raised to the power of 2: 4 kilowatt -> 16 kilowatt ** 2", + ), + ], + ) + def test_scalar_operations_record_entry( + self, + result_fn: Callable[[technologydata.Parameter], technologydata.Parameter], + expected: str, + ) -> None: + """Test that scalar arithmetic appends a descriptive entry.""" + param = technologydata.Parameter( + magnitude=4, units="kW", provenance=["literature"] + ) + assert result_fn(param).provenance == ["literature", expected] + + @pytest.mark.parametrize( # type: ignore + ("result_fn", "expected"), + [ + ( + lambda a, b: a + b, + "Calculated as (3 kilowatt) + (1 kilowatt) = 4 kilowatt", + ), + ( + lambda a, b: a - b, + "Calculated as (3 kilowatt) - (1 kilowatt) = 2 kilowatt", + ), + ( + lambda a, b: a * b, + "Calculated as (3 kilowatt) * (1 kilowatt) = 3 kilowatt ** 2", + ), + ( + lambda a, b: a / b, + "Calculated as (3 kilowatt) / (1 kilowatt) = 3.0 dimensionless", + ), + ], + ) + def test_binary_operations_merge_and_record( + self, + result_fn: Callable[ + [technologydata.Parameter, technologydata.Parameter], + technologydata.Parameter, + ], + expected: str, + ) -> None: + """Test that binary arithmetic keeps both histories and appends the operation.""" + a = technologydata.Parameter(magnitude=3, units="kW", provenance=["source a"]) + b = technologydata.Parameter(magnitude=1, units="kW", provenance=["source b"]) + assert result_fn(a, b).provenance == ["source a", "source b", expected] + assert a.provenance == ["source a"] + assert b.provenance == ["source b"] diff --git a/test/test_technology.py b/test/test_technology.py index 4c1665a8..c9fec22d 100644 --- a/test/test_technology.py +++ b/test/test_technology.py @@ -202,10 +202,11 @@ def test_technology_to_currency_preserves_other_attributes(self) -> None: converted.parameters["investment"].carrier == tech.parameters["investment"].carrier ) - assert ( - converted.parameters["investment"].provenance - == tech.parameters["investment"].provenance - ) + # Provenance history is kept and the currency conversion is appended + converted_provenance = converted.parameters["investment"].provenance + assert converted_provenance is not None + assert converted_provenance[:-1] == tech.parameters["investment"].provenance + assert converted_provenance[-1].startswith("Converted currency from") assert ( converted.parameters["investment"].note == tech.parameters["investment"].note From 4bba5670923a7c9e49cef8fa61674c76f516e1a8 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Fri, 25 Sep 2026 18:26:25 +0200 Subject: [PATCH 77/81] Rename `manual_input*.csv` to `legacy_input_data` and enhance the parser (#154) * doc: lead the parser examples with runnable code Both example pages opened with narrative before showing anything runnable, and neither showed how the raw data becomes the parsed output. Restructure both to the same shape: Quick start, pipeline diagram, worked row, parser steps, regeneration and outputs. Correct four inaccurate claims, on unit resolution, currency form, schema output paths and the worked row index. * docs: Simplify documentation for DEA storage data v10 * code: manual_input to legacy_data * fix unit tests * code: new unit test * code: new unit test * code: new unit test * code: refactor commons.py * code/doc: legacy_data --> legacy_input_data * code: add new logic * code: adapt usage for tests * docs(tutorial): update Technology print output after #145 Co-Authored-By: Claude Opus 5.5 (1M context) * docs(datasets): add dataset fact sheets and template Add standardized fact sheets for dea_energy_storage and manual_input_usa, a contributor page with a checklist and fact sheet template, and run the code blocks of all fact sheets as doctests so their content tables stay in sync with the shipped data. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: replace dataset examples with Datasets section Add a top-level Datasets tab, remove the per-dataset example pages, shorten the parser user guide pages to class usage and point links to the fact sheets. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: fix undefined names in landing page example Co-Authored-By: Claude Opus 5.5 (1M context) * docs: Small tweaks * docs(datasets): rename quick start, move reproduce section, add license to citation Co-Authored-By: Claude Opus 5.5 (1M context) * docs(datasets): rename Versions section to Available versions Co-Authored-By: Claude Opus 5.5 (1M context) * docs: add dataset-factsheet agent skill Add a Claude Code skill with step-by-step instructions for writing a dataset fact sheet: where each fact comes from, how to generate the doctest outputs, checks for known limitations and for the reproduce call. The template stays in docs/contributing/adding_a_dataset.md, which now points to the skill; AGENTS.md points other agents to it. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: addendum * code: add new carriers * chore: untrack stray agent worktree and ignore .claude/worktrees/ * code: update parser_v0134.py * code: fix old carriers * new units and carriers * code: add new fixes for tests * code: update parser_v0134.py * code/doc: update documentation * code/doc: update parser docs * code: update version * code: update unit tests * code: update data and doc * doc: update docs * docs: Revise tutorial and getting started (#151) * fix(parameter): multiply parameters without carrier or heating value Multiplying two parameters without heating value raised a TypeError (None * None), and a missing carrier was stored as the string "None". Handle missing carrier and heating value like __truediv__ does. Co-Authored-By: Claude Opus 5.5 (1M context) * fix(data_accessor): default data_path to the installed package The default data_path was resolved relative to the working directory, so load() only worked from the root of a repository checkout and created empty directories elsewhere. Default to the package's parsers directory, which is the same path in a checkout. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: add short getting started page Introduce Parameter, Technology and TechnologyCollection, then load the DEA storage dataset, read lifetime and investment of a utility-scale lithium-ion battery in 2030 and compute the investment of a project. Each section links to the user guide for more. The page is run as a doctest and linked from the landing page and the tutorial. Co-Authored-By: Claude Opus 5.5 (1M context) * fix(parameter): do not modify the original in to() to() overwrote the internal pint quantity of the original parameter with the converted one, while magnitude and units stayed unchanged. Equations read the pint quantity, so a unit conversion changed the result of later calculations; isclose() had the same side effect. Co-Authored-By: Claude Opus 5.5 (1M context) * docs(getting_started): add equations, collections, currency and consistency Show an incompatible-units error, derive the total investment with calculate_parameters(), split collections into grouping, values from the DEA dataset and growth-model projections, and add sections on currency and inflation harmonisation and consistency checks. Link the bundled datasets. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: rename getting started to Overview and move it with the tutorial into Home Co-Authored-By: Claude Opus 5.5 (1M context) * docs(overview): add data package section, fold project investment into currencies Co-Authored-By: Claude Opus 5.5 (1M context) * docs(overview): wording on projections, currencies and consistency checks Co-Authored-By: Claude Opus 5.5 (1M context) * docs(tutorial): rewrite as a beginner tutorial around one electrolyser example Build one hydrogen electrolyser example step by step: parameters and units, currencies and price years, carriers and heating values, sources, technologies, equations, collections and projections, data packages, and the bundled datasets. Each step explains why the concept exists. The dataset comparison and concatenation are dropped. Move "who this package is for" to the landing page and correct its claim that currency conversions record provenance. Move the regex warning of get() to the TechnologyCollection guide. Co-Authored-By: Claude Opus 5.5 (1M context) * docs(contributing): rename API improvement proposals to Improvement backlog, add tutorial findings Co-Authored-By: Claude Opus 5.5 (1M context) * docs: Refinements --------- Co-authored-by: Claude Opus 5.5 (1M context) * doc: fix doc tests * code: Cleanup carrier alias names * data: Fix units in parser * data: less parameters * data: Fix heating values and carriers * docs: Update description of the legacy parser * data: Update legacy parser for consistency * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * doc: Move parser documentation * docs: Fix mkdocs entries * code: Update skill for creating dataset factsheets * docs: Restructure parser documentation * docs: Update navigation * code: Skill updates * code: Agent instruction updates * docs: Fix paths * docs: Update docstrings in parsers * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs: Post merge with prototype-2 branch corrections --------- Co-authored-by: cdgaete Co-authored-by: Johannes <42553970+euronion@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .claude/skills/dataset-factsheet/SKILL.md | 41 +- .codespell.ignore | 1 + AGENTS.md | 4 +- MANIFEST.in | 2 +- REUSE.toml | 4 +- docs/api/dea_energy_storage_parser.md | 2 - docs/api/manual_input_usa_parser.md | 2 - docs/contributing/adding_a_dataset.md | 26 +- ...nt_proposals.md => improvement_backlog.md} | 86 +- docs/contributing/writing_a_parser.md | 92 + docs/datasets/dea_energy_storage.md | 20 +- docs/datasets/index.md | 2 +- docs/datasets/legacy_input_data.md | 334 + docs/datasets/manual_input_usa.md | 189 - docs/home/faq.md | 2 +- docs/index.md | 13 +- docs/overview.md | 237 + docs/tutorial/index.md | 451 +- docs/user_guide/class-diagram.puml | 2 +- docs/user_guide/data_accessor.md | 31 +- docs/user_guide/dea_energy_storage_parser.md | 38 - docs/user_guide/manual_input_usa_parser.md | 38 - docs/user_guide/parameter.md | 2 +- docs/user_guide/technology_collection.md | 4 + mkdocs.yaml | 13 +- src/technologydata/data_accessor.py | 43 +- src/technologydata/parsers/commons.py | 251 + .../parsers/data_parser_base.py | 4 +- .../parsers/dea_energy_storage/__init__.py | 21 +- .../parsers/dea_energy_storage/parser_v10.py | 28 +- .../__init__.py | 44 +- .../parsers/legacy_input_data/parser_v0134.py | 560 + .../legacy_input_data/v0.13.4/sources.json | 23 + .../v0.13.4/technologies.json | 19097 ++++++++++++++++ .../parsers/manual_input_usa/parser_v0134.py | 272 - .../manual_input_usa/v0.13.4/sources.json | 14 - .../v0.13.4/technologies.json | 4319 ---- ...chnology_datasheet_for_energy_storage.xlsx | Bin .../parsers/raw/legacy_input_data/other.csv | 622 + .../usa.csv} | 0 src/technologydata/utils/carriers.txt | 16 +- test/test_docs.py | 2 +- test/test_legacy_parser_v0134.py | 103 + test/test_parameter.py | 14 +- test/test_parser_data_accessor.py | 34 +- 45 files changed, 21855 insertions(+), 5248 deletions(-) delete mode 100644 docs/api/dea_energy_storage_parser.md delete mode 100644 docs/api/manual_input_usa_parser.md rename docs/contributing/{api_improvement_proposals.md => improvement_backlog.md} (58%) create mode 100644 docs/contributing/writing_a_parser.md create mode 100644 docs/datasets/legacy_input_data.md delete mode 100644 docs/datasets/manual_input_usa.md create mode 100644 docs/overview.md delete mode 100644 docs/user_guide/dea_energy_storage_parser.md delete mode 100644 docs/user_guide/manual_input_usa_parser.md rename src/technologydata/parsers/{manual_input_usa => legacy_input_data}/__init__.py (57%) create mode 100644 src/technologydata/parsers/legacy_input_data/parser_v0134.py create mode 100644 src/technologydata/parsers/legacy_input_data/v0.13.4/sources.json create mode 100644 src/technologydata/parsers/legacy_input_data/v0.13.4/technologies.json delete mode 100644 src/technologydata/parsers/manual_input_usa/parser_v0134.py delete mode 100644 src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json delete mode 100644 src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json rename src/technologydata/parsers/raw/{ => dea_energy_storage}/Technology_datasheet_for_energy_storage.xlsx (100%) create mode 100644 src/technologydata/parsers/raw/legacy_input_data/other.csv rename src/technologydata/parsers/raw/{manual_input_usa.csv => legacy_input_data/usa.csv} (100%) create mode 100644 test/test_legacy_parser_v0134.py diff --git a/.claude/skills/dataset-factsheet/SKILL.md b/.claude/skills/dataset-factsheet/SKILL.md index 64f8b494..bd799d03 100644 --- a/.claude/skills/dataset-factsheet/SKILL.md +++ b/.claude/skills/dataset-factsheet/SKILL.md @@ -1,6 +1,6 @@ --- name: dataset-factsheet -description: Create or update the fact sheet in docs/datasets/.md for a dataset shipped with technologydata, once its parser and parsed JSON exist. Use when a data source or a new version of one is added, or when a fact sheet's doctests fail after the data changed. +description: Create or update the fact sheet in docs/datasets/.md for a dataset shipped with technologydata, including its Parser API section, once its parser and parsed JSON exist. Use when a data source or a new version of one is added, when a parser changes, or when a fact sheet's doctests fail after the data changed. --- # Dataset fact sheet @@ -13,8 +13,9 @@ SPDX-License-Identifier: MIT --> The template, section order and writing guidelines are in `docs/contributing/adding_a_dataset.md`; read it first and follow it exactly. -`docs/datasets/dea_energy_storage.md` and `docs/datasets/manual_input_usa.md` are finished examples. -This skill covers how to find each fact and how to check it. +`docs/datasets/dea_energy_storage.md` and `docs/datasets/legacy_input_data.md` are finished examples. +How a parser is structured is described in `docs/contributing/writing_a_parser.md`. +This skill covers how to find each fact, how to check the parser docstrings and how to check the page. Readers are experienced modellers and AI agents: tables and short bullets, no description of the parser code. Only state what you verified in the code or the data; if something cannot be verified (e.g. the upstream license), write what is known and tell the user. @@ -25,9 +26,9 @@ Determine, or ask the user if unclear: - ``: the `DataSourceName` value in `src/technologydata/data_accessor.py`. - ``: the directory in `src/technologydata/parsers//`. -- The parser module `src/technologydata/parsers//`, the raw file in `src/technologydata/parsers/raw/`, and `sources.json` of the version. +- The parser module `src/technologydata/parsers//`, the raw files in `src/technologydata/parsers/raw//`, and `sources.json` of the version. -For a new version of an existing dataset, update the existing page instead (see the end of the checklist in `adding_a_dataset.md`). +For a new version of an existing dataset, update the existing pages instead (see the end of the checklist in `adding_a_dataset.md`), including a `:::` block for the new version parser in `Parser API`. ## Where each fact comes from @@ -40,6 +41,7 @@ For a new version of an existing dataset, update the existing page instead (see | Naming conventions | the parser's cleaning functions (regexes, renames, case maps, unit replacements); one real example each | | Assumptions and deviations | hard-coded values in the parser: fixed region, parameter filters, filled-in units, dropped rows, merged cases, row-level sources not kept | | Known limitations | checks below | +| Parser API | the dispatcher class in `src/technologydata/parsers//__init__.py` and the version parser class of each entry in its `get_supported_versions()` | ```python from technologydata import DataAccessor @@ -76,22 +78,33 @@ Look for these and quantify them where cheap ("7 of about 76 parameters"): ## Verify Reproduce The documented `parse()` call must reproduce the shipped files. -It overwrites them, so check the working tree is clean for that directory first: +It overwrites them, so check the working tree is clean for the output directory first: ```bash -git status --short src/technologydata/parsers// -uv run python -c 'from technologydata import DataAccessor; DataAccessor(data_source="", version="").parse(input_file_name="", num_digits=3)' -git diff --stat src/technologydata/parsers// -git checkout -- src/technologydata/parsers// +git status --short src/technologydata/parsers/// +uv run python -c 'from technologydata import DataAccessor; DataAccessor(data_source="", version="").parse(input_file_names=[""], num_digits=3)' +git diff --stat src/technologydata/parsers/// +git checkout -- src/technologydata/parsers/// ``` +Restore only the output directory `//`: the parser code next to it may have uncommitted changes. + +`input_file_names` lists every raw file of the version, as file names inside `src/technologydata/parsers/raw//`. Only a trailing-newline difference is acceptable; otherwise adjust the documented options until the output matches. Never use `archive_source=True` here: it calls the Wayback Machine and rewrites `sources.json`. +The test suite also re-parses the shipped files in place; restore them with `git checkout` after running it. + +## Parser API section + +The `Parser API` section at the end of the fact sheet renders the docstrings of the parser classes with mkdocstrings, one `:::` block per class with `heading_level: 3`, as in the template: first the dispatcher, then one block per supported version. +It is the only per-parser documentation, so the docstrings must be complete and match the code: parameters and their types, what the parser writes where, raised errors, which options it ignores, and examples. +Fix wrong docstrings in the parser, or tell the user if the fix is not obvious. ## Wire up and check -1. Add the page to the `Datasets` nav in `mkdocs.yaml` and a row to the table in `docs/datasets/index.md`. -2. If a user guide page `docs/user_guide/_parser.md` exists, keep it to structure and usage and link to the fact sheet's `#reproduce`. -3. Run `uv run pytest test/test_docs.py --test-docs` and `uv run pre-commit run --all-files`. +1. Add the fact sheet to the `Datasets` nav in `mkdocs.yaml` and a row to the table in `docs/datasets/index.md`. +2. Run `uv run pytest test/test_docs.py --test-docs` and `uv run pre-commit run --all-files`. Codespell may flag domain abbreviations; add real terms to `.codespell.ignore`. -4. Report to the user: anything not verified, and parser problems found (such as overwritten values) as candidates for issues. +3. Run `READTHEDOCS_CANONICAL_URL=http://localhost/ uv run mkdocs build --strict -d /tmp/site` to check links, anchors and the `:::` blocks. + Warnings `has no git logs` for new, uncommitted files can be ignored. +4. Report to the user: anything not verified, and parser problems found (such as overwritten values or wrong docstrings) as candidates for issues. diff --git a/.codespell.ignore b/.codespell.ignore index 7afa8c2b..d5701df8 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -3,3 +3,4 @@ # SPDX-License-Identifier: MIT CAF FOM +ore diff --git a/AGENTS.md b/AGENTS.md index 2dda564b..c857c300 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,7 +18,9 @@ maintained by a community of maintainers, based on an initiative of Open Energy regenerate them via the parser, do not hand-edit. Each data source has a fact sheet in `docs/datasets/.md`; when adding or changing a data source, follow `docs/contributing/adding_a_dataset.md`; - for writing the fact sheet, follow `.claude/skills/dataset-factsheet/SKILL.md`. + for writing a parser, see `docs/contributing/writing_a_parser.md`; + for writing the fact sheet (including its Parser API section), follow + `.claude/skills/dataset-factsheet/SKILL.md`. - `src/technologydata/data_accessor.py` β€” `DataAccessor` class for accessing external data either from the package or from a remote source. Import as `from technologydata import DataAccessor`. diff --git a/MANIFEST.in b/MANIFEST.in index f4965340..f849a21b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,7 +2,7 @@ include src/technologydata/utils/*.txt include src/technologydata/equations_data/*.yaml include src/technologydata/equations_data/*.json include src/technologydata/parsers/dea_energy_storage/v10/*.json -include src/technologydata/parsers/manual_input_usa/v0.13.4/*.json +include src/technologydata/parsers/legacy_input_data/v0.13.4/*.json include src/technologydata/parsers/raw/* include test/test_data/currency_conversion/WB_CNY_2020/* include test/test_data/currency_conversion/WB_EUR_2020/* diff --git a/REUSE.toml b/REUSE.toml index 04653009..24a64ae7 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -15,14 +15,14 @@ SPDX-License-Identifier = "CC-BY-4.0" [[annotations]] path = [ - "src/technologydata/parsers/dea_energy_storage/v*/*.json", "src/technologydata/parsers/schemas/*.json", "src/technologydata/parsers/raw/manual_input_usa.csv", "src/technologydata/parsers/manual_input_usa/v*/*.json", + "src/technologydata/parsers/dea_energy_storage/v*/*.json", "src/technologydata/parsers/schemas/*.json", "src/technologydata/parsers/raw/legacy_input_data/other.csv", "src/technologydata/parsers/raw/legacy_input_data/usa.csv", "src/technologydata/parsers/legacy_input_data/v*/*.json", ] SPDX-FileCopyrightText = "technologydata contributors" SPDX-License-Identifier = "CC-BY-4.0" [[annotations]] path = [ - "src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx" + "src/technologydata/parsers/raw/dea_energy_storage/Technology_datasheet_for_energy_storage.xlsx" ] SPDX-FileCopyrightText = "The Danish Energy Agency" SPDX-License-Identifier = "CC-BY-4.0" diff --git a/docs/api/dea_energy_storage_parser.md b/docs/api/dea_energy_storage_parser.md deleted file mode 100644 index 50fd3513..00000000 --- a/docs/api/dea_energy_storage_parser.md +++ /dev/null @@ -1,2 +0,0 @@ -::: technologydata.parsers.dea_energy_storage.DeaEnergyStorageParser -::: technologydata.parsers.dea_energy_storage.parser_v10.DeaEnergyStorageV10Parser diff --git a/docs/api/manual_input_usa_parser.md b/docs/api/manual_input_usa_parser.md deleted file mode 100644 index a88a53f1..00000000 --- a/docs/api/manual_input_usa_parser.md +++ /dev/null @@ -1,2 +0,0 @@ -::: technologydata.parsers.manual_input_usa.ManualInputUsaParser -::: technologydata.parsers.manual_input_usa.parser_v0134.ManualInputUSAV0134Parser diff --git a/docs/contributing/adding_a_dataset.md b/docs/contributing/adding_a_dataset.md index b97fa9cb..634e429b 100644 --- a/docs/contributing/adding_a_dataset.md +++ b/docs/contributing/adding_a_dataset.md @@ -13,8 +13,8 @@ Fact sheets are short and structured information: what the data is, where it com ## Checklist 0. Clone the repository. -1. Add the raw file to `src/technologydata/parsers/raw/` and its license to `REUSE.toml`. -2. Add a parser under `src/technologydata/parsers//` and register `` in `DataSourceName` and `DataAccessor.parse()`. +1. Add the raw file to `src/technologydata/parsers/raw//` and its license to `REUSE.toml`. +2. Add a parser under `src/technologydata/parsers//` and register `` in `DataSourceName` and `DataAccessor.parse()`, see [Writing a parser](writing_a_parser.md). 3. Run the parser and commit the output in `src/technologydata/parsers///`. 4. Copy the template below to `docs/datasets/.md` and fill it in. 5. Add the fact sheet to the `Datasets` section in `mkdocs.yaml` and a row to `docs/datasets/index.md`. @@ -28,7 +28,7 @@ When a new version is added, add a row to the `Available versions` table, add th !!! tip "Delegate work to AI agents" Once the parser and the parsed data exist, writing the fact sheet can be delegated to an AI agent. - The repository contains the skill [`dataset-factsheet`](https://github.com/open-energy-transition/technology-data/blob/master/.claude/skills/dataset-factsheet/SKILL.md) with step-by-step instructions: where each fact comes from, how to generate the tables and which checks to run. + The repository contains the skill [`dataset-factsheet`](https://github.com/open-energy-transition/technology-data/blob/master/.claude/skills/dataset-factsheet/SKILL.md) with step-by-step instructions: where each fact comes from, how to generate the tables, how to check the parser docstrings and which checks to run. Claude Code picks it up automatically (ask e.g. "create the fact sheet for ``" or run `/dataset-factsheet`); other agents are pointed to it by `AGENTS.md`. Always review the result created by AI; other people want to build their work on it. Pay particular attention to the assumptions, limitations and license. @@ -54,7 +54,7 @@ documentation_url: license: versions: [] region: -raw_file: src/technologydata/parsers/raw/ +raw_file: src/technologydata/parsers/raw// parser: technologydata.parsers.. --- @@ -83,7 +83,7 @@ SPDX-License-Identifier: MIT | Cases | | | Currency | `` | | Raw format | | -| Parser | [``](../api/_parser.md) | +| Parser | [``](#parser-api) | ## Available versions @@ -166,7 +166,7 @@ The parser overwrites the files shipped with the package. from technologydata import DataAccessor DataAccessor(data_source="", version="").parse( - input_file_name="", + input_file_names=[""], num_digits=3, ) ``` @@ -187,6 +187,18 @@ Please also cite `technologydata`, see [Citing](../index.md#citing). ## See also -- [ Parser](../user_guide/_parser.md) (user guide) and [API reference](../api/_parser.md) - [Data Accessor](../user_guide/data_accessor.md) + +## Parser API + +The parser is only needed to reproduce or update the dataset, see [Reproduce](#reproduce); loading the data only needs `DataAccessor.load()`. +The dispatcher selects the parser of the requested version. + +::: technologydata.parsers.. + options: + heading_level: 3 + +::: technologydata.parsers... + options: + heading_level: 3 ```` diff --git a/docs/contributing/api_improvement_proposals.md b/docs/contributing/improvement_backlog.md similarity index 58% rename from docs/contributing/api_improvement_proposals.md rename to docs/contributing/improvement_backlog.md index 9e15b244..44ade191 100644 --- a/docs/contributing/api_improvement_proposals.md +++ b/docs/contributing/improvement_backlog.md @@ -1,9 +1,10 @@ -# API improvement proposals +# Improvement backlog -This document collects API additions, behavior changes, and code cleanups that were identified -during a review of the formula-system branch but deliberately **not** implemented yet. -Each entry names the owning class, a rough signature, and the rationale, so it can be picked up -as an independent piece of work later. +This document collects bugs, API additions, behavior changes, and code cleanups that were +identified during reviews and while writing the documentation, many of them with the help of +AI agents, but that are deliberately **not** implemented yet. +Each entry names the owning class, a rough signature or the observed behavior, and the +rationale, so it can be picked up as an independent piece of work later. ## 1. Promised in docs/design but missing (highest priority) @@ -108,6 +109,81 @@ Cleanups identified in review but scoped out of the equations-focused simplifica `model_copy(update=...)` like `calculate_parameters`, and `country = overwrite_country or self.region`. +## 6. Issues found while writing the tutorials + +Found while writing the Overview and the Tutorial; each was worked around in the docs. + +### Heating values block multiplication with carriers that have none + +`Parameter.__mul__` and `__truediv__` require both operands to have the same heating value. +Electricity has none, so the most natural electrolyser calculation fails: + +```python +electricity = Parameter(magnitude=10, units="MW", carrier="el") +efficiency = Parameter(magnitude=0.65, units="MWh/MWh", carrier="H2/el", heating_value="LHV") +electricity * efficiency # ValueError: different heating values: None and lower_heating_value +``` + +Proposal: treat a missing heating value as compatible and let the result take the one that is +set. The rule for two set heating values also needs a decision: multiplying LHV by LHV +currently yields `lower_heating_value ** 2`. This is a design decision and a behavior change. + +### Derived parameters drop the sources and provenance of their inputs + +`Technology.calculate_parameters` (via `EquationRegistry`) returns a parameter whose +`provenance` contains only the formula entry and whose `sources` are empty, although the +inputs carry both. The derived parameter should merge the inputs' sources and keep their +provenance before the formula entry, as the arithmetic operators already do. + +### Wrong units for `eac` + +`calculate_parameters("eac")` from `specific_investment`, `wacc` and `lifetime` returns +`EUR_2020 / kilowatt` instead of `EUR_2020 / kilowatt / year`. Parameters in exponent positions +are passed as plain magnitudes (see `_get_exponent_symbols` in `equations.py`), so the `year` +of `lifetime` is lost. The unit of the result has to be restored, e.g. by dividing by the unit +of the exponent parameter where the formula implies it, or by declaring the target unit per +equation. + +### Derived units are not simplified + +A derived `total_investment_cost` from `EUR_2020/kW` and `MW` is reported as +`EUR_2020 * megawatt / kilowatt`. Results of equations (and possibly of `__mul__` / +`__truediv__`) should be passed through pint's `to_reduced_units()`. + +### Misleading error message for incompatible units + +`Parameter._check_parameter_compatibility` compares currencies before dimensions, so any +mismatch where one side has a currency is reported as +`different currencies or currency years: 'megawatt_hour' and 'EUR_2020 / kilowatt'`. +Check dimensionality first, and only report a currency mismatch when both sides have +compatible dimensions. + +### Parameter names differ between datasets and equations + +The equations identify parameters by name (`specific_investment`, `total_investment_cost`), +while the parsers keep the source's names (`specific investment` in `dea_energy_storage`, +`investment` in `manual_input_usa`). Equations can therefore not be applied to the bundled +datasets. Options: harmonise parameter keys in the parsers to the equation names (and document +it under "Naming conventions" in the fact sheets), or add an alias mapping to the registry. + +### `TechnologyCollection.to_dataframe()` is not a flat table + +All parameters end up in one nested `parameters` column. A long format with one row per +technology and parameter (`magnitude`, `units`, `carrier`, `heating_value`) would make the +output usable for filtering and export. + +### `DataPackage.to_json()` docstring promises a schema that is not written + +The docstring says both files are exported "together with the corresponding data schema", but +`TechnologyCollection.to_json` is called with `output_schema=False`. Either pass +`output_schema=True` or add a parameter and fix the docstring. + +### `DataAccessor.download()` writes into the installed package by default + +Since `data_path` defaults to the package's `parsers` directory (so that `load()` works from any +working directory), `download()` writes there too. In a non-editable install this is inside +`site-packages` and may not be writable. Related to #92, #95 and #113. + ## Considered and rejected - `Parameter.__hash__`: the class is mutable (pint attributes, provenance list), so hashing diff --git a/docs/contributing/writing_a_parser.md b/docs/contributing/writing_a_parser.md new file mode 100644 index 00000000..8e9402cc --- /dev/null +++ b/docs/contributing/writing_a_parser.md @@ -0,0 +1,92 @@ +# Writing a parser + + + +A parser turns the raw file of a data source into the `technologies.json` and `sources.json` files shipped with `technologydata`. +It is only run to create or update a dataset; users load the result with `DataAccessor.load()`. +This page describes how a parser is structured; [Adding a dataset](adding_a_dataset.md) lists all steps from the raw file to the fact sheet. + +The DEA energy storage parser in `src/technologydata/parsers/dea_energy_storage/` is the reference example for a single raw file, see its [fact sheet](../datasets/dea_energy_storage.md#parser-api) for the rendered API. +The legacy input data parser in `src/technologydata/parsers/legacy_input_data/` reads two raw files and uses the unit helpers in `src/technologydata/parsers/commons.py`. + +## Layout + +| Path | Content | +|---|---| +| `src/technologydata/parsers/raw//` | the raw file(s), with their license in `REUSE.toml` | +| `src/technologydata/parsers//__init__.py` | the dispatcher class, e.g. `DeaEnergyStorageParser` | +| `src/technologydata/parsers//parser_.py` | one parser class per dataset version, e.g. `DeaEnergyStorageV10Parser` in `parser_v10.py` | +| `src/technologydata/parsers///` | the output: `technologies.json` and `sources.json` | + +## Dispatcher + +The dispatcher maps each supported version to its parser class and delegates `parse()` to it: + +```python +class MyDatasetParser: + def __init__(self) -> None: + self._parsers: dict[str, type[ParserBase]] = { + "v1": MyDatasetV1Parser, + } + + def get_supported_versions(self) -> list[str]: + return list(self._parsers.keys()) + + def parse(self, version, input_path, num_digits, archive_source, filter_params, export_schema) -> None: + ... # raise ValueError for an unsupported version, else call the version parser +``` + +A new version of a dataset is a new parser class and a new entry in `_parsers`; existing versions and their output stay unchanged. + +## Version parser + +Each version parser subclasses `ParserBase` from `technologydata.parsers.data_parser_base` and implements + +```python +def parse(self, input_path, num_digits, archive_source, **kwargs) -> None: +``` + +- `input_path`: a `pathlib.Path` for one raw file or a list of paths for several; validate what the version expects. +- `num_digits`: rounding of the values. +- `archive_source`: if `True`, build the `Source` objects, archive them with `Source.ensure_in_wayback()` and write `sources.json`; otherwise read the existing `sources.json`. +- `kwargs`: `filter_params` and `export_schema`, both booleans; document it if a parser ignores one. + +The parser builds `Technology` objects with their `Parameter`s, collects them in a `TechnologyCollection` and writes it with `to_json()` to `//technologies.json`. +The output paths are built from the current working directory, so parsers are run from the root of a repository checkout. + +## Register the data source + +In `src/technologydata/data_accessor.py`: + +1. add `` to `DataSourceName`, +2. import the dispatcher and select it for `` in `DataAccessor.parse()`. + +`DataAccessor.parse(input_file_names=[...])` then looks up the raw files in `parsers/raw//` and passes one path, or a list of paths for several files, to the dispatcher. + +## Conventions for the parsed data + +- **Units** must be understood by the package's unit registry; currencies carry their year, e.g. `EUR_2020` (use `Commons.update_unit_with_currency_year()` if the year is in a separate column). +- **Carriers** and **heating values** use the names of the package registries (`src/technologydata/utils/carriers.txt`); rename aliases of the raw data in the parser rather than adding them to the registry. +- A carrier or heating value belongs to the part of the unit it describes: in the denominator it is inverted (`EUR/MWh_H2` β†’ carrier `1 / hydrogen`, heating value `1 / lower_heating_value`); electricity and heat have no heating value. +- **Region** and **case** are strings; use a fixed value if the raw data has none, and document it in the fact sheet. +- **Rounding** happens once, after all unit conversions, so small converted values keep their significant digits. + +## Docstrings + +The docstrings of the dispatcher and the version parsers are rendered in the `Parser API` section of the dataset's fact sheet, which is the only per-parser documentation. +Keep them complete and in sync with the code: parameters and their types, what the parser writes where, raised errors, and which options it ignores. + +## Tests + +- Unit tests for the cleaning and conversion functions, e.g. `test/test_dea_energy_storage_v10.py`. +- A parse-and-load test in `test/test_parser_data_accessor.py` that runs `DataAccessor.parse()` with the documented options and checks the loaded `DataPackage`. + It writes to the shipped files in place; restore them with `git checkout` after running the tests. + +## Next step + +Run the parser, commit its output, and write the fact sheet as described in [Adding a dataset](adding_a_dataset.md). diff --git a/docs/datasets/dea_energy_storage.md b/docs/datasets/dea_energy_storage.md index c94d08f8..1de6594d 100644 --- a/docs/datasets/dea_energy_storage.md +++ b/docs/datasets/dea_energy_storage.md @@ -8,7 +8,7 @@ documentation_url: https://ens.dk/media/6588/download license: CC-BY-4.0 versions: [v10] region: EU -raw_file: src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx +raw_file: src/technologydata/parsers/raw/dea_energy_storage/Technology_datasheet_for_energy_storage.xlsx parser: technologydata.parsers.dea_energy_storage.DeaEnergyStorageParser --- @@ -37,7 +37,7 @@ The Danish Energy Agency (DEA) technology catalogue for energy storage: costs, e | Cases | `control` (central estimate), `lower`, `upper` (uncertainty range) | | Currency | `EUR_2020` | | Raw format | Excel, sheet `alldata_flat` | -| Parser | [`DeaEnergyStorageParser`](../api/dea_energy_storage_parser.md) | +| Parser | [`DeaEnergyStorageParser`](#parser-api) | ## Available versions @@ -161,7 +161,7 @@ The parser overwrites the files shipped with the package. from technologydata import DataAccessor DataAccessor(data_source="dea_energy_storage", version="v10").parse( - input_file_name="Technology_datasheet_for_energy_storage.xlsx", + input_file_names=["Technology_datasheet_for_energy_storage.xlsx"], num_digits=3, filter_params=True, ) @@ -186,5 +186,17 @@ Please also cite `technologydata`, see [Citing](../index.md#citing). ## See also -- [DEA Energy Storage Parser](../user_guide/dea_energy_storage_parser.md) (user guide) and [API reference](../api/dea_energy_storage_parser.md) - [Data Accessor](../user_guide/data_accessor.md) + +## Parser API + +The parser is only needed to reproduce or update the dataset, see [Reproduce](#reproduce); loading the data only needs `DataAccessor.load()`. +The dispatcher selects the parser of the requested version. + +::: technologydata.parsers.dea_energy_storage.DeaEnergyStorageParser + options: + heading_level: 3 + +::: technologydata.parsers.dea_energy_storage.parser_v10.DeaEnergyStorageV10Parser + options: + heading_level: 3 diff --git a/docs/datasets/index.md b/docs/datasets/index.md index ca0548b0..bd7d67f4 100644 --- a/docs/datasets/index.md +++ b/docs/datasets/index.md @@ -13,7 +13,7 @@ Load any of them with `DataAccessor(data_source="", version="").lo | Dataset | Key | Versions | Region | Technologies | License | |---|---|---|---|---|---| | [DEA Technology Data for Energy Storage](dea_energy_storage.md) | `dea_energy_storage` | `v10` | EU | Electricity, heat, gas and hydrogen storage | CC-BY-4.0 | -| [PyPSA technology-data manual inputs for the USA](manual_input_usa.md) | `manual_input_usa` | `v0.13.4` | USA | Electrolysis, batteries, CCS power plants, Fischer-Tropsch, direct air capture | CC-BY-4.0 | +| [PyPSA technology-data input data](legacy_input_data.md) | `legacy_input_data` | `v0.13.4` | USA, World/Unspecified | Wide range of technologies from electricity generation, transmission and distribution, to storage and materials | CC-BY-4.0 | Each fact sheet follows the same structure: at a glance, available versions, accessing the data, contents, field mapping, naming conventions, assumptions and deviations from the source, reproduce, known limitations, citation. The front matter of each page holds the same key facts in machine-readable form. diff --git a/docs/datasets/legacy_input_data.md b/docs/datasets/legacy_input_data.md new file mode 100644 index 00000000..75151da0 --- /dev/null +++ b/docs/datasets/legacy_input_data.md @@ -0,0 +1,334 @@ +--- +id: legacy_input_data +name: PyPSA technology-data legacy input data +description: Hand-curated costs and efficiencies from PyPSA technology-data, USA-specific for electrolysis, batteries, CCS power plants, Fischer-Tropsch and direct air capture, and without region for about 100 conversion, transport, storage and industry technologies. +publisher: PyPSA technology-data contributors +upstream_url: https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv, https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/manual_input.csv +license: CC-BY-4.0 +versions: [v0.13.4] +region: USA, other +raw_file: src/technologydata/parsers/raw/legacy_input_data/usa.csv, src/technologydata/parsers/raw/legacy_input_data/other.csv +parser: technologydata.parsers.legacy_input_data.LegacyInputDataParser +--- + +# PyPSA technology-data legacy input data + + + +The two hand-curated input CSVs used by [PyPSA technology-data](https://github.com/PyPSA/technology-data), which are a mix of many different data sources. +`usa.csv` holds USA-specific parameters, mostly compiled from the NREL ATB 2024 and ICCT IRA e-fuels assumptions. +`other.csv` holds parameters that originally mainly served [PyPSA-Eur](https://pypsa-eur.readthedocs.io/en/latest/) but have been collected without paying attention to the region or consistency with each other: +They are a list of over 100 technologies from ammonia, electricity, to hydrogen and materials like steel. +This dataset will in the future be superseded by a better curated one. + +## At a glance + +| | | +|---|---| +| Package key | `legacy_input_data` (formerly `manual_input_usa`) | +| Publisher | PyPSA technology-data contributors | +| Original data | [`inputs/US/manual_input_usa.csv`](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv), [`inputs/manual_input.csv`](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/manual_input.csv) (no archived copies) | +| Underlying sources | cited per entry, multiple. | +| License | CC-BY-4.0 | +| Region | World / `other` and `USA` | +| Years | `USA`: 2020–2050; `other`: 2002–2050, and `0` for values without a specific year | +| Cases | NREL ATB scenario and financial cases, `not_available` for the remaining ones | +| Currency | `USD_2019`, `USD_2022`, `USD_2023`; `EUR_2004` to `EUR_2023` | +| Raw format | two manually curated CSV files | +| Parser | [`LegacyInputDataParser`](#parser-api) | + +## Available versions + +| Version key | Upstream release | Raw files | Parse options | Status | +|---|---|---|---|---| +| `v0.13.4` | PyPSA technology-data v0.13.4 | `usa.csv`, `other.csv` | `num_digits=3` | latest | + +## Accessing the data + +``` py +>>> from technologydata import DataAccessor +>>> data = DataAccessor(data_source="legacy_input_data", version="v0.13.4").load() +>>> tech = data.technologies.get(name="Fischer-Tropsch", region="USA", year=2020)[0] +>>> print(tech.parameters["hydrogen-input"]) +1.43 dimensionless, carrier=hydrogen / fischer_tropsch, heating_value=lower_heating_value +``` + +See the [tutorial](../tutorial/index.md) for filtering, unit and currency conversion. + +## Contents + +### Technologies + +``` py +>>> import pandas as pd +>>> techs = DataAccessor(data_source="legacy_input_data", version="v0.13.4").load().technologies +>>> def join(values): +... return ", ".join(sorted({str(v) for v in values} - {"None"})) +>>> print( +... techs.to_dataframe() +... .groupby(["name", "detailed_technology"], as_index=False) +... .agg(cases=("case", join), years=("year", join)) +... .to_markdown(index=False) +... ) +| name | detailed_technology | cases | years | +|:------------------------------------------------------|:------------------------------------------------------|:---------------------------------------------------------------------------|:-----------------------------| +| Alkaline electrolyzer large size | Alkaline electrolyzer large size | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2025, 2030, 2040, 2050 | +| Alkaline electrolyzer medium size | Alkaline electrolyzer medium size | not_available | 2020, 2025, 2030 | +| Alkaline electrolyzer small size | Alkaline electrolyzer small size | not_available | 2020, 2025, 2030 | +| Ammonia cracker | Ammonia cracker | not_available | 0, 2030, 2050 | +| CH4 (g) fill compressor station | CH4 (g) fill compressor station | not_available | 2040 | +| CH4 (g) pipeline | CH4 (g) pipeline | not_available | 2020, 2050 | +| CH4 (g) submarine pipeline | CH4 (g) submarine pipeline | not_available | 2002, 2015, 2020 | +| CH4 (l) transport ship | CH4 (l) transport ship | not_available | 2030, 2040 | +| CH4 evaporation | CH4 evaporation | not_available | 2030, 2040 | +| CH4 liquefaction | CH4 liquefaction | not_available | 0, 2030, 2040 | +| CO2 liquefaction | CO2 liquefaction | not_available | 0, 2004 | +| CO2 pipeline | CO2 pipeline | not_available | 2020 | +| CO2 storage tank | CO2 storage tank | not_available | 2050 | +| CO2 submarine pipeline | CO2 submarine pipeline | not_available | 2020 | +| Coal integrated retrofit 90%-CCS | Coal integrated retrofit 90%-CCS | not_available | 2030 | +| Coal integrated retrofit 95%-CCS | Coal integrated retrofit 95%-CCS | not_available | 2030 | +| Coal-95%-CCS | Coal-95%-CCS | not_available | 2030 | +| Coal-99%-CCS | Coal-99%-CCS | not_available | 2030 | +| Coal-IGCC | Coal-IGCC | not_available | 2020 | +| Coal-IGCC-90%-CCS | Coal-IGCC-90%-CCS | not_available | 2030 | +| FT fuel transport ship | FT fuel transport ship | not_available | 2035 | +| Fischer-Tropsch | Fischer-Tropsch | not_available | 2020, 2030, 2040, 2050 | +| General liquid hydrocarbon storage (crude) | General liquid hydrocarbon storage (crude) | not_available | 2012 | +| General liquid hydrocarbon storage (product) | General liquid hydrocarbon storage (product) | not_available | 2012 | +| H2 (g) fill compressor station | H2 (g) fill compressor station | not_available | 2020 | +| H2 (g) pipeline | H2 (g) pipeline | not_available | 2020, 2030, 2050 | +| H2 (g) pipeline repurposed | H2 (g) pipeline repurposed | not_available | 2020, 2030, 2050 | +| H2 (g) submarine pipeline | H2 (g) submarine pipeline | not_available | 2015, 2020, 2030, 2050 | +| H2 (g) submarine pipeline repurposed | H2 (g) submarine pipeline repurposed | not_available | 2015, 2020, 2030, 2050 | +| H2 (l) storage tank | H2 (l) storage tank | not_available | 2015 | +| H2 (l) transport ship | H2 (l) transport ship | not_available | 2030 | +| H2 evaporation | H2 evaporation | not_available | 2030, 2050 | +| H2 liquefaction | H2 liquefaction | not_available | 0, 2030, 2050 | +| H2 production biomass gasification | H2 production biomass gasification | not_available | 2020 | +| H2 production biomass gasification CC | H2 production biomass gasification CC | not_available | 2020 | +| H2 production coal gasification | H2 production coal gasification | not_available | 2020, 2025, 2030, 2050 | +| H2 production coal gasification CC | H2 production coal gasification CC | not_available | 2020, 2025, 2030, 2050 | +| H2 production heavy oil partial oxidation | H2 production heavy oil partial oxidation | not_available | 2020 | +| H2 production natural gas steam reforming | H2 production natural gas steam reforming | not_available | 2020, 2025, 2030 | +| H2 production natural gas steam reforming CC | H2 production natural gas steam reforming CC | not_available | 2020, 2025, 2030 | +| H2 production solid biomass steam reforming | H2 production solid biomass steam reforming | not_available | 2020 | +| HVAC overhead | HVAC overhead | not_available | 2030 | +| HVDC inverter pair | HVDC inverter pair | not_available | 2030 | +| HVDC overhead | HVDC overhead | not_available | 2030 | +| HVDC submarine | HVDC submarine | not_available | 2030 | +| HVDC underground | HVDC underground | not_available | 2030 | +| Haber-Bosch | Haber-Bosch | not_available | 0 | +| LNG storage tank | LNG storage tank | not_available | 2019 | +| LOHC chemical | LOHC chemical | not_available | 2035 | +| LOHC dehydrogenation | LOHC dehydrogenation | not_available | 2015 | +| LOHC dehydrogenation (small scale) | LOHC dehydrogenation (small scale) | not_available | 2035 | +| LOHC hydrogenation | LOHC hydrogenation | not_available | 0, 2015 | +| LOHC loaded DBT storage | LOHC loaded DBT storage | not_available | 2012 | +| LOHC transport ship | LOHC transport ship | not_available | 2035 | +| LOHC unloaded DBT storage | LOHC unloaded DBT storage | not_available | 2012 | +| MeOH transport ship | MeOH transport ship | not_available | 2035 | +| Methanol steam reforming | Methanol steam reforming | not_available | 0, 2020 | +| NG 2-on-1 Combined Cycle (F-Frame) | NG 2-on-1 Combined Cycle (F-Frame) | not_available | 2020, 2030 | +| NG 2-on-1 Combined Cycle (F-Frame) 95% CCS | NG 2-on-1 Combined Cycle (F-Frame) 95% CCS | not_available | 2030 | +| NG 2-on-1 Combined Cycle (F-Frame) 97% CCS | NG 2-on-1 Combined Cycle (F-Frame) 97% CCS | not_available | 2030 | +| NG Combined Cycle F-Class integrated retrofit 90%-CCS | NG Combined Cycle F-Class integrated retrofit 90%-CCS | not_available | 2030 | +| NG Combined Cycle F-Class integrated retrofit 95%-CCS | NG Combined Cycle F-Class integrated retrofit 95%-CCS | not_available | 2030 | +| NH3 (l) storage tank incl. liquefaction | NH3 (l) storage tank incl. liquefaction | not_available | 2020 | +| NH3 (l) transport ship | NH3 (l) transport ship | not_available | 2030 | +| PEM electrolyzer small size | PEM electrolyzer small size | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | +| SOEC | SOEC | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | +| Steam methane reforming | Steam methane reforming | not_available | 0, 2015 | +| air separation unit | air separation unit | not_available | 0 | +| allam | allam | not_available | 2030 | +| ammonia carbon capture retrofit | ammonia carbon capture retrofit | not_available | 2030 | +| battery inverter | battery inverter | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2022, 2030, 2040, 2050 | +| battery storage | battery storage | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2022, 2030, 2040, 2050 | +| biodiesel crops | biodiesel crops | not_available | 2020, 2030, 2040, 2050 | +| bioethanol crops | bioethanol crops | not_available | 2020, 2030, 2040, 2050 | +| biogas manure | biogas manure | not_available | 2020, 2030, 2040, 2050 | +| blast furnace-basic oxygen furnace | blast furnace-basic oxygen furnace | not_available | 2020 | +| cement carbon capture retrofit | cement carbon capture retrofit | not_available | 2030 | +| cement dry clinker | cement dry clinker | not_available | 2006 | +| cement finishing | cement finishing | not_available | 2006 | +| coal | coal | not_available | 2020 | +| csp-tower | csp-tower | not_available | 2020, 2030, 2040, 2050 | +| csp-tower TES | csp-tower TES | not_available | 2020, 2030, 2040, 2050 | +| csp-tower power block | csp-tower power block | not_available | 2020, 2030, 2040, 2050 | +| direct air capture | direct air capture | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 0, 2020 | +| dry bulk carrier Capesize | dry bulk carrier Capesize | not_available | 2020 | +| electric arc furnace | electric arc furnace | not_available | 2020 | +| electric arc furnace with hbi and scrap | electric arc furnace with hbi and scrap | not_available | 2020 | +| electric steam cracker | electric steam cracker | not_available | 2015 | +| electrolysis | electrolysis | not_available | 2020, 2025, 2030, 2040, 2050 | +| ethanol carbon capture retrofit | ethanol carbon capture retrofit | not_available | 2030 | +| ethanol from starch crop | ethanol from starch crop | not_available | 2010, 2020, 2025, 2030 | +| ethanol from sugar crops | ethanol from sugar crops | not_available | 2010, 2020, 2025, 2030 | +| fuelwood | fuelwood | not_available | 2020, 2030, 2040, 2050 | +| gas | gas | not_available | 2020 | +| geothermal | geothermal | not_available | 2020 | +| hydrogen direct iron reduction furnace | hydrogen direct iron reduction furnace | not_available | 2020 | +| hydrogen storage compressor | hydrogen storage compressor | not_available | 2020, 2030 | +| hydrogen storage tank type 1 | hydrogen storage tank type 1 | not_available | 2020, 2030 | +| iron ore DRI-ready | iron ore DRI-ready | not_available | 2020 | +| iron-air battery | iron-air battery | not_available | 2025, 2030, 2035, 2040 | +| iron-air battery charge | iron-air battery charge | not_available | 2025, 2030, 2035, 2040 | +| iron-air battery discharge | iron-air battery discharge | not_available | 2025, 2030, 2035, 2040 | +| lignite | lignite | not_available | 2020 | +| methanation | methanation | not_available | 0, 2020, 2030, 2050 | +| methane storage tank incl. compressor | methane storage tank incl. compressor | not_available | 2014 | +| methanol-to-kerosene | methanol-to-kerosene | not_available | 2020, 2030, 2050 | +| methanol-to-olefins/aromatics | methanol-to-olefins/aromatics | not_available | 2015 | +| methanolisation | methanolisation | not_available | 0, 2020, 2030, 2050 | +| natural gas direct iron reduction furnace | natural gas direct iron reduction furnace | not_available | 2020 | +| nuclear | nuclear | not_available | 2020 | +| offwind-float | offwind-float | not_available | 2020, 2030, 2040, 2050 | +| offwind-float-connection-submarine | offwind-float-connection-submarine | not_available | 2030 | +| offwind-float-connection-underground | offwind-float-connection-underground | not_available | 2030 | +| offwind-float-station | offwind-float-station | not_available | 2030 | +| organic rankine cycle | organic rankine cycle | not_available | 2020 | +| seawater RO desalination | seawater RO desalination | not_available | 0 | +| shipping fuel methanol | shipping fuel methanol | not_available | 2020 | +| steel carbon capture retrofit | steel carbon capture retrofit | not_available | 2030 | +| uranium | uranium | not_available | 2020 | +``` + +### Parameters + +`entries` counts the technology entries (one per name, case and year) that carry the parameter. + +``` py +>>> params = pd.DataFrame( +... [(key, str(p.units), str(p.carrier)) for t in techs for key, p in t.parameters.items()], +... columns=["parameter", "units", "carriers"], +... ) +>>> print( +... params.groupby("parameter", as_index=False) +... .agg(units=("units", join), carriers=("carriers", join), entries=("units", "size")) +... .to_markdown(index=False) +... ) +| parameter | units | carriers | entries | +|:------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------:| +| CO2 intensity | metric_ton / megawatt_hour | carbon_dioxide / electricity, carbon_dioxide / thermal | 3 | +| FOM | percent / year | | 190 | +| VOM | EUR_2010 / kilowatt, EUR_2010 / megawatt_hour, EUR_2015 / megawatt_hour, EUR_2015 / metric_ton, EUR_2020 / megawatt_hour, EUR_2023 / megawatt_hour | 1 / cement, 1 / clinker, 1 / electricity, 1 / ethanol, 1 / high_value_chemicals, 1 / hydrogen, 1 / kerosene | 32 | +| ammonia-input | dimensionless | ammonia / hydrogen | 1 | +| capacity | metric_ton | ammonia, dehydrogenated_dibenzyltoluene, fischer_tropsch, hydrogen, methane, methanol | 8 | +| capture_rate | percent | | 13 | +| carbondioxide-input | dimensionless, metric_ton / megawatt_hour | carbon_dioxide / fischer_tropsch, carbon_dioxide / methane, carbon_dioxide / methanol, dimensionless | 8 | +| carbondioxide-output | dimensionless | carbon_dioxide / high_value_chemicals | 2 | +| clinker-input | dimensionless | clinker / cement | 1 | +| coal-input | dimensionless, megawatt_hour / metric_ton | coal / hydrogen, coal / steel | 7 | +| commodity | EUR_2020 / metric_ton | | 1 | +| compression-electricity-input | dimensionless | electricity / hydrogen | 2 | +| district heat surcharge | percent | | 1 | +| district heat-input | dimensionless | dimensionless | 1 | +| economic_lifetime | year | | 5 | +| efficiency | percent | | 28 | +| electricity-input | 1 / meter, dimensionless, megawatt_hour / metric_ton | 1 / carbon_dioxide, electricity / ammonia, electricity / carbon_dioxide, electricity / cement, electricity / clinker, electricity / fischer_tropsch, electricity / high_value_chemicals, electricity / hot_briquetted_iron, electricity / hydrogen, electricity / hydrogenated_dibenzyltoluene, electricity / methane, electricity / methanol, electricity / nitrogen, electricity / steel, electricity / thermal, electricity / water | 68 | +| fuel | EUR_2010 / megawatt_hour, EUR_2020 / megawatt_hour | 1 / thermal | 22 | +| gas-input | dimensionless, megawatt_hour / metric_ton | 1 / carbon_dioxide, natural_gas / clinker, natural_gas / hot_briquetted_iron, natural_gas / hydrogen | 10 | +| hbi-input | dimensionless | hot_briquetted_iron / steel | 2 | +| heat-input | megawatt_hour / metric_ton | thermal / carbon_dioxide | 4 | +| heat-output | dimensionless | thermal / methanol | 1 | +| hydrogen-input | dimensionless, megawatt_hour / metric_ton | dimensionless, hydrogen / ammonia, hydrogen / fischer_tropsch, hydrogen / hot_briquetted_iron, hydrogen / hydrogenated_dibenzyltoluene, hydrogen / kerosene, hydrogen / methane, hydrogen / methanol | 12 | +| investment | EUR_2004 * hour / metric_ton, EUR_2005 / kilowatt, EUR_2010 / kilowatt, EUR_2010 / megawatt_hour, EUR_2011 / kilometer / megawatt, EUR_2011 / megawatt, EUR_2012 / meter ** 3, EUR_2012 / metric_ton, EUR_2013 / metric_ton, EUR_2014 / kilometer / megawatt, EUR_2014 / meter ** 3, EUR_2015, EUR_2015 * hour / kilometer / metric_ton, EUR_2015 * hour / metric_ton, EUR_2015 / kilowatt, EUR_2015 / megawatt, EUR_2015 / megawatt_hour, EUR_2017 / kilometer / megawatt, EUR_2017 / kilowatt, EUR_2017 / megawatt, EUR_2019, EUR_2019 / meter ** 3, EUR_2020, EUR_2020 * hour / metric_ton, EUR_2020 / kilometer / megawatt, EUR_2020 / kilowatt, EUR_2020 / kilowatt_hour, EUR_2020 / megawatt, EUR_2020 / metric_ton, EUR_2022 / kilowatt, EUR_2023 / kilometer / megawatt, EUR_2023 / kilowatt, EUR_2023 / kilowatt_hour, USD_2019 * hour / metric_ton, USD_2022 / kilowatt, USD_2022 / kilowatt_hour, USD_2022 / megawatt, USD_2023 * hour / metric_ton | 1 / ammonia, 1 / carbon_dioxide, 1 / cement, 1 / clinker, 1 / electricity, 1 / ethanol, 1 / fischer_tropsch, 1 / high_value_chemicals, 1 / hot_briquetted_iron, 1 / hydrogen, 1 / kerosene, 1 / methane, 1 / methanol, 1 / steel, 1 / thermal | 213 | +| lifetime | year | | 129 | +| lohc-input | dimensionless | dehydrogenated_dibenzyltoluene / hydrogenated_dibenzyltoluene | 1 | +| methane-input | dimensionless | dimensionless, methane / hydrogen | 2 | +| methanol-input | dimensionless, megawatt_hour / metric_ton | methanol / high_value_chemicals, methanol / hydrogen, methanol / kerosene | 3 | +| min_fill_level | percent | | 2 | +| naphtha-input | megawatt_hour / metric_ton | naphtha / high_value_chemicals | 1 | +| nitrogen-input | metric_ton / megawatt_hour | nitrogen / ammonia | 1 | +| oil-input | dimensionless | oil / hydrogen | 1 | +| ore-input | dimensionless | ore / hot_briquetted_iron, ore / steel | 3 | +| scrap-input | dimensionless | scrap / steel | 2 | +| slag-input | dimensionless | slag / cement | 1 | +| wood-input | dimensionless | wood / hydrogen | 3 | +``` + +## Field mapping + +| Raw column | Example raw value | Schema field | Example parsed value | +|---|---|---|---| +| `technology` | `Fischer-Tropsch` | `Technology.name`, `Technology.detailed_technology` | `Fischer-Tropsch` | +| `year` | `2020` | `Technology.year` | `2020` | +| `scenario`, `financial_case` (`usa.csv` only) | `Moderate`, `Market` | `Technology.case` | `Moderate - Market` | +| β€” (input file) | `usa.csv`, `other.csv` | `Technology.region` | `USA`, `other` | +| `parameter` | `hydrogen-input` | parameter key | `hydrogen-input` | +| `value` | `1.43` | `Parameter.magnitude` | `1.43` | +| `unit`, `currency_year` | `MWh_H2/MWh_FT`, empty | `Parameter.units`, `.carrier`, `.heating_value` | `dimensionless`, `hydrogen / fischer_tropsch`, `lower_heating_value` | +| `further_description` | `0.995 MWh_H2 per output, …` | `Parameter.note` | same text | +| `source` | `NREL, 2024 ATB Excel Workbook, …` | not kept | | + +## Naming conventions + +- **Technology names and parameter keys** are kept verbatim from PyPSA technology-data (`FOM`, `investment`, `hydrogen-input`, …), so they match PyPSA naming. +- **Cases**: `"{scenario} - {financial_case}"`, or `scenario` alone; rows without a scenario get `not_available`. +- **Units**: malformed units in `other.csv` are corrected (`tCO2` β†’ `t_CO2`, `MWhth` β†’ `MWh_th`, `kWel` β†’ `kW_el`, `,dp` dropped); `p.u.` and `per unit` are converted to `percent` (value Γ— 100); `1000km` is converted to `m` (value Γ· 10⁢); `currency_year` is folded into the currency (`USD` + `2022` β†’ `USD_2022`). +- **Capacity per hour**: `EUR/t_CO2/h` and `EUR/(t_CO2/h)` are both read as cost per capacity in t/h, `EUR * hour / metric_ton`. +- **Compound units** such as `MWh_H2/MWh_FT` are split into unit, carrier and heating value by a fixed mapping of twelve patterns in `LegacyInputDataV0134Parser._extract_units_carriers_heating_value`; carrier and heating value names are then expanded by the package registries (`H2` β†’ `hydrogen`, `LHV` β†’ `lower_heating_value`). +- **Carriers** follow the unit: a carrier in the denominator is inverted (`EUR/t_clinker` β†’ `1 / clinker`); a ratio of the same carrier becomes `dimensionless` (`MWh_H2/MWh_H2`). +- **Carrier aliases** of the raw files are renamed to the package names: `t_HLOHC` β†’ hydrogenated dibenzyltoluene, `t_LOHC` β†’ dehydrogenated dibenzyltoluene, `t_hbi` β†’ hot briquetted iron, `t_cl` β†’ clinker. + +## Assumptions and deviations from the source + +- **Heating value**: all fuel energy units are assumed to be on a lower heating value basis; the raw files do not state it. + The heating value follows the fuel energy unit: `lower_heating_value` in the numerator, `1 / lower_heating_value` in the denominator (`EUR/MWh_H2`), `lower_heating_value` for a ratio of two fuels (`MWh_H2/MWh_FT`). + Electricity, heat and units without an energy carrier (`MWh/t_CO2`) get no heating value. +- **Financial case**: `R&D` and `Market` rows of the same scenario, technology and year in `usa.csv` are merged, and the case is labelled `- Market`. + In v0.13.4 both financial cases carry identical values, so no numbers are lost, only the `R&D` label. +- **Region**: entries from `usa.csv` are labelled `USA`, entries from `other.csv` `other`; upstream uses `other.csv` for all regions other than the USA. +- **Rounding**: values are rounded to three decimals after the unit conversions, keeping at least three significant digits for small values (`1.9e-08 / meter`). + +## Reproduce + +Run from the root of a repository checkout. +The parser overwrites the files shipped with the package. + +```python +from technologydata import DataAccessor + +DataAccessor(data_source="legacy_input_data", version="v0.13.4").parse( + input_file_names=["usa.csv", "other.csv"], + num_digits=3, +) +``` + +With `archive_source=False` (the default) the existing `sources.json` is reused; `archive_source=True` archives the sources on the Wayback Machine and rewrites `sources.json`. + +## Known limitations + +- **Inconsistent parameter naming** in the data source has been kept and not parsed. E.g. parameters like `investment` likely refer to `specific investment`. +- **Year `0`**: 26 parameters of `other.csv` have no year in the raw file and are stored with year `0` in 13 entries (e.g. `Haber-Bosch`, `H2 liquefaction`), separate from the entries of the same technology with a year. +- **Overwritten values**: 3 rows of `other.csv` share technology, year and parameter with another row (`electricity-input` of `Alkaline electrolyzer medium size` and `small size`, `investment` of `Alkaline electrolyzer small size`); only the last one is kept. + +## Citation + +> PyPSA technology-data contributors: technology-data v0.13.4, `inputs/US/manual_input_usa.csv` and `inputs/manual_input.csv`, accessed 2025-10-20. + +License: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/); the underlying sources may have their own terms. + +Please also cite the underlying sources listed above and `technologydata`, see [Citing](../index.md#citing). + +## See also + +- [Data Accessor](../user_guide/data_accessor.md) + +## Parser API + +The parser is only needed to reproduce or update the dataset, see [Reproduce](#reproduce); loading the data only needs `DataAccessor.load()`. +The dispatcher selects the parser of the requested version. + +::: technologydata.parsers.legacy_input_data.LegacyInputDataParser + options: + heading_level: 3 + +::: technologydata.parsers.legacy_input_data.parser_v0134.LegacyInputDataV0134Parser + options: + heading_level: 3 diff --git a/docs/datasets/manual_input_usa.md b/docs/datasets/manual_input_usa.md deleted file mode 100644 index 88027d6e..00000000 --- a/docs/datasets/manual_input_usa.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -id: manual_input_usa -name: PyPSA technology-data manual inputs for the USA -description: USA-specific costs and efficiencies for electrolysis, batteries, CCS power plants, Fischer-Tropsch and direct air capture, compiled in PyPSA technology-data. -publisher: PyPSA technology-data contributors -upstream_url: https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv -license: CC-BY-4.0 -versions: [v0.13.4] -region: USA -raw_file: src/technologydata/parsers/raw/manual_input_usa.csv -parser: technologydata.parsers.manual_input_usa.ManualInputUsaParser ---- - -# PyPSA technology-data manual inputs for the USA - - - -A hand-curated CSV from [PyPSA technology-data](https://github.com/PyPSA/technology-data) with USA-specific parameters for electrolysers, battery storage, CCS power plants, Fischer-Tropsch synthesis, direct air capture and hydrogen storage. -The values are compiled from NREL ATB 2024, ICCT IRA e-fuels assumptions, JRC-EU-TIMES and StΓΆckl et al. (2021). - -## At a glance - -| | | -|---|---| -| Package key | `manual_input_usa` | -| Publisher | PyPSA technology-data contributors | -| Original data | [`inputs/US/manual_input_usa.csv`](https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv) (no archived copy) | -| Underlying sources | [NREL ATB 2024](https://atb.nrel.gov/electricity/2024/data), ICCT IRA e-fuels assumptions, [JRC-EU-TIMES](https://zenodo.org/records/3544900), [StΓΆckl et al. (2021)](https://doi.org/10.48550/arXiv.2005.03464) | -| License | CC-BY-4.0 | -| Region | `USA` (set by the parser) | -| Years | 2020–2050 | -| Cases | NREL ATB scenario and financial case, e.g. `Moderate - Market`; `not_available` for rows without a scenario | -| Currency | `USD_2022`, `USD_2023` | -| Raw format | CSV | -| Parser | [`ManualInputUsaParser`](../api/manual_input_usa_parser.md) | - -## Available versions - -| Version key | Upstream release | Raw file | Parse options | Status | -|---|---|---|---|---| -| `v0.13.4` | PyPSA technology-data v0.13.4 | `manual_input_usa.csv` | `num_digits=3` | latest | - -## Accessing the data - -``` py ->>> from technologydata import DataAccessor ->>> usa = DataAccessor(data_source="manual_input_usa", version="v0.13.4").load() ->>> fischer_tropsch = usa.technologies.get(name="Fischer-Tropsch", year=2020)[0] ->>> print(fischer_tropsch.parameters["hydrogen-input"]) -1.43 dimensionless, carrier=hydrogen / fischer_tropsch, heating_value=lower_heating_value -``` - -See the [tutorial](../tutorial/index.md) for filtering, unit and currency conversion. - -## Contents - -### Technologies - -``` py ->>> import pandas as pd ->>> techs = DataAccessor(data_source="manual_input_usa", version="v0.13.4").load().technologies ->>> def join(values): -... return ", ".join(sorted({str(v) for v in values} - {"None"})) ->>> print( -... techs.to_dataframe() -... .groupby(["name", "detailed_technology"], as_index=False) -... .agg(cases=("case", join), years=("year", join)) -... .to_markdown(index=False) -... ) -| name | detailed_technology | cases | years | -|:------------------------------------------------------|:------------------------------------------------------|:---------------------------------------------------------------------------|:-----------------------| -| Alkaline electrolyzer large size | Alkaline electrolyzer large size | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | -| Coal integrated retrofit 90%-CCS | Coal integrated retrofit 90%-CCS | not_available | 2030 | -| Coal integrated retrofit 95%-CCS | Coal integrated retrofit 95%-CCS | not_available | 2030 | -| Coal-95%-CCS | Coal-95%-CCS | not_available | 2030 | -| Coal-99%-CCS | Coal-99%-CCS | not_available | 2030 | -| Coal-IGCC | Coal-IGCC | not_available | 2020 | -| Coal-IGCC-90%-CCS | Coal-IGCC-90%-CCS | not_available | 2030 | -| Fischer-Tropsch | Fischer-Tropsch | not_available | 2020, 2030 | -| NG 2-on-1 Combined Cycle (F-Frame) | NG 2-on-1 Combined Cycle (F-Frame) | not_available | 2020, 2030 | -| NG 2-on-1 Combined Cycle (F-Frame) 95% CCS | NG 2-on-1 Combined Cycle (F-Frame) 95% CCS | not_available | 2030 | -| NG 2-on-1 Combined Cycle (F-Frame) 97% CCS | NG 2-on-1 Combined Cycle (F-Frame) 97% CCS | not_available | 2030 | -| NG Combined Cycle F-Class integrated retrofit 90%-CCS | NG Combined Cycle F-Class integrated retrofit 90%-CCS | not_available | 2030 | -| NG Combined Cycle F-Class integrated retrofit 95%-CCS | NG Combined Cycle F-Class integrated retrofit 95%-CCS | not_available | 2030 | -| PEM electrolyzer small size | PEM electrolyzer small size | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | -| SOEC | SOEC | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020, 2030, 2040, 2050 | -| battery inverter | battery inverter | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2022, 2030, 2040, 2050 | -| battery storage | battery storage | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2022, 2030, 2040, 2050 | -| direct air capture | direct air capture | Advanced - Market, Conservative - Market, Moderate - Market, not_available | 2020 | -| hydrogen storage compressor | hydrogen storage compressor | not_available | 2020 | -| hydrogen storage tank type 1 | hydrogen storage tank type 1 | not_available | 2020 | -``` - -### Parameters - -`entries` counts the technology entries (one per name, case and year) that carry the parameter. - -``` py ->>> params = pd.DataFrame( -... [(key, str(p.units), str(p.carrier)) for t in techs for key, p in t.parameters.items()], -... columns=["parameter", "units", "carriers"], -... ) ->>> print( -... params.groupby("parameter", as_index=False) -... .agg(units=("units", join), carriers=("carriers", join), entries=("units", "size")) -... .to_markdown(index=False) -... ) -| parameter | units | carriers | entries | -|:------------------------------|:-------------------------------------------------------------------------------------------------|:------------------------------------------------------------|----------:| -| FOM | percent / year | | 57 | -| capture_rate | percent | | 9 | -| carbondioxide-input | metric_ton / megawatt_hour | carbon_dioxide / fischer_tropsch | 1 | -| compression-electricity-input | dimensionless | electricity / hydrogen | 1 | -| efficiency | percent | | 13 | -| electricity-input | dimensionless, megawatt_hour / metric_ton | electricity / carbon_dioxide, electricity / fischer_tropsch | 2 | -| heat-input | megawatt_hour / metric_ton | thermal / carbon_dioxide | 1 | -| hydrogen-input | dimensionless | hydrogen / fischer_tropsch | 1 | -| investment | USD_2022 / kilowatt, USD_2022 / kilowatt_hour, USD_2022 / megawatt, USD_2023 / hour / metric_ton | 1 / carbon_dioxide, 1 / fischer_tropsch, 1 / hydrogen | 66 | -| lifetime | year | | 17 | -| min_fill_level | percent | | 1 | -``` - -## Field mapping - -| Raw column | Example raw value | Schema field | Example parsed value | -|---|---|---|---| -| `technology` | `Fischer-Tropsch` | `Technology.name`, `Technology.detailed_technology` | `Fischer-Tropsch` | -| `year` | `2020` | `Technology.year` | `2020` | -| `scenario`, `financial_case` | `Moderate`, `Market` | `Technology.case` | `Moderate - Market` | -| β€” | β€” | `Technology.region` | `USA` | -| `parameter` | `hydrogen-input` | parameter key | `hydrogen-input` | -| `value` | `1.43` | `Parameter.magnitude` | `1.43` | -| `unit`, `currency_year` | `MWh_H2/MWh_FT`, empty | `Parameter.units`, `.carrier`, `.heating_value` | `dimensionless`, `hydrogen / fischer_tropsch`, `lower_heating_value` | -| `further_description` | `0.995 MWh_H2 per output, …` | `Parameter.note` | same text | -| `source` | `NREL, 2024 ATB Excel Workbook, …` | not kept | | - -## Naming conventions - -- **Technology names and parameter keys** are kept verbatim from PyPSA technology-data (`FOM`, `investment`, `hydrogen-input`, …), so they match PyPSA naming. -- **Cases**: `"{scenario} - {financial_case}"`, or `scenario` alone; rows without a scenario get `not_available`. -- **Units**: `per unit` is converted to `percent` (value Γ— 100); `currency_year` is folded into the currency (`USD` + `2022` β†’ `USD_2022`). -- **Compound units** such as `MWh_H2/MWh_FT` are split into unit, carrier and heating value by a fixed mapping of nine patterns in `ManualInputUSAV0134Parser._extract_units_carriers_heating_value`; carrier and heating value names are then expanded by the package registries (`H2` β†’ `hydrogen`, `LHV` β†’ `lower_heating_value`). - -## Assumptions and deviations from the source - -- **Heating value**: all compound energy units are assumed to be on a lower heating value basis; the raw file does not state it. -- **Financial case**: `R&D` and `Market` rows of the same scenario, technology and year are merged, and the case is labelled `- Market`. - In v0.13.4 both financial cases carry identical values, so no numbers are lost, only the `R&D` label. -- **Region**: every entry is labelled `USA`. - -## Reproduce - -Run from the root of a repository checkout. -The parser overwrites the files shipped with the package. - -```python -from technologydata import DataAccessor - -DataAccessor(data_source="manual_input_usa", version="v0.13.4").parse( - input_file_name="manual_input_usa.csv", - num_digits=3, -) -``` - -With `archive_source=False` (the default) the existing `sources.json` is reused; `archive_source=True` archives the source on the Wayback Machine and rewrites `sources.json`. - -## Known limitations - -- **Row-level sources are dropped.** Every parameter cites the CSV as a single source; the original reference (NREL ATB 2024, ICCT, JRC-EU-TIMES, StΓΆckl et al.) is only in the `source` column of the raw file. -- **No archived source**: `sources.json` has no Wayback Machine copy. -- **Sparse coverage**: most technologies outside the NREL ATB have a single year and no scenario (`not_available`). - -## Citation - -> PyPSA technology-data contributors: technology-data v0.13.4, `inputs/US/manual_input_usa.csv`, accessed 2025-10-20. - -License: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/); the underlying sources may have their own terms. - -Please also cite the underlying sources listed above and `technologydata`, see [Citing](../index.md#citing). - -## See also - -- [Manual Input USA Parser](../user_guide/manual_input_usa_parser.md) (user guide) and [API reference](../api/manual_input_usa_parser.md) -- [Data Accessor](../user_guide/data_accessor.md) diff --git a/docs/home/faq.md b/docs/home/faq.md index a565c19d..8b635a63 100644 --- a/docs/home/faq.md +++ b/docs/home/faq.md @@ -12,7 +12,7 @@ A data source is a package of a name, one or more versioned parsers, and a dispa ## If I use the package today, will the data change when I update the package later? -Datasets are shipped in version-pinned directories β€” `dea_energy_storage/v10`, `manual_input_usa/v0.13.4` β€” and are selected with the `version` argument of `DataAccessor`. +Datasets are shipped in version-pinned directories β€” `dea_energy_storage/v10`, `legacy_input_data/v0.13.4` β€” and are selected with the `version` argument of `DataAccessor`. A new version of the package will not change the data of existing versions unless for fixing incorrectly extracted values. If newer editions of a catalogue become available, they will not replace an existing version, but be available under the new version name. If you use the package in a production-ready application we recommend you pin the version of the data that you are using - by default the data accessors provide the `latest` version of the data available. diff --git a/docs/index.md b/docs/index.md index b7698256..2aad8d93 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,14 @@ Harmonising to combine multiple sources into one energy system model therefore r This package contains a data schema and represents the techno-economic assumptions as Python objects. The objects called `Parameter` carry not only values ("magnitude"), but also unit information, currency year, energy carrier, heating-value basis, provenance and bibliographic sources. Commonly used conversions are available, parameters can be checked for consistency. -Provenance information for modifying parameters is automatically recorded, e.g. to keep track of currency conversion factors or formulas used for calculation. +Sources stay attached through conversions and arithmetic, and parameters derived with the built-in equations record the formula and input values used. + +The package is meant for energy system modellers who: + +- combine assumptions from more than one source, or from a source and their own numbers; +- convert between currencies, price years, units and heating values without losing track of what was converted; +- need to know where each number came from and how it was calculated; +- derive related parameters or check them for consistency, and project values to years their sources do not cover. ## Installation @@ -42,6 +49,8 @@ uv add install technologydata The package requires Python 3.12 or newer. The bundled datasets are installed with it; no additional download step is needed. +New to `technologydata`? Start with the [Overview](overview.md). + ## Features of the package - **Unit-ful parameters.** @@ -89,7 +98,7 @@ import technologydata # Load data provided by the DEA dea = technologydata.DataAccessor(data_source="dea_energy_storage", version="v10").load() # Load data from NREL's ATB2024 -atb = technologydata.DataAccessor(data_source="manual_input_usa", version="v0.13.4").load() +atb = technologydata.DataAccessor(data_source="legacy_input_data", version="v0.13.4").load() # We get the data specific to battery storage and adjust the currency year # from 2022 to 2023. By default the inflation adjustment uses World Bank data diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000..365015cd --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,237 @@ +# Overview + + + +This page introduces the building blocks of `technologydata` in a few short steps: parameters, technologies, collections of technologies, the datasets that ship with the package, and data packages for saving and sharing data. +It assumes `technologydata` is [installed](./index.md#installation). +For the motivation behind each concept, see the [Tutorial](tutorial/index.md). + +## 1. Parameters with units + +A `Parameter` is a value with a unit. +Currencies are written as the currency code and the price year, e.g. `EUR_2020`. + +``` py +>>> from technologydata import Parameter +>>> specific_investment = Parameter(magnitude=250_000, units="EUR_2020/MWh") +>>> capacity = Parameter(magnitude=100, units="MWh") +``` + +Calculations and conversions keep track of the units: + +``` py +>>> investment = specific_investment * capacity +>>> print(investment) +25000000 EUR_2020 +>>> print(specific_investment.to("EUR_2020/kWh")) +250.0 EUR_2020 / kilowatt_hour +>>> grid_connection = Parameter(magnitude=1_500_000, units="EUR_2020") +>>> print(investment + grid_connection) +26500000 EUR_2020 +``` + +Compatible units are converted automatically, incompatible ones raise an error instead of returning a wrong number: + +``` py +>>> print(capacity + Parameter(magnitude=500, units="kWh")) +100.5 megawatt_hour +>>> capacity + Parameter(magnitude=20, units="MW") +Traceback (most recent call last): +... +pint.errors.DimensionalityError: Cannot convert from 'megawatt_hour' ([mass] * [length] ** 2 / [time] ** 2) to 'megawatt' ([mass] * [length] ** 2 / [time] ** 3) +``` + +The same applies to different energy carriers or currencies. + +More: carriers, heating values and all operations in the [Parameter guide](user_guide/parameter.md). + +## 2. Technologies + +A `Technology` groups the parameters of one technology for a region, a year and a case, e.g. a scenario or an estimate. + +``` py +>>> from technologydata import Technology +>>> battery = Technology( +... name="battery", +... detailed_technology="utility-scale lithium-ion battery", +... region="EU", +... year=2030, +... case="example", +... parameters={ +... "specific_investment": specific_investment, +... "capacity": capacity, +... "lifetime": Parameter(magnitude=20, units="year"), +... }, +... ) +>>> print(battery.parameters["lifetime"]) +20 year +``` + +Many parameters are linked by equations, e.g. total investment = specific investment Γ— capacity. +`calculate_parameters()` derives missing parameters from the ones a technology has, using the equations built into the package: + +``` py +>>> battery = battery.calculate_parameters("total_investment_cost") +>>> print(battery.parameters["total_investment_cost"]) +25000000.0 EUR_2020 +``` + +The equations identify parameters by name (`specific_investment`, `capacity`, `total_investment_cost`, …). + +More: all built-in equations and how to add your own in the [equation system guide](user_guide/equations.md). + +## 3. Technology collections + +### 3.1 Grouping technologies + +A `TechnologyCollection` holds several technologies, e.g. the same technology in different years, or different technologies. +`get()` selects technologies by `name`, `detailed_technology`, `region`, `year` and `case`, and returns a new collection: + +``` py +>>> from technologydata import TechnologyCollection +>>> battery_2040 = Technology( +... name="battery", +... detailed_technology="utility-scale lithium-ion battery", +... region="EU", +... year=2040, +... case="example", +... parameters={"specific_investment": Parameter(magnitude=200_000, units="EUR_2020/MWh")}, +... ) +>>> batteries = TechnologyCollection(technologies=[battery, battery_2040]) +>>> print(batteries.get(year=2040)[0]) +Technology('battery', region='EU', year=2040, case='example', 1 parameters: ['specific_investment']) +``` + +More: filtering with regular expressions and exporting to pandas, CSV and JSON in the [TechnologyCollection guide](user_guide/technology_collection.md). + +### 3.2 Values from a bundled dataset + +The package ships with parsed [datasets](datasets/index.md), each loaded as a collection of technologies. +The `DataAccessor` loads one by its key and version; here the [energy storage catalogue](datasets/dea_energy_storage.md) of the Danish Energy Agency (DEA). +We select utility-scale lithium-ion battery storage, using the DEA central estimate (`case="control"`), and read its lifetime and specific investment in 2030: + +``` py +>>> from technologydata import DataAccessor +>>> dea = DataAccessor(data_source="dea_energy_storage", version="v10").load() +>>> dea_batteries = dea.technologies.get(name="lithium ion battery", case="control") +>>> print([t.year for t in dea_batteries]) +[2025, 2030, 2035, 2040, 2050] +>>> dea_battery = dea_batteries.get(year=2030)[0] +>>> print(dea_battery.detailed_technology) +lithium-ion battery (utility-scale) +>>> print(dea_battery.parameters["technical lifetime"]) +20.0 year +>>> print(dea_battery.parameters["specific investment"]) +279000.0 EUR_2020 / megawatt_hour +``` + +Parameter names follow the dataset; the [fact sheet](datasets/dea_energy_storage.md) of each dataset lists all technologies and parameters. + +More: loading options in the [DataAccessor guide](user_guide/data_accessor.md). + +### 3.3 Projections with growth models + +The DEA gives no value for 2045. +`project()` fits a growth model to a parameter across the years in a collection and returns the projected years as a new collection. +Here we use a linear model (`LinearGrowth`) to interpolate between `2040` and `2050` values in the DEA dataset: + +``` py +>>> from technologydata.technologies.growth_models import LinearGrowth +>>> projected = dea_batteries.project( +... to_years=[2045], +... parameters={"specific investment": LinearGrowth()}, +... ) +>>> print(round(projected[0].parameters["specific investment"].magnitude)) +305770 +``` + +More models and functionality are available: exponential, logistic and other growth models in the [models guide](user_guide/models.md) and [projecting collections](user_guide/technology_collection.md#projecting-parameters). + +## 4. Harmonising currencies and inflation + +Values in different currencies or price years cannot be combined directly: + +``` py +>>> investment + Parameter(magnitude=1_500_000, units="EUR_2024") +Traceback (most recent call last): +... +ValueError: Operation not permitted on parameters with different currencies or currency years: 'EUR_2020' and 'EUR_2024'. Use `to_currency` to convert to the same currency before performing the operation. +``` + +`to_currency()` converts to another currency and price year, adjusting for inflation with the deflator of the given country (ISO 3166 alpha-3 code). +(Note: The region `EU` is not a country, so we use Germany `= DEU` for inflation indicators:) + +``` py +>>> dea_investment = dea_battery.parameters["specific investment"].to_currency("EUR_2024", country="DEU") +>>> print(round(dea_investment.magnitude), dea_investment.units) +335418 EUR_2024 / megawatt_hour +``` + +The inflation and exchange rate data (World Bank by default) is downloaded on first use and then cached so this operation is only slow upon first use. +This functionality is also available on `TechnologyCollections`, allowing for quick harmonisation across multiple technologies into one harmonised dataset. + +The total investment of a fictitious 400 MWh project in 2024 prices is then: + +``` py +>>> project_investment = dea_investment * Parameter(magnitude=400, units="MWh") +>>> print(f"{project_investment.magnitude / 1e6:.1f} million {project_investment.units}") +134.2 million EUR_2024 +``` + +The result keeps the DEA catalogue as its source, so the number stays traceable; see the [Source guide](user_guide/source.md). + +More: data sources and options for the conversion in the [Parameter guide](user_guide/parameter.md#currency-and-inflation-adjustment). + +## 5. Consistency checks + +`check_consistency()` uses standard or your custom equations to check that the parameters of a technology agree with each other. +The battery from section 2 is consistent; after changing its capacity, its total investment no longer matches and this error is highlighted: + +``` py +>>> battery.check_consistency(parameters=["total_investment_cost"]) +{'eac_simple': "missing parameters: ['eac']", 'total_investment_from_specific': True} +>>> battery.parameters["capacity"] = Parameter(magnitude=120, units="MWh") +>>> battery.check_consistency(parameters=["total_investment_cost"]) +{'eac_simple': "missing parameters: ['eac']", 'total_investment_from_specific': False} +``` + +Equations that lack a parameter are reported as such rather than checked. + +More: checking and deriving parameters in the [Technology guide](user_guide/technology.md#calculating-parameters-and-checking-consistency). + +## 6. Data packages: saving and loading + +A `DataPackage` bundles a collection of technologies with their sources under a name and a version; `DataAccessor.load()` returns one. +It follows the data schema of `technologydata`, the same format the bundled datasets are stored in, so your own packages can be shared and loaded the same way. +Here we store the DEA battery series as our own package: + +``` py +>>> import pathlib, tempfile +>>> from technologydata import DataPackage +>>> package = DataPackage(name="my-batteries", version="v1", technologies=dea_batteries) +>>> package.get_source_collection() +>>> print(len(package.sources)) +1 +>>> folder = pathlib.Path(tempfile.mkdtemp()) +>>> package.to_json(folder) +>>> print(sorted(p.name for p in folder.iterdir())) +['sources.json', 'technologies.json'] +>>> reloaded = DataPackage.from_json("my-batteries", "v1", folder) +>>> print(reloaded.technologies.get(year=2030)[0].parameters["specific investment"]) +279000.0 EUR_2020 / megawatt_hour +``` + +`get_source_collection()` collects the sources of all parameters into `package.sources`. +`to_csv()` writes the same content as CSV files for spreadsheets, and `TechnologyCollection.to_json(..., output_schema=True)` also writes the JSON schema describing the file format. + +More: file formats and the JSON round trip in the [DataPackage guide](user_guide/datapackage.md). + +## Next steps + +- The [tutorial](tutorial/index.md) goes further: comparing two datasets and working with the equations in more detail. +- The [User Guide](user_guide/technology.md) and the [API Reference](api/technology.md) describe every class in detail. diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index dc811b17..9d134ea8 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -7,334 +7,297 @@ SPDX-License-Identifier: MIT --> -This tutorial walks through the features of `technologydata` and how to use them. -It shows how to use `Parameter` and `Technology` objects, use the functionalities of the package, and combine them into a packaged data follow our data schema (a `DataPackage`). -All manual steps are shown, as well as how to utilise some pre-parsed and packaged data from the Danish Energy Agency. +This tutorial introduces the concepts of `technologydata` one at a time, and explains why each of them exists. +It builds one example from a single number up to a dataset you can save and share: the assumptions for a hydrogen electrolyser. +Basic Python (variables, function calls, dictionaries) is enough to follow along. +For a faster, code-first tour, see the [Overview](../overview.md). -## Who this package is for +The numbers used here are illustrative, not taken from a study. -Techno-economic data is central to energy system models. -They usually utilise data catalogues that are published in different currencies, price years, units, heating-value conventions and naming schemes. -Comparing, combining and harmonising them means making these changes and tracking them all by hand - a highly repetitive and error-prone process. +## 1. Why `technologydata`? -This is where `technologydata` is meant to support you. -It helps to: +Energy system models need many techno-economic assumptions: investment costs, efficiencies, lifetimes. +They come from studies and catalogues that each use their own units, currencies, price years and conventions. +In a spreadsheet these are plain numbers, and nothing stops you from: -- combine assumptions from more than one source, or from a source and your own numbers; -- convert between currencies, price years and units without losing track of what was converted; -- keep a record of where each number came from and how it was calculated -- supports through an equation system derived parameters and consistency checks -- provides common models for scenario interpolation and projection +- adding a capacity in MW to an energy in MWh; +- comparing a cost in 2020 euros with one in 2024 euros, as if there were no inflation; +- mixing hydrogen quantities on the lower and the higher heating value, which differ by about 18 %; +- losing track of which study a number came from. -## 1. A parameter that knows its units +Each of these mistakes silently produces a wrong result. +`technologydata` makes the context of a number (its unit, price year, energy carrier, heating value and source) part of the number itself. +Mistakes like the ones above then raise an error, and conversions between conventions are done for you. -The smallest useful object is a `Parameter`: a magnitude, a unit, an (energy) carrier, a heating value and the source it came from. +## 2. Parameters: numbers with units + +A single assumption is a `Parameter`: a value, called `magnitude`, and its `units`. +Our electrolyser costs 1,000 euros, in 2020 prices, per kilowatt of electric input: ``` py ->>> from technologydata import Parameter, Source, SourceCollection ->>> investment = Parameter(magnitude=288000.0, units="EUR_2020/MWh", carrier="H2", heating_value="LHV") +>>> from technologydata import Parameter +>>> investment = Parameter(magnitude=1000, units="EUR_2020/kW") >>> print(investment) -288000.0 EUR_2020 / megawatt_hour, carrier=hydrogen, heating_value=lower_heating_value +1000 EUR_2020 / kilowatt ``` -The unit string is parsed rather than stored verbatim, which is why `EUR_2020/MWh` comes back as `EUR_2020 / megawatt_hour`. -A currency is written as a three-letter code, an underscore and the price year - `EUR_2020`. -Generally SI-Prefixes such as `M` or `k` are supported, but not for currency units. -A value like `MEUR_2020` would therefore be manually converted to million `EUR_2020` by you. -The carrier and heating value information allows to distinguish between carriers and their carriers for unit parts. -E.g. `MWh` may reference to `MWh` of hydrogen at its lower heating value (LHV); -a unit like this is not directly compatible with different carriers and heating values. -The additional carrier and heating value information appears like the unit in the denominator. -`technologydata` does prevent operations on units where carrier and heating value information is incompatible. - -The unit can be converted to get e.g. the investments per `kWh`: +The unit is understood, not just stored as text, so it can be converted: ``` py ->>> per_kwh = investment.to("EUR_2020/kWh") ->>> print(per_kwh.magnitude, per_kwh.units) -288.0 EUR_2020 / kilowatt_hour +>>> print(investment.to("EUR_2020/MW")) +1000000.0 EUR_2020 / megawatt ``` -## 2. A `Technology` bundles related parameters - -A `Technology` groups parameters that describe the same technology for a year and in a certain scenario, we call it a "case". +It also means that operations that make no physical sense are refused. +The capacity of the electrolyser is a power (MW); what it consumes over time is an energy (MWh). +The two are easily confused, and adding them is an error: ``` py ->>> from technologydata import DataPackage, Technology, TechnologyCollection ->>> battery = Technology( -... name="lithium ion battery", -... detailed_technology="lithium-ion battery (utility-scale)", -... region="EU", -... year=2025, -... case="control", -... parameters={ -... "specific investment": investment, -... "lifetime": Parameter(magnitude=30, units="year"), -... }, -... ) ->>> print(battery) -Technology('lithium ion battery', region='EU', year=2025, case='control', 2 parameters: ['specific investment', 'lifetime']) +>>> capacity = Parameter(magnitude=10, units="MW") +>>> capacity + Parameter(magnitude=5, units="MWh") +Traceback (most recent call last): +... +pint.errors.DimensionalityError: Cannot convert from 'megawatt' ([mass] * [length] ** 2 / [time] ** 3) to 'megawatt_hour' ([mass] * [length] ** 2 / [time] ** 2) ``` -A `Technology` is just its identifying fields (`name`, `detailed_technology`, `case`, `region`, `year`) plus a `parameters` dictionary of named `Parameter` objects β€” nothing more is hidden inside it. Printing it shows a compact summary with the parameter names. +An error at this point is much cheaper than a wrong number deep inside a model. +Units are handled by [pint](https://pint.readthedocs.io); the [Parameter guide](../user_guide/parameter.md) lists all operations. -## 3. Track a technology across years +## 3. Currencies and price years -If we want to track technology parameters over multiple years, we use multiple `Technology` objects per year. -A `TechnologyCollection` holds several of them together: +A cost is only meaningful together with the year of its prices: because of inflation, 1,000 euros in 2020 bought more than 1,000 euros in 2024. +Studies report costs in different price years, so comparing them requires adjusting for inflation first. +In `technologydata` the price year is therefore part of the currency unit, e.g. `EUR_2020`, and costs in different price years cannot be combined by accident: ``` py ->>> battery_2030 = Technology( -... name="lithium ion battery", -... detailed_technology="lithium-ion battery (utility-scale)", -... region="EU", -... year=2030, -... case="control", -... parameters={ -... "specific investment": Parameter(magnitude=230000.0, units="EUR_2020/MWh"), -... "lifetime": Parameter(magnitude=30, units="year"), -... }, -... ) ->>> battery_2035 = Technology( -... name="lithium ion battery", -... detailed_technology="lithium-ion battery (utility-scale)", -... region="EU", -... year=2035, -... case="control", -... parameters={ -... "specific investment": Parameter(magnitude=190000.0, units="EUR_2020/MWh"), -... "lifetime": Parameter(magnitude=30, units="year"), -... }, -... ) ->>> battery_over_time = TechnologyCollection(technologies=[battery, battery_2030, battery_2035]) ->>> print(sorted(t.year for t in battery_over_time.technologies)) -[2025, 2030, 2035] +>>> investment + Parameter(magnitude=50, units="EUR_2024/kW") +Traceback (most recent call last): +... +ValueError: Operation not permitted on parameters with different currencies or currency years: 'EUR_2020 / kilowatt' and 'EUR_2024 / kilowatt'. Use `to_currency` to convert to the same currency before performing the operation. ``` -Nothing ties these three objects together except sharing a `name`, `detailed_technology`, `region` and `case` β€” the collection does not require or enforce a fixed set of years, so it can hold as many or as few as you have data for. - -## 4. Bundle many technologies into a `DataPackage` - -A `TechnologyCollection` is not limited to one technology's history. -It can hold entirely different technologies side by side. -When you want to share your collection with others or store them in a project, they are best stored as a `DataPackage`. -This is our data schema that allows for reliable writing to file / reading from file and smooth data exchange with others. -For now the `DataPackage` supports `json` and `csv` file formats. -These formats have the advantage of being human-readable, although the files they produce are a bit larger. -In the future we will make other file formats available. - -A `DataPackage` also includes information on all the sources used for the technologies and stores them as a combined `SourceCollection`. -This collection can be used for generating e.g. bibliographies or summarising all the sources used for a project. +`to_currency()` converts to another price year or currency. +It uses the inflation and exchange rates of a country, given as a three-letter ISO code, because inflation differs between countries: ``` py ->>> wind = Technology( -... name="onshore wind", -... detailed_technology="onshore wind turbine", -... region="EU", -... year=2025, -... case="control", -... parameters={ -... "specific investment": Parameter(magnitude=1_200_000.0, units="EUR_2020/MW"), -... }, -... ) ->>> sources = SourceCollection(sources=[Source( -... title="Technology Data for Energy storage (May 2025)", -... authors="Danish Energy Agency", -... url="https://ens.dk/media/6589/download", -... )]) ->>> package = DataPackage( -... name="my-assumptions", -... version="v1", -... technologies=TechnologyCollection( -... technologies=battery_over_time.technologies + [wind] -... ), -... sources=sources, -... ) ->>> print(package.name, package.version, len(package.technologies.technologies)) -my-assumptions v1 4 +>>> investment_2024 = investment.to_currency("EUR_2024", country="DEU") +>>> print(round(investment_2024.magnitude), investment_2024.units) +1202 EUR_2024 / kilowatt ``` -The package now bundles four technologies β€” three years of the battery plus the unrelated wind turbine β€” under one set of sources. `DataPackage` requires a `name` and a `version` as well as the data; they are what `from_json()` uses to identify the package later. +With German inflation, the same electrolyser costs about 20 % more in 2024 euros; ignoring this would make it look cheaper than technologies costed in 2024 prices. +The rates come from the World Bank by default and are downloaded on first use. +More options are in the [Parameter guide](../user_guide/parameter.md#currency-and-inflation-adjustment). + +## 4. Energy carriers and heating values -## 5. Load a published catalogue +For energy, units alone are not enough: 1 MWh of electricity is not the same as 1 MWh of hydrogen. +Hydrogen can also be measured on two bases: the lower heating value (LHV) excludes the energy in the water vapour formed when it burns, the higher heating value (HHV) includes it. +Studies use both, so a `Parameter` can record its `carrier` and `heating_value`. -Writing technologies by hand does not scale well. -The idea of `technologydata` is that many people contribute to larger databases that everyone can then use in their projects. -For now the package ships with some parsed catalogues which you can load and use right away. -Two of them are the Energy Storage Catalogue from the Danish Energy Agency, and the Annual Technology Baseline from NLR, formerly NREL. -To load them, use the `DataAccessor`: +The efficiency of our electrolyser is 0.65 MWh of hydrogen (LHV) per MWh of electricity: ``` py ->>> from technologydata import DataAccessor ->>> dea = DataAccessor(data_source="dea_energy_storage", version="v10").load() ->>> usa = DataAccessor(data_source="manual_input_usa", version="v0.13.4").load() ->>> print(dea.name, dea.version, len(dea.technologies.technologies)) -dea_energy_storage v10 136 ->>> print(usa.name, usa.version, len(usa.technologies.technologies)) -manual_input_usa v0.13.4 85 +>>> efficiency = Parameter(magnitude=0.65, units="MWh/MWh", carrier="H2/el", heating_value="LHV") +>>> print(efficiency) +0.65 dimensionless, carrier=hydrogen / electricity, heating_value=lower_heating_value ``` -Both come back as `DataPackage` objects, the same shape as `package` from the previous section β€” just with a lot more technologies inside. +The units cancel, but the carrier keeps what the ratio means. +Hydrogen quantities can be converted between heating values, and quantities on different bases cannot be added: -## 6. Select one technology +``` py +>>> hydrogen = Parameter(magnitude=650, units="MWh", carrier="H2", heating_value="LHV") +>>> hydrogen_hhv = hydrogen.change_heating_value("HHV") +>>> print(round(hydrogen_hhv.magnitude, 1), hydrogen_hhv.units) +767.5 megawatt_hour +>>> hydrogen + Parameter(magnitude=100, units="MWh", carrier="H2", heating_value="HHV") +Traceback (most recent call last): +... +ValueError: Operation not permitted on parameters with different heating values: 'lower_heating_value' and 'higher_heating_value'. +``` -`TechnologyCollection.get()` filters on five attributes and returns a new collection. +The same holds for different carriers, e.g. adding electricity to hydrogen. +See [handling different heating values](../user_guide/parameter.md#handling-different-heating-values) for the supported carriers. -!!! warning "`get()` matches regular expressions, not literal text" - Every argument is compiled as a regex, so `(` and `)` are read as a group rather than as brackets. A name containing them silently matches nothing. Pass it through `re.escape()` or escape them using `\(` and `\)`. +## 5. Sources and provenance + +A number without a source cannot be checked, cited or updated when a new study comes out. +A `Parameter` therefore carries `sources`, the references it comes from, and `provenance`, a record of how the value was obtained: ``` py ->>> import re ->>> selected = dea.technologies.get( -... name="lithium ion battery", -... region="EU", -... year=2030, -... case="control", -... detailed_technology=re.escape("lithium-ion battery (utility-scale)"), +>>> from technologydata import Source, SourceCollection +>>> study = Source(title="Illustrative electrolyser assumptions", authors="technologydata tutorial") +>>> investment = Parameter( +... magnitude=1000, +... units="EUR_2020/kW", +... sources=SourceCollection(sources=[study]), +... provenance=["illustrative value for this tutorial"], ... ) ->>> print(len(selected.technologies)) -1 +>>> print(investment.to_currency("EUR_2024", country="DEU").sources) +SourceCollection with 1 sources: 'technologydata tutorial': 'Illustrative electrolyser assumptions' ``` -Without `re.escape()` the same call returns an empty collection rather than raising, so a silent zero is the symptom to watch for. +The source stays attached through conversions and arithmetic, so a converted value can still be traced back to its study. +A `Source` can also hold a URL and be archived on the Wayback Machine, see the [Source guide](../user_guide/source.md). +The `provenance` records what happened to the value: unit, currency and heating value conversions and arithmetic each add an entry, see [provenance tracking](../user_guide/parameter.md#provenance-tracking). + +## 6. Technologies -## 7. Compare two catalogues +A model needs several parameters per technology, and needs to know exactly what they describe. +A `Technology` groups parameters with the fields that identify them: -This is what the bookkeeping was for. The Danish figure is in `EUR_2020` per MWh; the USA figure is in `USD_2022` per kWh. Converting both to `USD_2023` per kWh makes them comparable. +- `name`: the short name used to find the technology; +- `detailed_technology`: the specific variant, e.g. PEM or alkaline electrolyser; +- `region`: where the values apply, since costs differ between countries; +- `year`: the year the values apply to, since costs of new technologies fall over time; +- `case`: the scenario or estimate, since catalogues often give a central estimate and a range. ``` py ->>> dea_investment = selected.technologies[0].parameters["specific investment"] ->>> dea_2023 = dea_investment.to_currency("USD_2023", country="DEU").to("USD_2023/kWh") ->>> usa_battery = next( -... t -... for t in usa.technologies.technologies -... if t.detailed_technology == "battery storage" -... and t.year == 2030 -... and t.case == "Moderate - Market" +>>> from technologydata import Technology +>>> electrolyser = Technology( +... name="electrolyser", +... detailed_technology="PEM electrolyser", +... region="DEU", +... year=2030, +... case="illustrative", +... parameters={ +... "specific_investment": investment, +... "efficiency": efficiency, +... "lifetime": Parameter(magnitude=25, units="year"), +... }, ... ) ->>> usa_2023 = usa_battery.parameters["investment"].to_currency("USD_2023", country="USA") ->>> print(round(dea_2023.magnitude, 1), dea_2023.units) -351.7 USD_2023 / kilowatt_hour ->>> print(round(usa_2023.magnitude, 1), usa_2023.units) -264.2 USD_2023 / kilowatt_hour +>>> print(electrolyser) +Technology('electrolyser', region='DEU', year=2030, case='illustrative', 3 parameters: ['specific_investment', 'efficiency', 'lifetime']) +>>> print(electrolyser.parameters["lifetime"]) +25 year ``` -`to_currency()` takes the target currency and the **ISO3 country code** whose deflator to use β€” `DEU`, `USA` β€” not a currency code. Both numbers are now on the same basis, and the remaining difference is a difference in the sources rather than in their units. +More in the [Technology guide](../user_guide/technology.md). -To work with both catalogues at once, concatenate them into one collection: +## 7. Equations: deriving and checking parameters + +Many parameters depend on each other: the total investment of a plant is its specific investment times its capacity. +Working these out by hand, in many places, is error-prone and leaves no record of how a value was obtained. +`technologydata` ships the common equations, and `calculate_parameters()` derives missing parameters from the ones a technology has. +The equations find parameters by name, which is why we used `specific_investment` above. +For a 10 MW electrolyser: ``` py ->>> combined = TechnologyCollection( -... technologies=dea.technologies.technologies + usa.technologies.technologies -... ) ->>> print(len(combined.technologies)) -221 +>>> electrolyser.parameters["capacity"] = Parameter(magnitude=10_000, units="kW") +>>> electrolyser = electrolyser.calculate_parameters("total_investment_cost") +>>> total = electrolyser.parameters["total_investment_cost"] +>>> print(total) +10000000.0 EUR_2020 +>>> print(total.provenance[0]) +Calculated from other parameters using formula 'total_investment_from_specific': total_investment_cost - specific_investment * capacity = 0 +Input values: + specific_investment = 1000 EUR_2020 / kilowatt + capacity = 10000 kilowatt ``` -## 8. Save it and load it back +The provenance records the formula and the input values, so the derived number can be reproduced. -`to_json()` writes a package to a directory; `from_json()` reads it back given the same name and version. +The same equations can check values that are already there. +This helps with datasets that contain related values: if one of them was edited or copied wrongly, the check flags it. +After changing the capacity, the total investment no longer fits: ``` py ->>> import pathlib ->>> import tempfile ->>> folder = pathlib.Path(tempfile.mkdtemp()) ->>> package.to_json(folder) ->>> print(sorted(p.name for p in folder.iterdir())) -['sources.json', 'technologies.json'] ->>> reloaded = DataPackage.from_json("my-assumptions", "v1", folder) ->>> print(len(reloaded.technologies.technologies)) -4 +>>> electrolyser.check_consistency(parameters=["total_investment_cost"]) +{'eac_simple': "missing parameters: ['eac']", 'total_investment_from_specific': True} +>>> electrolyser.parameters["capacity"] = Parameter(magnitude=20_000, units="kW") +>>> electrolyser.check_consistency(parameters=["total_investment_cost"]) +{'eac_simple': "missing parameters: ['eac']", 'total_investment_from_specific': False} ``` -The two files are the same shape as the ones the bundled catalogues ship, so a package you assemble here can be loaded by anything that reads them. +Equations with a missing parameter are reported as such rather than checked. +The [equation system guide](../user_guide/equations.md) lists all equations and shows how to add your own. -## 9. Derive parameters and check consistency +## 8. Collections: several years -Some parameters are related by known formulas rather than independent. -E.g. specific investment cost, total investment cost and capacity are one such triple: -specific investment is just total investment divided by capacity. -`calculate_parameters()` uses common equations to calculate missing parameters from known ones: +Assumptions change over time, and a model usually needs them for several years. +A `TechnologyCollection` holds several technologies, here the electrolyser in 2030, 2040 and 2050. +A small function saves us from repeating the identifying fields: ``` py ->>> tech = Technology( -... name="Solar PV", -... detailed_technology="Crystalline Silicon", -... case="Base", -... region="DEU", -... year=2020, -... parameters={ -... "specific_investment": Parameter(magnitude=1.0, units="EUR_2020/kW"), -... "total_investment_cost": Parameter(magnitude=1_000.0, units="EUR_2020"), -... }, +>>> from technologydata import TechnologyCollection +>>> def electrolyser_in(year, investment): +... return Technology( +... name="electrolyser", +... detailed_technology="PEM electrolyser", +... region="DEU", +... year=year, +... case="illustrative", +... parameters={"specific_investment": Parameter(magnitude=investment, units="EUR_2020/kW")}, +... ) +>>> electrolysers = TechnologyCollection( +... technologies=[electrolyser, electrolyser_in(2040, 700), electrolyser_in(2050, 500)] ... ) ->>> tech = tech.calculate_parameters("capacity") ->>> capacity = tech.parameters["capacity"] ->>> print(capacity.magnitude, capacity.units) -1000.0 kilowatt +>>> print(electrolysers.get(year=2040)[0].parameters["specific_investment"]) +700 EUR_2020 / kilowatt ``` -You can define and add your own equations and also overwrite existing ones. -The equations can also be used to check, rather than derive: -`check_consistency()` confirms that the parameters a technology already has still agree with each other. -This is helpful e.g. if you have a long list of values and you want to make sure that the parameters are all consistent to each other. -The functionality can not help you to identify which of the parameters is wrong, but it will flag all the involved parameters. - -In this example everything is fine and the consistency check reports consistency across the parameters: +`get()` selects technologies by any of the identifying fields. +Most operations also work on a whole collection at once, e.g. `to_currency()` or `calculate_parameters()`. -``` py ->>> print(tech.check_consistency(parameters=["capacity"])) -{'total_investment_from_specific': True} -``` - -If a parameter is edited by hand and no longer agrees with the others, the check flags it: +A model may need a year the source does not cover. +`project()` fits a growth model to the years that are there and returns the requested years as a new collection: ``` py ->>> tech.parameters["capacity"].magnitude = 5 ->>> print(tech.check_consistency(parameters=["capacity"])) -{'total_investment_from_specific': False} +>>> from technologydata.technologies.growth_models import LinearGrowth +>>> projected = electrolysers.project( +... to_years=[2035], +... parameters={"specific_investment": LinearGrowth(x0=2030)}, +... ) +>>> print(round(projected[0].parameters["specific_investment"].magnitude)) +858 ``` -`parameters=` restricts the check to equations that involve the given names; omit it to check every equation touching any parameter the technology has. - -The equation used in this case looks like this: +The straight line is fitted through all three years, so the 2035 value is not exactly halfway between 2030 and 2040. +Other growth models, e.g. exponential or logistic, are described in the [models guide](../user_guide/models.md). -$$ -\text{total_investment\_cost} = \text{specific\_investment} \cdot \text{capacity} -$$ +## 9. Data packages: saving and sharing -It is one of the equations `technologydata` ships by default, and you can look it up the same way `calculate_parameters()` and `check_consistency()` do internally, through the `equation_registry`: +Assumptions are reused across projects and exchanged between people and models, so they need a common file format. +A `DataPackage` bundles a collection with its sources under a name and a version, and writes it to files that follow the data schema of `technologydata`. +The version matters for reproducibility: it records which set of assumptions a model run used. ``` py ->>> from technologydata import equation_registry ->>> equation_registry.list_equations(target="capacity") -[{'name': 'total_investment_from_specific', 'parameters': ['total_investment_cost', 'specific_investment', 'capacity'], 'eq_str': 'total_investment_cost - specific_investment * capacity', 'priority': 1, 'description': None}] +>>> import pathlib, tempfile +>>> from technologydata import DataPackage +>>> package = DataPackage(name="my-electrolyser-assumptions", version="v1", technologies=electrolysers) +>>> package.get_source_collection() +>>> folder = pathlib.Path(tempfile.mkdtemp()) +>>> package.to_json(folder) +>>> print(sorted(p.name for p in folder.iterdir())) +['sources.json', 'technologies.json'] +>>> reloaded = DataPackage.from_json("my-electrolyser-assumptions", "v1", folder) +>>> print(reloaded.technologies.get(year=2050)[0].parameters["specific_investment"]) +500 EUR_2020 / kilowatt ``` -`eq_str` is the equation written as an expression equal to zero, which is why it reads `total_investment_cost - specific_investment * capacity` rather than the rearranged form above. -See the [equation system](../user_guide/equations.md) for the full list of built-in equations and how to register your own. +`get_source_collection()` gathers the sources of all parameters into `package.sources`, e.g. for a bibliography. +`to_csv()` writes the same content as CSV for spreadsheets. +More in the [DataPackage guide](../user_guide/datapackage.md). -## 10. Project a technology into the future +## 10. Batteries included - sharing encouraged -A published catalogue only covers the years its source measured. Growth-model curves β€” linear, exponential, logistic and others β€” fit to known data points and project a value to any year, past or future. +Building every assumption by hand does not scale. +`technologydata` therefore ships datasets parsed from published catalogues, and loading one gives the same kind of `DataPackage` you just built: ``` py ->>> from technologydata.technologies.growth_models import LinearGrowth ->>> model = LinearGrowth(x0=2020) ->>> model = model.add_data((2020, 1000.0)).add_data((2025, 1250.0)).add_data((2030, 1500.0)) ->>> model = model.fit() ->>> model.project(2040) -2000.0 +>>> from technologydata import DataAccessor +>>> dea = DataAccessor(data_source="dea_energy_storage", version="v10").load() +>>> print(dea.name, dea.version, len(dea.technologies)) +dea_energy_storage v10 136 ``` -`add_data()` and `fit()` both return the model, so calls chain. -`project()` extrapolates using the fitted curve β€” here a straight line through the three points, continued out to 2040. `TechnologyCollection.fit()` and `.project()` apply the same curves across every technology in a collection at once, fitting one named parameter per technology and returning a new collection with the projected years added. +The [Datasets](../datasets/index.md) section describes each dataset, and the [Overview](../overview.md) shows how to work with one. +We welcome new datasets and additions - together we can build larger and better databases for technology data in energy system models! ## Where to go next -- [`Parameter`](../user_guide/parameter.md), [`TechnologyCollection`](../user_guide/technology_collection.md) and [`DataPackage`](../user_guide/datapackage.md) β€” reference for the classes built above. -- [`DataAccessor`](../user_guide/data_accessor.md) β€” every option for locating and loading a catalogue. -- [Datasets](../datasets/index.md) β€” fact sheets of the bundled catalogues: contents, assumptions and how each is produced from its raw file. -- [Parameter formula system](../user_guide/equations.md) β€” every built-in formula, how to register your own, and the details of how a formula is solved. -- [`Technology`](../user_guide/technology.md) and [Models](../user_guide/models.md) β€” more on `calculate_parameters()`, `check_consistency()` and the growth-model curves. -- [Use cases](../user_guide/design.md) β€” the scenarios the package was designed around. +- [User Guide](../user_guide/parameter.md): every class in detail. +- [Datasets](../datasets/index.md): the bundled datasets, their contents and assumptions. +- [Equation system](../user_guide/equations.md): all built-in equations and how to add your own. +- [Use cases](../user_guide/design.md): the scenarios the package was designed around. diff --git a/docs/user_guide/class-diagram.puml b/docs/user_guide/class-diagram.puml index 6492d977..a12aa520 100644 --- a/docs/user_guide/class-diagram.puml +++ b/docs/user_guide/class-diagram.puml @@ -38,7 +38,7 @@ class Parameter { - units: str - carrier: str - heating_value: str - - provenance: str + - provenance: list[str] - note: str - sources: SourceCollection - _pint_quantity: pint.Quantity diff --git a/docs/user_guide/data_accessor.md b/docs/user_guide/data_accessor.md index 9c3f63a9..0b958b34 100644 --- a/docs/user_guide/data_accessor.md +++ b/docs/user_guide/data_accessor.md @@ -36,7 +36,7 @@ from technologydata import DataAccessor # Create an accessor for a specific version accessor_v1 = DataAccessor( - data_source="manual_input_usa", + data_source="legacy_input_data", version="v1.0.0" ) ``` @@ -50,7 +50,7 @@ The directory structure is expected to be: `src/technologydata/parsers/ DataPackage: def parse( self, - input_file_name: str, + input_file_names: list[str], num_digits: int = 4, archive_source: bool = False, filter_params: bool = False, @@ -334,8 +334,11 @@ def parse( Parameters ---------- - input_file_name : str - The name of the input file in the 'raw' directory. + input_file_names : list[str] + The names of the input files within the data source directory + in 'raw/{data_source}/'. Can be: + - A single element list with single-file data sources (e.g., ["Technology_datasheet_for_energy_storage.xlsx"]) + - A list of filenames for multi-file data sources (e.g., ["usa.csv", "other.csv"]) num_digits : int, optional Number of significant digits to round the values. Default is 4. archive_source : bool, optional @@ -353,26 +356,25 @@ def parse( If the required input data file is not found. """ - parser: DeaEnergyStorageParser | ManualInputUsaParser + parser: DeaEnergyStorageParser | LegacyInputDataParser if self.data_source == DataSourceName.DEA_ENERGY_STORAGE: parser = DeaEnergyStorageParser() - elif self.data_source == DataSourceName.MANUAL_INPUT_USA: - parser = ManualInputUsaParser() + elif self.data_source == DataSourceName.LEGACY_INPUT_DATA: + parser = LegacyInputDataParser() else: raise ValueError( f"Unsupported data source: {self.data_source}. " f"Supported data sources are: {[e for e in DataSourceName]}" ) - # Read the raw data - input_path = pathlib.Path( + # Read the raw data - construct path to data source directory + input_data_dir = pathlib.Path( self.data_path, "raw", + self.data_source, ) - DataAccessor.ensure_path_exists(input_path) - input_data_path = pathlib.Path(input_path, input_file_name) - logger.info(f"Input data path set to: {input_data_path}") + DataAccessor.ensure_path_exists(input_data_dir) if self.version not in parser.get_supported_versions(): logging.error( @@ -381,6 +383,21 @@ def parse( ) sys.exit(1) + input_data_path: pathlib.Path | list[pathlib.Path] + + if len(input_file_names) == 0: + logging.error("No input data files were specified.") + sys.exit(1) + if len(input_file_names) == 1: + input_data_path = pathlib.Path(input_data_dir, input_file_names[0]) + else: + input_data_path = [ + pathlib.Path(input_data_dir, file_name) + for file_name in input_file_names + ] + + logger.info(f"Input data path set to: {input_data_path}") + try: parser.parse( version=self.version, diff --git a/src/technologydata/parsers/commons.py b/src/technologydata/parsers/commons.py index a154d11d..b6aa3407 100644 --- a/src/technologydata/parsers/commons.py +++ b/src/technologydata/parsers/commons.py @@ -5,12 +5,263 @@ """Classes for Commons methods for the data parsers.""" import argparse +import re +from enum import StrEnum from typing import Annotated, Any import pydantic from pydantic import BaseModel, ConfigDict +class UnitPatternRegex(StrEnum): + """ + Enum defining regex patterns for extracting units, carriers, and heating values. + + Each pattern matches a specific format of unit strings commonly found in + energy technology data. The patterns handle various combinations of: + - Currency units (USD, EUR) with optional year + - Energy units (kWh, MWh, GWh, etc.) + - Mass units (t) + - Carriers (H2, CH4, CO2, FT, etc.) + - Time dimensions (/h) + - Distance dimensions (/km) + """ + + # Pattern 1: Currency with optional year and power/energy carrier + # Examples: USD_2022/MW_FT, EUR/kWh_H2, EUR_2020/kW_CH4 + CURRENCY_POWER_CARRIER = r"^(USD|EUR)(?:_(\d{4}))?/([kMGT]?Wh?)_([A-Za-z0-9]+)$" + + # Pattern 2: Currency with optional year, mass carrier and time (without parentheses) + # Examples: USD_2023/t_CO2/h, EUR/t_cement/h + CURRENCY_MASS_TIME = r"^(USD|EUR)(?:_(\d{4}))?/t_([A-Za-z0-9]+)/h$" + + # Pattern 3: Currency with optional year, mass carrier and time (with parentheses) + # Examples: EUR/(t_HVC/h), USD_2022/(t_CO2/h) + CURRENCY_MASS_TIME_PAREN = r"^(USD|EUR)(?:_(\d{4}))?/\(t_([A-Za-z0-9]+)/h\)$" + + # Pattern 4: Energy ratio with carriers + # Examples: MWh_H2/MWh_FT, MWh_el/MWh_CH4, kWh_NG/kWh_H2 + ENERGY_ENERGY_RATIO = r"^([kMGT]?Wh)_([A-Za-z0-9]+)/([kMGT]?Wh)_([A-Za-z0-9]+)$" + + # Pattern 5: Mass/energy ratio with carriers (order agnostic) + # Examples: t_CO2/MWh_FT, MWh_el/t_CO2, MWh_H2/t_H18DBT + # Excludes el/th/thermal carriers which are handled by Pattern 6 + MASS_ENERGY_RATIO = r"^(t|[kMGT]?Wh)_(?!(?:el|th|thermal)/)([A-Za-z0-9]+)/([kMGT]?Wh|t)_([A-Za-z0-9]+)$" + + # Pattern 6: Energy unit with el/th/thermal carrier to mass with carrier + # Examples: MWh_el/t_CO2, MWh_th/t_cement, kWh_thermal/t_clinker + ENERGY_THERMAL_MASS = r"^([kMGT]?Wh)_(el|th|thermal)/t_([A-Za-z0-9]+)$" + + # Pattern 7: Currency with generic unit and carrier per time (in parentheses) + # Examples: EUR/(t_HVC/h), USD/(MW_H2/h) + CURRENCY_GENERIC_TIME_PAREN = ( + r"^(USD|EUR)(?:_(\d{4}))?/\(([A-Za-z0-9]+)_([A-Za-z0-9]+)/h\)$" + ) + + # Pattern 8: Currency per mass/time with distance dimension + # Examples: EUR/(t_CO2/h)/km, USD_2023/(t_cement/h)/km + CURRENCY_MASS_TIME_DISTANCE = r"^(USD|EUR)(?:_(\d{4}))?/\(t_([A-Za-z0-9]+)/h\)/km$" + + # Pattern 9: Currency with optional year and mass carrier (without time) + # Examples: EUR/t_clinker, USD_2023/t_cement, EUR/t_HVC + CURRENCY_MASS_CARRIER = r"^(USD|EUR)(?:_(\d{4}))?/t_([A-Za-z0-9]+)$" + + # Pattern 10: Power per distance per power with carriers + # Examples: MW_e/km/MW_CH4, MW_e/m/MW_H2 + POWER_DISTANCE_POWER = ( + r"^([kMGT]?W)_([A-Za-z0-9]+)/(k?m)/([kMGT]?W)_([A-Za-z0-9]+)$" + ) + + # Pattern 11: Standalone mass with carrier + # Examples: t_CH4, t_HBI, t_ore + MASS_CARRIER = r"^t_([A-Za-z0-9]+)$" + + # Pattern 12: Energy without carrier to mass with carrier + # Examples: MWh/t_CO2, kWh/t_cement + ENERGY_MASS_CARRIER = r"^([kMGT]?Wh)/t_([A-Za-z0-9]+)$" + + +class UnitCarrierHeatingValueExtractor: + """Process matched unit patterns into standardized unit, carrier, and heating value tuples.""" + + # Carriers without a heating value (electricity and heat) + CARRIERS_WITHOUT_HEATING_VALUE = frozenset({"e", "el", "th", "thermal"}) + + @staticmethod + def _normalize_carrier(carrier: str) -> str: + """Normalize "th" to "thermal".""" + return "thermal" if carrier == "th" else carrier + + @staticmethod + def _heating_value( + numerator_carrier: str | None, denominator_carrier: str | None + ) -> str | None: + """ + Return the heating value of a unit from the carriers of its energy parts. + + Only energy or power units of a fuel carrier have a heating value; + electricity and heat have none. The heating value is placed where the + energy unit is: ``LHV`` in the numerator, ``1/LHV`` in the denominator. + A ratio of two fuels keeps ``LHV``, as both are on the same basis. + + Parameters + ---------- + numerator_carrier : str | None + Carrier of the energy or power unit in the numerator, None if the + numerator is not an energy or power unit. + denominator_carrier : str | None + Carrier of the energy or power unit in the denominator, None if the + denominator is not an energy or power unit. + + Returns + ------- + str | None + ``"LHV"``, ``"1/LHV"`` or None. + + """ + no_hv = UnitCarrierHeatingValueExtractor.CARRIERS_WITHOUT_HEATING_VALUE + numerator_fuel = ( + numerator_carrier is not None and numerator_carrier not in no_hv + ) + denominator_fuel = ( + denominator_carrier is not None and denominator_carrier not in no_hv + ) + if numerator_fuel: + return "LHV" + if denominator_fuel: + return "1/LHV" + return None + + @staticmethod + def _is_energy(unit: str) -> bool: + """Return True if the unit is an energy or power unit.""" + return unit.endswith("W") or unit.endswith("Wh") + + @staticmethod + def process_currency_power_carrier( + match: re.Match[str], + ) -> tuple[str, str, str | None]: + """Process currency with power/energy carrier pattern.""" + currency, year, unit, carrier = match.groups() + standardized_unit = ( + f"{currency}_{year}/{unit}" if year else f"{currency}/{unit}" + ) + carrier = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier) + heating_value = UnitCarrierHeatingValueExtractor._heating_value(None, carrier) + return standardized_unit, f"1/{carrier}", heating_value + + @staticmethod + def process_currency_mass_time(match: re.Match[str]) -> tuple[str, str, None]: + """ + Process currency with mass carrier and time pattern. + + The unit is a cost per capacity in mass per hour, e.g. EUR/(t_CO2/h), + also when the raw unit is written without parentheses (EUR/t_CO2/h). + """ + currency, year, carrier = match.groups() + standardized_unit = f"{currency}_{year}/(t/h)" if year else f"{currency}/(t/h)" + carrier_str = f"1/{carrier}" + return standardized_unit, carrier_str, None + + @staticmethod + def process_currency_mass_carrier(match: re.Match[str]) -> tuple[str, str, None]: + """Process currency with mass carrier (without time) pattern.""" + currency, year, carrier = match.groups() + standardized_unit = f"{currency}_{year}/t" if year else f"{currency}/t" + carrier_str = f"1/{carrier}" + return standardized_unit, carrier_str, None + + @staticmethod + def process_energy_ratio(match: re.Match[str]) -> tuple[str, str, str | None]: + """Process energy ratio with carriers pattern.""" + unit1, carrier1, unit2, carrier2 = match.groups() + standardized_unit = f"{unit1}/{unit2}" + carrier1 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier1) + carrier2 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier2) + carrier_str = f"{carrier1}/{carrier2}" + heating_value = UnitCarrierHeatingValueExtractor._heating_value( + carrier1, carrier2 + ) + return standardized_unit, carrier_str, heating_value + + @staticmethod + def process_mass_energy_ratio(match: re.Match[str]) -> tuple[str, str, str | None]: + """Process mass/energy ratio with carriers pattern.""" + unit1, carrier1, unit2, carrier2 = match.groups() + standardized_unit = f"{unit1}/{unit2}" + carrier1 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier1) + carrier2 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier2) + carrier_str = f"{carrier1}/{carrier2}" + is_energy = UnitCarrierHeatingValueExtractor._is_energy + heating_value = UnitCarrierHeatingValueExtractor._heating_value( + carrier1 if is_energy(unit1) else None, + carrier2 if is_energy(unit2) else None, + ) + return standardized_unit, carrier_str, heating_value + + @staticmethod + def process_energy_thermal_mass(match: re.Match[str]) -> tuple[str, str, None]: + """Process energy unit with el/th/thermal carrier to mass pattern.""" + unit, carrier1, carrier2 = match.groups() + standardized_unit = f"{unit}/t" + carrier1 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier1) + carrier_str = f"{carrier1}/{carrier2}" + # Electricity and heat have no heating value + return standardized_unit, carrier_str, None + + @staticmethod + def process_currency_generic_time(match: re.Match[str]) -> tuple[str, str, None]: + """Process currency with generic unit and carrier per time pattern.""" + currency, year, unit_type, carrier = match.groups() + standardized_unit = ( + f"{currency}_{year}/({unit_type}/h)" + if year + else f"{currency}/({unit_type}/h)" + ) + return standardized_unit, f"1/{carrier}", None + + @staticmethod + def process_currency_mass_time_distance( + match: re.Match[str], + ) -> tuple[str, str, None]: + """Process currency per mass/time with distance dimension pattern.""" + currency, year, carrier = match.groups() + standardized_unit = ( + f"{currency}_{year}/(t/h)/km" if year else f"{currency}/(t/h)/km" + ) + return standardized_unit, f"1/{carrier}", None + + @staticmethod + def process_power_distance_power( + match: re.Match[str], + ) -> tuple[str, str, str | None]: + """Process power per distance per power with carriers pattern.""" + unit1, carrier1, distance, unit2, carrier2 = match.groups() + standardized_unit = f"{unit1}/{distance}/{unit2}" + carrier1 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier1) + carrier2 = UnitCarrierHeatingValueExtractor._normalize_carrier(carrier2) + carrier_str = f"{carrier1}/{carrier2}" + heating_value = UnitCarrierHeatingValueExtractor._heating_value( + carrier1, carrier2 + ) + return standardized_unit, carrier_str, heating_value + + @staticmethod + def process_mass_carrier(match: re.Match[str]) -> tuple[str, str, None]: + """Process standalone mass with carrier pattern.""" + carrier = match.groups()[0] + return "t", carrier, None + + @staticmethod + def process_energy_mass_carrier(match: re.Match[str]) -> tuple[str, str, None]: + """Process energy without carrier to mass with carrier pattern.""" + unit, carrier = match.groups() + standardized_unit = f"{unit}/t" + carrier_str = f"1/{carrier}" + # The energy unit has no carrier, so no heating value can be assigned + return standardized_unit, carrier_str, None + + class ArgumentConfig(BaseModel): """ Pydantic model for defining argument configurations. diff --git a/src/technologydata/parsers/data_parser_base.py b/src/technologydata/parsers/data_parser_base.py index 59fb5ec1..eaed5c46 100644 --- a/src/technologydata/parsers/data_parser_base.py +++ b/src/technologydata/parsers/data_parser_base.py @@ -15,7 +15,7 @@ class ParserBase(abc.ABC): @abc.abstractmethod def parse( self, - input_path: pathlib.Path, + input_path: pathlib.Path | list[pathlib.Path], num_digits: int, archive_source: bool, **kwargs: Any, @@ -26,7 +26,7 @@ def parse( Parameters ---------- input_path : pathlib.Path - Path to the raw input data file. + Path or list of paths to the raw input data file/s. num_digits : int Number of significant digits to round the values. archive_source : bool diff --git a/src/technologydata/parsers/dea_energy_storage/__init__.py b/src/technologydata/parsers/dea_energy_storage/__init__.py index 49ce63ea..2778cd05 100644 --- a/src/technologydata/parsers/dea_energy_storage/__init__.py +++ b/src/technologydata/parsers/dea_energy_storage/__init__.py @@ -34,7 +34,7 @@ def get_supported_versions(self) -> list[str]: def parse( self, version: str, - input_path: pathlib.Path, + input_path: pathlib.Path | list[pathlib.Path], num_digits: int, archive_source: bool, filter_params: bool, @@ -50,16 +50,17 @@ def parse( ---------- version : str The version of the dataset to parse (e.g., 'v10'). - input_path : pathlib.Path + input_path : pathlib.Path | list[pathlib.Path] Path to the raw input data file. - num_digits : int, optional - Number of significant digits to round the values, by default 4. - archive_source : bool, optional - If True, archives the source object on the Wayback Machine, by default False. - filter_params : bool, optional - If True, filters the parameters stored in the output, by default False. - export_schema : bool, optional - If True, exports the Pydantic schema for the data models, by default False. + num_digits : int + Number of decimals to round numerical values to. + archive_source : bool + If True, archives the source object on the Wayback Machine and + rewrites sources.json. + filter_params : bool + If True, keeps only a predefined set of parameters. + export_schema : bool + If True, exports the Pydantic schema for the data models. Raises ------ diff --git a/src/technologydata/parsers/dea_energy_storage/parser_v10.py b/src/technologydata/parsers/dea_energy_storage/parser_v10.py index fe4d71a7..318db814 100644 --- a/src/technologydata/parsers/dea_energy_storage/parser_v10.py +++ b/src/technologydata/parsers/dea_energy_storage/parser_v10.py @@ -469,7 +469,7 @@ def _build_technology_collection( def parse( self, - input_path: pathlib.Path, + input_path: pathlib.Path | list[pathlib.Path], num_digits: int, archive_source: bool, **kwargs: Any, @@ -483,10 +483,11 @@ def parse( Parameters ---------- - input_path : pathlib.Path - Path to the raw input data file (Excel). + input_path : pathlib.Path | list[pathlib.Path] + Path to the raw input data file. num_digits : int - Number of significant digits to round numerical values. + Number of decimals to round numerical values to; for values in + scientific notation, the mantissa is rounded. archive_source : bool If True, archives the source object on the Wayback Machine. **kwargs : bool @@ -495,12 +496,27 @@ def parse( export_schema : bool If True, exports the Pydantic schema for the data models. + Raises + ------ + TypeError + If input_path is a list instead of a single Path. + Returns ------- - TechnologyCollection - A collection of parsed technology data. + Nothing. + + Notes + ----- + Writes parsed data to `src/technologydata/parsers/dea_energy_storage/v10/`. """ + # Validate that input_path is a single Path, not a list + if isinstance(input_path, list): + raise TypeError( + "DeaEnergyStorageV10Parser requires a single Path, not a list. " + f"Got {len(input_path)} paths." + ) + filter_params = kwargs.get("filter_params", False) export_schema = kwargs.get("export_schema", False) diff --git a/src/technologydata/parsers/manual_input_usa/__init__.py b/src/technologydata/parsers/legacy_input_data/__init__.py similarity index 57% rename from src/technologydata/parsers/manual_input_usa/__init__.py rename to src/technologydata/parsers/legacy_input_data/__init__.py index 711c21f5..5ea6f81c 100644 --- a/src/technologydata/parsers/manual_input_usa/__init__.py +++ b/src/technologydata/parsers/legacy_input_data/__init__.py @@ -2,20 +2,20 @@ # # SPDX-License-Identifier: MIT -"""Provide a parser for the technology-data manual_input_usa.csv dataset.""" +"""Provide a parser for the technology-data raw/legacy_input_data/other.csv and raw/legacy_input_data/usa.csv datasets.""" import logging import pathlib from technologydata.parsers.data_parser_base import ParserBase -from technologydata.parsers.manual_input_usa.parser_v0134 import ( - ManualInputUSAV0134Parser, +from technologydata.parsers.legacy_input_data.parser_v0134 import ( + LegacyInputDataV0134Parser, ) -class ManualInputUsaParser: +class LegacyInputDataParser: """ - Main parser for the technology_data manual_input_usa.csv dataset. + Main parser for the technology_data raw/legacy_input_data/other.csv and raw/legacy_input_data/usa.csv dataset. Dispatches to version-specific parser implementations. """ @@ -23,8 +23,8 @@ class ManualInputUsaParser: def __init__(self) -> None: """Initialize the parser and maps versions to parser classes.""" self._parsers: dict[str, type[ParserBase]] = { - "v0.13.4": ManualInputUSAV0134Parser, - # "v0.13.5": ManualInputUSAV0135Parser, # Add new versions here + "v0.13.4": LegacyInputDataV0134Parser, + # "v0.13.5": LegacyInputDataV0135Parser, # Add new versions here } def get_supported_versions(self) -> list[str]: @@ -34,14 +34,14 @@ def get_supported_versions(self) -> list[str]: def parse( self, version: str, - input_path: pathlib.Path, + input_path: pathlib.Path | list[pathlib.Path], num_digits: int, archive_source: bool, filter_params: bool, export_schema: bool, ) -> None: """ - Parse the specified version of the technology_data manual_input_usa.csv dataset. + Parse the specified version of the technology_data raw/legacy_input_data/other.csv and raw/legacy_input_data/usa.csv dataset. This method selects the appropriate parser for the given version and delegates the parsing task to it. @@ -50,16 +50,18 @@ def parse( ---------- version : str The version of the dataset to parse (e.g., 'v0.13.4'). - input_path : pathlib.Path - Path to the raw input data file. - num_digits : int, optional - Number of significant digits to round the values, by default 4. - archive_source : bool, optional - If True, archives the source object on the Wayback Machine, by default False. - filter_params : bool, optional - If True, filters the parameters stored in the output, by default False. - export_schema : bool, optional - If True, exports the Pydantic schema for the data models, by default False. + input_path : pathlib.Path | list[pathlib.Path] + Paths to the raw input data CSV files. + num_digits : int + Number of decimals to round numerical values to; values < 1 keep + at least num_digits significant digits. + archive_source : bool + If True, archives the source objects on the Wayback Machine and + rewrites sources.json + filter_params : bool + Ignored by this parser. + export_schema : bool + If True, exports the Pydantic schema for the data models. Raises ------ @@ -77,7 +79,7 @@ def parse( parser_instance = parser_class() logging.info( - f"Parsing the technology-data manual_input_usa.csv. dataset version {version} using {parser_class.__name__}" + f"Parsing the technology-data raw/legacy_input_data/usa.csv and raw/legacy_input_data/other.csv. dataset version {version} using {parser_class.__name__}" ) return parser_instance.parse( input_path=input_path, @@ -89,4 +91,4 @@ def parse( # Make the main parser class available for import from the module -__all__ = ["ManualInputUsaParser", "ManualInputUSAV0134Parser"] +__all__ = ["LegacyInputDataParser", "LegacyInputDataV0134Parser"] diff --git a/src/technologydata/parsers/legacy_input_data/parser_v0134.py b/src/technologydata/parsers/legacy_input_data/parser_v0134.py new file mode 100644 index 00000000..d3964aaf --- /dev/null +++ b/src/technologydata/parsers/legacy_input_data/parser_v0134.py @@ -0,0 +1,560 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Parser for version 0.13.4 of the raw/legacy_input_data/other.csv and raw/legacy_input_data/usa.csv datasets.""" + +import logging +import math +import pathlib +import re +from typing import Any + +import pandas + +from technologydata.parameter import Parameter +from technologydata.parsers.commons import ( + UnitCarrierHeatingValueExtractor, + UnitPatternRegex, +) +from technologydata.parsers.data_parser_base import ParserBase +from technologydata.source import Source +from technologydata.source_collection import SourceCollection +from technologydata.technology import Technology +from technologydata.technology_collection import TechnologyCollection +from technologydata.utils.commons import Commons + +path_cwd = pathlib.Path.cwd() + +logger = logging.getLogger(__name__) + + +class LegacyInputDataV0134Parser(ParserBase): + """Parser for v0.13.4 of the raw/legacy_input_data/other.csv and raw/legacy_input_data/usa.csv datasets.""" + + @staticmethod + def _extract_units_carriers_heating_value( + input_unit: str, + ) -> tuple[str, str | None, str | None]: + """ + Extract standardized units and carriers from an input unit string using regex patterns. + + This function uses regex pattern matching to extract unit, carrier, and heating value + from complex unit strings. It handles various patterns including: + - Currency-based units: {CURRENCY}[_{YEAR}]/{unit}_{carrier} + - Energy ratio units: {unit1}_{carrier1}/{unit2}_{carrier2} + - Mass/energy ratios: t_{carrier1}/MWh_{carrier2} + - Time-based units with /h suffix + - Geographic distance-based units with /km + - Standalone mass with carrier: t_{carrier} + - Energy without carrier to mass with carrier: {energy}/t_{carrier} + + The function also normalizes malformed unit strings (e.g., tCO2 -> t_CO2) before + pattern matching. + + Parameters + ---------- + input_unit : str + A specialized unit string to be converted. + + Returns + ------- + tuple[str, str | None, str | None] + A tuple containing three elements: + - The first element is the standardized unit + - The second element is the corresponding carrier (or None if not found) + - The third element is the corresponding heating value (or None if not found) + + Examples + -------- + >>> _extract_units_carriers_heating_value("USD_2022/MW_FT") + ('USD_2022/MW', '1/FT', '1/LHV') + >>> _extract_units_carriers_heating_value("EUR/kW_H2") + ('EUR/kW', '1/H2', '1/LHV') + >>> _extract_units_carriers_heating_value("MWh_H2/MWh_FT") + ('MWh/MWh', 'H2/FT', 'LHV') + >>> _extract_units_carriers_heating_value("USD_2023/t_CO2/h") + ('USD_2023/(t/h)', '1/CO2', None) + >>> _extract_units_carriers_heating_value("EUR/(tCO2/h)/km") + ('EUR/(t/h)/km', '1/CO2', None) + >>> _extract_units_carriers_heating_value("t_CH4") + ('t', 'CH4', None) + >>> _extract_units_carriers_heating_value("MWh/t_CO2") + ('MWh/t', '1/CO2', 'LHV') + + """ + if not isinstance(input_unit, str): + return input_unit, None, None + + # Normalize tCO2 to t_CO2 (handles cases like EUR/(tCO2/h)/km) + input_unit = input_unit.replace("tCO2", "t_CO2") + + # Pattern 1: Currency with optional year and power/energy carrier + match = re.match(UnitPatternRegex.CURRENCY_POWER_CARRIER.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_currency_power_carrier( + match + ) + + # Pattern 2 & 3: Currency with mass carrier and time (with or without parentheses) + match = re.match(UnitPatternRegex.CURRENCY_MASS_TIME.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_currency_mass_time(match) + + match = re.match(UnitPatternRegex.CURRENCY_MASS_TIME_PAREN.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_currency_mass_time(match) + + # Pattern 4: Energy ratio with carriers + match = re.match(UnitPatternRegex.ENERGY_ENERGY_RATIO.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_energy_ratio(match) + + # Pattern 5: Mass/energy ratio with carriers (excludes el/th/thermal via regex) + match = re.match(UnitPatternRegex.MASS_ENERGY_RATIO.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_mass_energy_ratio(match) + + # Pattern 6: Energy unit with el/th/thermal carrier to mass + match = re.match(UnitPatternRegex.ENERGY_THERMAL_MASS.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_energy_thermal_mass(match) + + # Pattern 7: Currency with generic unit and carrier per time (in parentheses) + match = re.match(UnitPatternRegex.CURRENCY_GENERIC_TIME_PAREN.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_currency_generic_time(match) + + # Pattern 8: Currency per mass/time with distance dimension + match = re.match(UnitPatternRegex.CURRENCY_MASS_TIME_DISTANCE.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_currency_mass_time_distance( + match + ) + + # Pattern 9: Currency with mass carrier (without time) + match = re.match(UnitPatternRegex.CURRENCY_MASS_CARRIER.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_currency_mass_carrier(match) + + # Pattern 10: Power per distance per power with carriers + match = re.match(UnitPatternRegex.POWER_DISTANCE_POWER.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_power_distance_power(match) + + # Pattern 11: Standalone mass with carrier + match = re.match(UnitPatternRegex.MASS_CARRIER.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_mass_carrier(match) + + # Pattern 12: Energy without carrier to mass with carrier + match = re.match(UnitPatternRegex.ENERGY_MASS_CARRIER.value, input_unit) + if match: + return UnitCarrierHeatingValueExtractor.process_energy_mass_carrier(match) + + # No pattern matched - return as-is + return input_unit, None, None + + @staticmethod + def _round_value(value: float, num_digits: int) -> float: + """ + Round a value to num_digits decimals, keeping at least num_digits significant digits. + + Values below 1 would lose their significant digits when rounded to decimals + (e.g. 1.9e-08 would become 0.0), so they are rounded to significant digits. + + Examples + -------- + >>> LegacyInputDataV0134Parser._round_value(51259.5439606197, 3) + 51259.544 + >>> LegacyInputDataV0134Parser._round_value(1.94321e-08, 3) + 1.94e-08 + + """ + if pandas.isna(value) or value == 0: + return value + decimals = max(num_digits, num_digits - 1 - math.floor(math.log10(abs(value)))) + return round(value, decimals) + + @staticmethod + def _build_technology_collection( + dataframe: pandas.DataFrame, + sources_path: pathlib.Path, + archive_source: bool = False, + output_schema: bool = False, + ) -> TechnologyCollection: + """ + Compute a collection of technologies from a grouped DataFrame. + + Processes input DataFrame by grouping technologies and extracting their parameters, + creating Technology instances for each unique group. + + Parameters + ---------- + dataframe : pandas.DataFrame + Input DataFrame containing technology parameters. + Expected columns include: + - 'scenario': Estimation or case identifier + - 'year': Year of the technology + - 'technology': Detailed technology name + - 'parameter': Parameter name + - 'value': Parameter value + - 'unit': Parameter units + - 'further_description': Extra information about the technology + - 'financial_case': Technology financial case + - 'region': Region identifier ('USA' or 'other') + sources_path: pathlib.Path + Output path for storing the SourceCollection object + archive_source: Optional[bool] + Flag to decide whether to archive the source object on the Wayback Machine. Default False. + output_schema : Optional[bool] + Flag to decide whether to export the source collection schema. Default False. + + Returns + ------- + TechnologyCollection + A collection of Technology instances, each representing a unique + technology group with its associated parameters. + + Notes + ----- + - The function groups the DataFrame by ["scenario", "year", "technology", "region"] + - For each group, it creates a dictionary of Parameters + - Each Technology is instantiated with group-specific attributes + + """ + list_techs = [] + + if archive_source: + source_usa = Source( + title="Energy system technology data for the US", + authors="Contributors to technology-data. Data source: manual_input_usa.csv", + version="v0.13.4", + url="https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + ) + source_usa.ensure_in_wayback() + source_other = Source( + title="Energy system technology data", + authors="Contributors to technology-data. Data source: manual_input.csv", + version="v0.13.4", + url="https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + ) + source_other.ensure_in_wayback() + sources_combined = SourceCollection(sources=[source_usa, source_other]) + sources_combined.to_json(sources_path, output_schema=output_schema) + else: + sources_combined = SourceCollection.from_json(sources_path) + + # Create separate source collections for USA and other regions + source_usa_collection = SourceCollection(sources=[sources_combined.sources[0]]) + source_other_collection = SourceCollection( + sources=[sources_combined.sources[1]] + ) + + for (scenario, year, technology, region), group in dataframe.groupby( + ["scenario", "year", "technology", "region"] + ): + parameters = {} + financial_case_for_tech = None + + # Select appropriate source based on region + sources_for_tech = ( + source_usa_collection if region == "USA" else source_other_collection + ) + + for _, row in group.iterrows(): + unit, carrier, heating_value = ( + LegacyInputDataV0134Parser._extract_units_carriers_heating_value( + row["unit"] + ) + ) + param_kwargs = { + "magnitude": row["value"], + "sources": sources_for_tech, + } + if carrier is not None: + param_kwargs["carrier"] = carrier + if heating_value is not None: + param_kwargs["heating_value"] = heating_value + if unit is not None: + param_kwargs["units"] = unit + if row["further_description"] is not None and isinstance( + row["further_description"], str + ): + param_kwargs["note"] = row["further_description"] + if row["financial_case"] is not None and isinstance( + row["financial_case"], str + ): + financial_case_for_tech = str(row["financial_case"]) + parameters[row["parameter"]] = Parameter(**param_kwargs) + + # Combine scenario and financial_case for the case attribute + case_value = str(scenario) + if financial_case_for_tech is not None: + case_value = f"{scenario} - {financial_case_for_tech}" + + # Use region from dataframe, convert empty string to actual value or keep as is + region_value = region if region else None + + list_techs.append( + Technology( + name=technology, + region=region_value, + year=year, + parameters=parameters, + case=case_value, + detailed_technology=technology, + ) + ) + + return TechnologyCollection(technologies=list_techs) + + def parse( + self, + input_path: pathlib.Path | list[pathlib.Path], + num_digits: int, + archive_source: bool, + **kwargs: Any, + ) -> None: + """ + Parse and process version 0.13.4 of the raw/legacy_input_data/usa.csv and raw/legacy_input_data/other.csv datasets. + + This method reads the raw data from both CSV files (usa.csv and other.csv), cleans and + transforms it through a series of steps, and then builds a TechnologyCollection. + The processed data is saved to JSON files. + + Data processing steps include: + - USA data is tagged with region='USA', other data with region='other' + - Unit normalization: tCO2 -> t_CO2, MWHh_el -> MWh_el, MWhth -> MWh_th, + kWel -> kW_el, MWh_thdh -> MWh_th, t_cl -> t_clinker, + t_HLOHC -> t_H18DBT, t_LOHC -> t_H0DBT, t_hbi -> t_HBI + - Removal of design point suffix: ,dp removed from units + - Distance normalization: 1000km -> m (with value divided by 1e6) + - Percentage conversion: 'per unit' -> '%' (with value multiplied by 100) + - Rounding of all values to num_digits decimals, keeping at least + num_digits significant digits + - Currency year integration: currency_year column merged into unit string + - Unit/carrier/heating value extraction using regex pattern matching + + Parameters + ---------- + input_path : pathlib.Path | list[pathlib.Path] + List of paths to the raw input data files. Must contain two CSV files: + one with 'usa' or 'us' in the filename, and one 'other' file. + num_digits : int + Number of decimals to round numerical values to; values below 1 keep + at least num_digits significant digits. + archive_source : bool + If True, archives the source object on the Wayback Machine. + **kwargs : bool + export_schema : bool + If True, exports the Pydantic schema for the data models. + filter_params : bool + Ignored by this parser. + + Raises + ------ + TypeError + If input_path is a single Path instead of a list. + ValueError + If the USA file or other file cannot be identified from the filenames. + + Returns + ------- + Nothing + + Notes + ----- + Writes parsed files to `src/technologydata/parsers/legacy_input_data/v0.13.4/`. + + """ + # Validate that input_path is a single Path, not a list + if isinstance(input_path, pathlib.Path): + raise TypeError( + "LegacyInputDataV0134Parser requires a list of paths to the input files. " + ) + + export_schema = kwargs.get("export_schema", False) + + # Identify which file is USA and which is other based on filename + usa_path = None + other_path = None + + for file_path in input_path: + if "usa" in file_path.name.casefold() or "us" in file_path.name.casefold(): + usa_path = file_path + else: + other_path = file_path + + # Validate we found both files + if usa_path is None: + raise ValueError( + f"Could not find USA file (expected filename containing 'usa' or 'us'). " + f"Got files: {[p.name for p in input_path]}" + ) + if other_path is None: + raise ValueError( + f"Could not find 'other' file. Got files: {[p.name for p in input_path]}" + ) + + # Read USA data + legacy_input_data_usa_df = pandas.read_csv( + usa_path, dtype=str, na_values="None" + ) + legacy_input_data_usa_df["value"] = legacy_input_data_usa_df["value"].astype( + float + ) + legacy_input_data_usa_df["scenario"] = legacy_input_data_usa_df[ + "scenario" + ].fillna("not_available") + # Add region column for USA data + legacy_input_data_usa_df["region"] = "USA" + logger.info("USA data loaded with region='USA'.") + + # Read other data + legacy_input_data_other_df = pandas.read_csv( + other_path, dtype=str, na_values="None" + ) + legacy_input_data_other_df["value"] = legacy_input_data_other_df[ + "value" + ].astype(float) + + # Perform change: MWHh_el -> MWh_el + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("MWHh_el", "MWh_el") + + # Perform change: MWhth -> MWh_th + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("MWhth", "MWh_th", regex=False) + + # Perform change: tCO2 -> t_CO2 + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("tCO2", "t_CO2", regex=False) + + # Perform change: kW_th,dp -> kW_th + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace(",dp", "", regex=False) + + # Perform change: MWh_thdh -> MWh_th + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("MWh_thdh", "MWh_th", regex=False) + + # Perform change: t_cl -> t_clinker + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("t_cl/", "t_clinker/", regex=False) + + # Perform change: t_HLOHC -> t_H18DBT (loaded LOHC) + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("t_HLOHC", "t_H18DBT", regex=False) + + # Perform change: t_LOHC -> t_H0DBT (unloaded LOHC) + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("t_LOHC", "t_H0DBT", regex=False) + + # Perform change: t_hbi -> t_HBI + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("t_hbi", "t_HBI", regex=False) + + # Perform change: EUR/kWel -> EUR/kW_el + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("EUR/kWel", "EUR/kW_el") + + # Perform change: t_FTfuel -> t_FT + legacy_input_data_other_df["unit"] = legacy_input_data_other_df[ + "unit" + ].str.replace("t_FTfuel", "t_FT") + + # Add missing columns for other.csv + legacy_input_data_other_df["scenario"] = "not_available" + legacy_input_data_other_df["financial_case"] = None + # Add region column for other data + legacy_input_data_other_df["region"] = "other" + logger.info("Other data loaded with region='other' and missing columns added.") + + # Combine both dataframes + legacy_input_data_df = pandas.concat( + [legacy_input_data_usa_df, legacy_input_data_other_df], + ignore_index=True, + ) + logger.info("USA and other data combined.") + + # Normalize "p.u." to "per unit" + legacy_input_data_df["unit"] = legacy_input_data_df["unit"].str.replace( + "p.u.", "per unit", regex=False + ) + + # Replace "1000km" with "m" (no SI prefix) and divide val by 1e6 + mask_1000km = legacy_input_data_df["unit"].str.contains( + "1000km", na=False, regex=False + ) + legacy_input_data_df.loc[mask_1000km, "unit"] = legacy_input_data_df.loc[ + mask_1000km, "unit" + ].str.replace("1000km", "m", regex=False) + legacy_input_data_df.loc[mask_1000km, "value"] = ( + legacy_input_data_df.loc[mask_1000km, "value"] / 1e6 + ) + logger.info("`1000km` replaced by `m`. Corresponding value divided by 1e6.") + + # Replace "per unit" with "%" and multiply val by 100 + mask_per_unit = legacy_input_data_df["unit"].str.contains("per unit", na=False) + legacy_input_data_df.loc[mask_per_unit, "unit"] = legacy_input_data_df.loc[ + mask_per_unit, "unit" + ].str.replace("per unit", "%") + legacy_input_data_df.loc[mask_per_unit, "value"] = ( + legacy_input_data_df.loc[mask_per_unit, "value"] * 100.0 + ) + logger.info( + "`per unit` replaced by `%`. Corresponding value multiplied by 100." + ) + + # Round all values after the unit conversions + legacy_input_data_df["value"] = legacy_input_data_df["value"].apply( + lambda value: LegacyInputDataV0134Parser._round_value(value, num_digits) + ) + + # Include currency_year in unit if applicable + legacy_input_data_df["unit"] = legacy_input_data_df.apply( + lambda row: Commons.update_unit_with_currency_year( + row["unit"], row["currency_year"] + ), + axis=1, + ) + logger.info("`currency_year` included in `unit` column.") + + # Build TechnologyCollection + legacy_input_data_output_base_path = pathlib.Path( + path_cwd, + "src", + "technologydata", + "parsers", + "legacy_input_data", + ) + output_technologies_path = pathlib.Path( + legacy_input_data_output_base_path, + "v0.13.4/technologies.json", + ) + output_sources_path = pathlib.Path( + legacy_input_data_output_base_path, + "v0.13.4/sources.json", + ) + + tech_col = LegacyInputDataV0134Parser._build_technology_collection( + legacy_input_data_df, + output_sources_path, + archive_source=archive_source, + output_schema=export_schema, + ) + + logger.info("TechnologyCollection object instantiated.") + tech_col.to_json(output_technologies_path, output_schema=export_schema) + logger.info("TechnologyCollection object exported to json.") diff --git a/src/technologydata/parsers/legacy_input_data/v0.13.4/sources.json b/src/technologydata/parsers/legacy_input_data/v0.13.4/sources.json new file mode 100644 index 00000000..357721fd --- /dev/null +++ b/src/technologydata/parsers/legacy_input_data/v0.13.4/sources.json @@ -0,0 +1,23 @@ +{ + "schema_version": 1, + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + }, + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] +} diff --git a/src/technologydata/parsers/legacy_input_data/v0.13.4/technologies.json b/src/technologydata/parsers/legacy_input_data/v0.13.4/technologies.json new file mode 100644 index 00000000..f9cfbb5e --- /dev/null +++ b/src/technologydata/parsers/legacy_input_data/v0.13.4/technologies.json @@ -0,0 +1,19097 @@ +{ + "schema_version": 1, + "technologies": [ + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1671.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2851.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "Advanced - Market", + "region": "USA", + "year": 2020, + "parameters": { + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 7103597.31, + "units": "USD_2023 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 480.1, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 405.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1342.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2062.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2258.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 294.7, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 205.8, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1086.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1646.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1797.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 262.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 169.5, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 888.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1322.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1440.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 226.6, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Advanced - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 134.0, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1671.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2851.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "Conservative - Market", + "region": "USA", + "year": 2020, + "parameters": { + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 19180739.93, + "units": "USD_2023 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 480.1, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 405.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2160.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2721.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 454.2, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 330.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1531.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1802.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 2598.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 430.3, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 307.8, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1466.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1509.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 2481.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 406.2, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Conservative - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 285.2, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1671.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2599.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2851.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "Moderate - Market", + "region": "USA", + "year": 2020, + "parameters": { + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 12398844.91, + "units": "USD_2023 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 480.1, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2022, + "parameters": { + "investment": { + "magnitude": 405.4, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1402.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2160.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2366.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 432.8, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 254.8, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1182.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1802.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1970.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 409.6, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 208.6, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1002.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1509.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1646.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 384.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "Moderate - Market", + "region": "USA", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 163.0, + "units": "USD_2022 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Ammonia cracker", + "detailed_technology": "Ammonia cracker", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "ammonia-input": { + "magnitude": 1.46, + "units": "dimensionless", + "carrier": "ammonia / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Assuming a integrated 200t/d cracking and purification facility. Electricity demand (316 MWh per 2186 MWh_LHV H2 output) is assumed to also be ammonia LHV input which seems a fair assumption as the facility has options for a higher degree of integration according to the report).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 liquefaction", + "detailed_technology": "CH4 liquefaction", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "methane-input": { + "magnitude": 1.0, + "units": "dimensionless", + "carrier": "dimensionless", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "For refrigeration cycle, cleaning of gas presumed unnecessary as it should be nearly pure CH4 (=SNG). Assuming energy required is only electricity which is for Table 3 in the source provided with efficiencies of ~50% of LHV, making the numbers consistent with the numbers in Table 2.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.036, + "units": "dimensionless", + "carrier": "electricity / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assuming 0.5 MWh/t_CH4 for refigeration cycle based on Table 2 of source; cleaning of gas presumed unnecessary as it should be nearly pure CH4 (=SNG). Assuming energy required is only electricity which is for Table 3 in the source provided with efficiencies of ~50% of LHV, making the numbers consistent with the numbers in Table 2.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CO2 liquefaction", + "detailed_technology": "CO2 liquefaction", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "carbondioxide-input": { + "magnitude": 1.0, + "units": "dimensionless", + "carrier": "dimensionless", + "heating_value": null, + "provenance": null, + "note": "Assuming a pure, humid, low-pressure input stream. Neglecting possible gross-effects of CO2 which might be cycled for the cooling process.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "heat-input": { + "magnitude": 0.0067, + "units": "megawatt_hour / metric_ton", + "carrier": "thermal / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "For drying purposes.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.123, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 liquefaction", + "detailed_technology": "H2 liquefaction", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "hydrogen-input": { + "magnitude": 1.017, + "units": "dimensionless", + "carrier": "dimensionless", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "corresponding to 1.65% losses during liquefaction", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.203, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "6.78 kWh/kg_H2, considering H2 with LHV of 33.3333 MWh/t", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Haber-Bosch", + "detailed_technology": "Haber-Bosch", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "electricity-input": { + "magnitude": 0.247, + "units": "dimensionless", + "carrier": "electricity / ammonia", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assume 5 GJ/t_NH3 for compressors and NH3 LHV = 5.16666 MWh/t_NH3.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "nitrogen-input": { + "magnitude": 0.16, + "units": "metric_ton / megawatt_hour", + "carrier": "nitrogen / ammonia", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": ".33 MWh electricity are required for ASU per t_NH3, considering 0.4 MWh are required per t_N2 and LHV of NH3 of 5.1666 Mwh.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.148, + "units": "dimensionless", + "carrier": "hydrogen / ammonia", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "178 kg_H2 per t_NH3, LHV for both assumed.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC hydrogenation", + "detailed_technology": "LOHC hydrogenation", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "hydrogen-input": { + "magnitude": 1.867, + "units": "megawatt_hour / metric_ton", + "carrier": "hydrogen / hydrogenated_dibenzyltoluene", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Considering 5.6 wt-% H2 in loaded LOHC (HLOHC) and LHV of H2.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.004, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / hydrogenated_dibenzyltoluene", + "heating_value": null, + "provenance": null, + "note": "Flow in figures shows 0.2 MW for 114 MW_HHV = 96.4326 MW_LHV = 2.89298 t hydrogen. At 5.6 wt-% effective H2 storage for loaded LOHC (H18-DBT, HLOHC), corresponds to 51.6604 t loaded LOHC .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lohc-input": { + "magnitude": 0.944, + "units": "dimensionless", + "carrier": "dehydrogenated_dibenzyltoluene / hydrogenated_dibenzyltoluene", + "heating_value": null, + "provenance": null, + "note": "Loaded LOHC (H18-DBT, HLOHC) has loaded only 5.6%-wt H2 as rate of discharge is kept at ca. 90%.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Methanol steam reforming", + "detailed_technology": "Methanol steam reforming", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "methanol-input": { + "magnitude": 1.201, + "units": "dimensionless", + "carrier": "methanol / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Assuming per 1 t_H2 (with LHV 33.3333 MWh/t): 4.5 MWh_th and 3.2 MWh_el are required. We assume electricity can be substituted / provided with 1:1 as heat energy.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Steam methane reforming", + "detailed_technology": "Steam methane reforming", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "methane-input": { + "magnitude": 1.483, + "units": "dimensionless", + "carrier": "methane / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Large scale SMR plant producing 2.5 kg/s H2 output (assuming 33.3333 MWh/t H2 LHV), with 6.9 kg/s CH4 input (feedstock) and 2 kg/s CH4 input (energy). Neglecting water consumption.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "air separation unit", + "detailed_technology": "air separation unit", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "electricity-input": { + "magnitude": 0.25, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / nitrogen", + "heating_value": null, + "provenance": null, + "note": "For consistency reasons use value from Danish Energy Agency. DEA also reports range of values (0.2-0.4 MWh/t_N2) on pg. 288. Other efficienices reported are even higher, e.g. 0.11 Mwh/t_N2 from Morgan (2013): Techno-Economic Feasibility Study of Ammonia Plants Powered by Offshore Wind .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "electricity-input": { + "magnitude": 0.4, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "0.4 MWh based on Beuttler et al (2019) for Climeworks LT DAC, alternative value: 0.182 MWh based on Breyer et al (2019). Should already include electricity for water scrubbing and compression (high quality CO2 output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "heat-input": { + "magnitude": 1.6, + "units": "megawatt_hour / metric_ton", + "carrier": "thermal / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Thermal energy demand. Provided via air-sourced heat pumps. 1.6 MWh based on Beuttler et al (2019) for Climeworks LT DAC, alternative value: 1.102 MWh based on Breyer et al (2019).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanation", + "detailed_technology": "methanation", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "hydrogen-input": { + "magnitude": 1.282, + "units": "dimensionless", + "carrier": "hydrogen / methane", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Based on ideal conversion process of stochiometric composition (1 t CH4 contains 750 kg of carbon).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.198, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Additional H2 required for methanation process (2x H2 amount compared to stochiometric conversion).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanolisation", + "detailed_technology": "methanolisation", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "electricity-input": { + "magnitude": 0.271, + "units": "dimensionless", + "carrier": "electricity / methanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.138, + "units": "dimensionless", + "carrier": "hydrogen / methanol", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "189 kg_H2 per t_MeOH", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.248, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / methanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "heat-output": { + "magnitude": 0.1, + "units": "dimensionless", + "carrier": "thermal / methanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "steam generation of 2 GJ/t_MeOH", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "seawater RO desalination", + "detailed_technology": "seawater RO desalination", + "case": "not_available", + "region": "other", + "year": 0, + "parameters": { + "electricity-input": { + "magnitude": 0.003, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / water", + "heating_value": null, + "provenance": null, + "note": "Desalination using SWRO. Assume medium salinity of 35 Practical Salinity Units (PSUs) = 35 kg/m^3.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (g) submarine pipeline", + "detailed_technology": "CH4 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2002, + "parameters": { + "investment": { + "magnitude": 112.64, + "units": "EUR_2014 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on Gulfstream pipeline costs (430 mi long pipeline for natural gas in deep/shallow waters) of 2.72e6 USD/mi and 1.31 bn ft^3/d capacity (36 in diameter), LHV of methane 13.8888 MWh/t and density of 0.657 kg/m^3 and 1.17 USD:1EUR conversion rate = 102.4 EUR/MW/km. Number is without booster station cost. Estimation of additional cost for booster stations based on H2 (g) pipeline numbers from Guidehouse (2020): European Hydrogen Backbone report and Danish Energy Agency (2021): Technology Data for Energy Transport, were booster stations make ca. 6% of pipeline cost; here add additional 10% for booster stations as they need to be constructed submerged or on plattforms. (102.4*1.1).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CO2 liquefaction", + "detailed_technology": "CO2 liquefaction", + "case": "not_available", + "region": "other", + "year": 2004, + "parameters": { + "investment": { + "magnitude": 12.893, + "units": "EUR_2004 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Plant capacity of 20 kt CO2 / d and an uptime of 85%. For a high purity, humid, low pressure input stream, includes drying and compression necessary for liquefaction.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "cement dry clinker", + "detailed_technology": "cement dry clinker", + "case": "not_available", + "region": "other", + "year": 2006, + "parameters": { + "investment": { + "magnitude": 1095000.0, + "units": "EUR_2015 * hour / metric_ton", + "carrier": "1 / clinker", + "heating_value": null, + "provenance": null, + "note": "Original value 125 EUR/t/year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 5.0, + "units": "EUR_2015 / metric_ton", + "carrier": "1 / clinker", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "gas-input": { + "magnitude": 0.00016, + "units": "megawatt_hour / metric_ton", + "carrier": "natural_gas / clinker", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Original values 0.0058 PJ per Mt clinker", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.0694, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / clinker", + "heating_value": null, + "provenance": null, + "note": "Original values 0.25 PJ per Mt clinker", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "heat-input": { + "magnitude": 0.944, + "units": "megawatt_hour / metric_ton", + "carrier": "thermal / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Original values 3.4 PJ per Mt clinker", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "cement finishing", + "detailed_technology": "cement finishing", + "case": "not_available", + "region": "other", + "year": 2006, + "parameters": { + "investment": { + "magnitude": 87600.0, + "units": "EUR_2015 * hour / metric_ton", + "carrier": "1 / cement", + "heating_value": null, + "provenance": null, + "note": "Original value 10 EUR/t/year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 30.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 3.0, + "units": "EUR_2015 / metric_ton", + "carrier": "1 / cement", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.174, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / cement", + "heating_value": null, + "provenance": null, + "note": "Based on inputs for DE (major EU producer) with original value 0.6251 PJ per Mt cement.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "clinker-input": { + "magnitude": 0.656, + "units": "dimensionless", + "carrier": "clinker / cement", + "heating_value": null, + "provenance": null, + "note": "Based on inputs for DE (major EU producer)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "slag-input": { + "magnitude": 0.194, + "units": "dimensionless", + "carrier": "slag / cement", + "heating_value": null, + "provenance": null, + "note": "Based on inputs for DE (major EU producer)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on inputs for DE (major EU producer)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from starch crop", + "detailed_technology": "ethanol from starch crop", + "case": "not_available", + "region": "other", + "year": 2010, + "parameters": { + "investment": { + "magnitude": 819630.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 11.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 24.9, + "units": "EUR_2015 / megawatt_hour", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value 6.93 MEUR/PJ VAROM", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 58.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production. Converted from 0.35 t_crop/t_eth, LHV_crop = 16.1 GJ/t, LHV_ethanol = 26.7 GJ/t", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from sugar crops", + "detailed_technology": "ethanol from sugar crops", + "case": "not_available", + "region": "other", + "year": 2010, + "parameters": { + "investment": { + "magnitude": 659330.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 13.57, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 21.9, + "units": "EUR_2015 / megawatt_hour", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for Brazilian production, original value 6.09 MEUR/PJ VAROM", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for Brazilian production", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 45.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for Brazilian production. Converted from 0.292 t_crop/t_eth, LHV_crop = 16.1 GJ/t, LHV_ethanol = 26.7 GJ/t", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "General liquid hydrocarbon storage (crude)", + "detailed_technology": "General liquid hydrocarbon storage (crude)", + "case": "not_available", + "region": "other", + "year": 2012, + "parameters": { + "investment": { + "magnitude": 128.0, + "units": "EUR_2012 / meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumed 20% lower than for product storage. Crude or middle distillate tanks are usually larger compared to product storage due to lower requirements on safety and different construction method. Reference size used here: 80 000 – 120 000 m^3 .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 6.25, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assuming ca. 10 EUR/m^3/a (center value between stand alone and addon facility).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "General liquid hydrocarbon storage (product)", + "detailed_technology": "General liquid hydrocarbon storage (product)", + "case": "not_available", + "region": "other", + "year": 2012, + "parameters": { + "investment": { + "magnitude": 160.0, + "units": "EUR_2012 / meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumed at the higher end for addon facilities/mid-range for stand-alone facilities. Product storage usually smaller due to higher requirements on safety and different construction method. Reference size used here: 40 000 - 60 000 m^3 .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 6.25, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assuming ca. 10 EUR/m^3/a (center value between stand alone and addon facility).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC loaded DBT storage", + "detailed_technology": "LOHC loaded DBT storage", + "case": "not_available", + "region": "other", + "year": 2012, + "parameters": { + "investment": { + "magnitude": 140.659, + "units": "EUR_2012 / metric_ton", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared. Density of loaded LOHC H18-DBT is 0.91 t/m^3.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 6.25, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC unloaded DBT storage", + "detailed_technology": "LOHC unloaded DBT storage", + "case": "not_available", + "region": "other", + "year": 2012, + "parameters": { + "investment": { + "magnitude": 124.635, + "units": "EUR_2012 / metric_ton", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared. Density of loaded LOHC H18-DBT is 0.91 t/m^3, density of unloaded LOHC H0-DBT is 1.04 t/m^3 but unloading is only to 90% (depth-of-discharge), assume density via linearisation of 1.027 t/m^3.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 6.25, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methane storage tank incl. compressor", + "detailed_technology": "methane storage tank incl. compressor", + "case": "not_available", + "region": "other", + "year": 2014, + "parameters": { + "investment": { + "magnitude": 8460.0, + "units": "EUR_2014 / meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assume 5USD/l (= 4.23 EUR/l at 1.17 USD/EUR exchange rate) for type 1 pressure vessel for 200 bar storage and 100% surplus costs for including compressor costs with storage, based on similar assumptions by DEA for compressed hydrogen storage tanks.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on assumptions for hydrogen storage tank type 1 including compressor (by DEA).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on assumptions for hydrogen storage tank 1 including compressor (by DEA).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (g) submarine pipeline", + "detailed_technology": "CH4 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline", + "detailed_technology": "H2 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline repurposed", + "detailed_technology": "H2 (g) submarine pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (l) storage tank", + "detailed_technology": "H2 (l) storage tank", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "investment": { + "magnitude": 750.075, + "units": "EUR_2015 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assuming currency year and technology year here (25 EUR/kg). Future target cost. Today’s cost potentially higher according to d’Amore-Domenech et al (2021): 10.1016/j.apenergy.2021.116625 , supplementary material pg. 16.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assuming currency year and technology year here (25 EUR/kg).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assuming currency year and technology year here (25 EUR/kg).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC dehydrogenation", + "detailed_technology": "LOHC dehydrogenation", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "investment": { + "magnitude": 50728.03, + "units": "EUR_2015 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "per MW H2 (LHV). For a large plant of 1000 MW capacity. Calculated based on base CAPEX of 30 MEUR for 300 t/day capacity and a scale factor of 0.6.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC hydrogenation", + "detailed_technology": "LOHC hydrogenation", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "investment": { + "magnitude": 51259.544, + "units": "EUR_2015 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "per MW H2 (LHV). For a large plant of 2000 MW capacity. Calculated based on base CAPEX of 40 MEUR for 300 t/day capacity and a scale factor of 0.6.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Steam methane reforming", + "detailed_technology": "Steam methane reforming", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "investment": { + "magnitude": 470085.47, + "units": "EUR_2015 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Large scale SMR facility (150-300 MW). Currency conversion 1.17 USD = 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Large scale SMR facility (150-300 MW).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Large scale SMR facility (150-300 MW).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electric steam cracker", + "detailed_technology": "electric steam cracker", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "investment": { + "magnitude": 10512000.0, + "units": "EUR_2015 * hour / metric_ton", + "carrier": "1 / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": "Assuming CAPEX of 1200 €/t actually given in €/(t/a).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 180.0, + "units": "EUR_2015 / metric_ton", + "carrier": "1 / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "naphtha-input": { + "magnitude": 14.8, + "units": "megawatt_hour / metric_ton", + "carrier": "naphtha / high_value_chemicals", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 2.7, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": "Assuming electrified processing.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-output": { + "magnitude": 0.55, + "units": "dimensionless", + "carrier": "carbon_dioxide / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": "The report also references another source with 0.76 t_CO2/t_HVC", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanol-to-olefins/aromatics", + "detailed_technology": "methanol-to-olefins/aromatics", + "case": "not_available", + "region": "other", + "year": 2015, + "parameters": { + "investment": { + "magnitude": 2628000.0, + "units": "EUR_2015 * hour / metric_ton", + "carrier": "1 / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": "Assuming CAPEX of 1200 €/t actually given in €/(t/a).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "same as steam cracker", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "same as steam cracker", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 30.0, + "units": "EUR_2015 / metric_ton", + "carrier": "1 / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.389, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": "5 GJ/t_HVC", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "methanol-input": { + "magnitude": 18.03, + "units": "megawatt_hour / metric_ton", + "carrier": "methanol / high_value_chemicals", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Weighted average: 2.83 t_MeOH/t_ethylene+propylene for 21.7 Mt of ethylene and 17 Mt of propylene, 4.2 t_MeOH/t_BTX for 15.7 Mt of BTX. Assuming 5.54 MWh_MeOH/t_MeOH. ", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-output": { + "magnitude": 0.611, + "units": "dimensionless", + "carrier": "carbon_dioxide / high_value_chemicals", + "heating_value": null, + "provenance": null, + "note": "Weighted average: 0.4 t_MeOH/t_ethylene+propylene for 21.7 Mt of ethylene and 17 Mt of propylene, 1.13 t_CO2/t_BTX for 15.7 Mt of BTX. The report also references process emissions of 0.55 t_MeOH/t_ethylene+propylene elsewhere. ", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LNG storage tank", + "detailed_technology": "LNG storage tank", + "case": "not_available", + "region": "other", + "year": 2019, + "parameters": { + "investment": { + "magnitude": 662.0, + "units": "EUR_2019 / meter ** 3", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Currency year and technology year assumed based on publication date.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Currency year and technology year assumed based on publication date.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Currency year and technology year assumed based on publication date.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.5, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 6.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 625.9, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.54, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer medium size", + "detailed_technology": "Alkaline electrolyzer medium size", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.633, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 18.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 497.7, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.21, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer small size", + "detailed_technology": "Alkaline electrolyzer small size", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.62, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 18.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 865.9, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.96, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (g) pipeline", + "detailed_technology": "CH4 (g) pipeline", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "electricity-input": { + "magnitude": 1e-8, + "units": "1 / meter", + "carrier": "electricity / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for gas pipeline >100MW, 0.1% per station and spacing of 100km yields 1%/1000km. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (g) submarine pipeline", + "detailed_technology": "CH4 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "electricity-input": { + "magnitude": 1e-8, + "units": "1 / meter", + "carrier": "electricity / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for gas pipeline >100MW, 0.1% per station and spacing of 100km yields 1%/1000km. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CO2 pipeline", + "detailed_technology": "CO2 pipeline", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2000.0, + "units": "EUR_2015 * hour / kilometer / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Assuming the 120-500 t CO2/h range that is based on cost of a 12 inch onshore pipeline.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 0.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CO2 submarine pipeline", + "detailed_technology": "CO2 submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 4000.0, + "units": "EUR_2015 * hour / kilometer / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Assuming the 120-500 t CO2/h range that is based on cost of a 12 inch offshore pipeline.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 0.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-IGCC", + "detailed_technology": "Coal-IGCC", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 50.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "efficiency": { + "magnitude": 70.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 1696429.0, + "units": "USD_2022 / megawatt", + "carrier": "1 / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.43, + "units": "dimensionless", + "carrier": "hydrogen / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.04, + "units": "dimensionless", + "carrier": "electricity / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.32, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "efficiency": { + "magnitude": 79.9, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 788000.0, + "units": "EUR_2017 / megawatt", + "carrier": "1 / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Well developed technology, no significant learning expected.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.531, + "units": "dimensionless", + "carrier": "hydrogen / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.008, + "units": "dimensionless", + "carrier": "electricity / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.36, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) fill compressor station", + "detailed_technology": "H2 (g) fill compressor station", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 4478.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for staging 35β†’140bar, 6000 MW_HHV single line pipeline. Considering HHV/LHV ration for H2.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.7, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Pessimistic (highest) value chosen for 48'' pipeline w/ 13GW_H2 LHV @ 100bar pressure. Currency year: Not clearly specified, assuming year of publication. Forecast year: Not clearly specified, guessing based on text remarks.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) pipeline", + "detailed_technology": "H2 (g) pipeline", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 363.08, + "units": "EUR_2023 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 48 inch single line pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 4.4 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 140 bar, > 6000 MW_HHV single line pipeline, incl. booster station investments. Considering LHV by scaling with LHV/HHV=0.8462623413.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 140 bar, > 6000 MW_HHV single line pipeline, incl. booster station investments. Considering LHV by scaling with LHV/HHV=0.8462623413.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 2.1e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) pipeline repurposed", + "detailed_technology": "H2 (g) pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 154.79, + "units": "EUR_2023 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 48 inch single line repurposed pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 0.8 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Same as for new H2 (g) pipeline.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Same as for new H2 (g) pipeline.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 2.1e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline", + "detailed_technology": "H2 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 545.325, + "units": "EUR_2023 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 48 inch single line offshore pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 7.48 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 2.1e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline repurposed", + "detailed_technology": "H2 (g) submarine pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 191.48, + "units": "EUR_2023 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 48 inch single line repurposed offshore pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 1.5 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 2.1e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production biomass gasification", + "detailed_technology": "H2 production biomass gasification", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "wood-input": { + "magnitude": 1.804, + "units": "dimensionless", + "carrier": "wood / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.097, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 1290.6, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.45, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production biomass gasification CC", + "detailed_technology": "H2 production biomass gasification CC", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "wood-input": { + "magnitude": 1.804, + "units": "dimensionless", + "carrier": "wood / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.143, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 1309.2, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.46, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification", + "detailed_technology": "H2 production coal gasification", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "coal-input": { + "magnitude": 1.77, + "units": "dimensionless", + "carrier": "coal / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.07, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 462.5, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.587, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification CC", + "detailed_technology": "H2 production coal gasification CC", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "coal-input": { + "magnitude": 1.77, + "units": "dimensionless", + "carrier": "coal / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.111, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 7.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 520.4, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.2, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production heavy oil partial oxidation", + "detailed_technology": "H2 production heavy oil partial oxidation", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "oil-input": { + "magnitude": 1.3, + "units": "dimensionless", + "carrier": "oil / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.063, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 431.8, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.14, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production natural gas steam reforming", + "detailed_technology": "H2 production natural gas steam reforming", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "gas-input": { + "magnitude": 1.32, + "units": "dimensionless", + "carrier": "natural_gas / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.02, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 201.2, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.29, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production natural gas steam reforming CC", + "detailed_technology": "H2 production natural gas steam reforming CC", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "gas-input": { + "magnitude": 1.52, + "units": "dimensionless", + "carrier": "natural_gas / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.05, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.2, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 272.8, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.53, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production solid biomass steam reforming", + "detailed_technology": "H2 production solid biomass steam reforming", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "wood-input": { + "magnitude": 1.36, + "units": "dimensionless", + "carrier": "wood / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.044, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 519.3, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.65, + "units": "EUR_2010 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Methanol steam reforming", + "detailed_technology": "Methanol steam reforming", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 18016.867, + "units": "EUR_2020 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "For high temperature steam reforming plant with a capacity of 200 MW_H2 output (6t/h). Reference plant of 1 MW (30kg_H2/h) costs 150kEUR, scale factor of 0.6 assumed.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame)", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame)", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "efficiency": { + "magnitude": 57.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NH3 (l) storage tank incl. liquefaction", + "detailed_technology": "NH3 (l) storage tank incl. liquefaction", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 146.667, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / ammonia", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Based on estimated for a double-wall liquid ammonia tank (~ambient pressure, -33Β°C), inner tank from stainless steel, outer tank from concrete including installations for liquefaction/condensation, boil-off gas recovery and safety installations; the necessary installations make only a small fraction of the total cost. The total cost are driven by material and working time on the tanks.\nWhile the costs do not scale strictly linearly, we here assume they do (good approximation c.f. ref. Fig 55.) and take the costs for a 9 kt NH3 (l) tank = 8 M$2010, which is smaller 4-5x smaller than the largest deployed tanks today.\nWe assume an exchange rate of 1.17$ to 1 €.\nThe investment value is given per MWh NH3 store capacity, using the LHV of NH3 of 5.18 MWh/t.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 6.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Likely stack lifetime, rather than electrolyzer system lifetime", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.43, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 1 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 1 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 1200.0, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 1 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.22, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 2651.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "US-based assumptions for a Conservative cost scenario", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "US-based assumptions for a Conservative cost scenario", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biodiesel crops", + "detailed_technology": "biodiesel crops", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 84.585, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "bioethanol crops", + "detailed_technology": "bioethanol crops", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 54.643, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "CO2 intensity": { + "magnitude": 0.129, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / thermal", + "heating_value": null, + "provenance": null, + "note": "CO2 released during fermentation of bioethanol crops, based on stochiometric composition: C6H12O6 -> 2 C2H5OH + 2 CO2 , i.e. 1 kg ethanol β†’ ~0.956 kg COβ‚‚ (from fermentation) β†’ 0.1289 tCOβ‚‚/MWh (with LHV = 26.7 MJ/kg).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biogas manure", + "detailed_technology": "biogas manure", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 17.371, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "blast furnace-basic oxygen furnace", + "detailed_technology": "blast furnace-basic oxygen furnace", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 7637406.0, + "units": "EUR_2020 * hour / metric_ton", + "carrier": "1 / steel", + "heating_value": null, + "provenance": null, + "note": "871.85 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜Avg BF-BOF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 14.18, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "123.67 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜BF-BOF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "economic_lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "coal-input": { + "magnitude": 1.43, + "units": "megawatt_hour / metric_ton", + "carrier": "coal / steel", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Based on process β€˜Avg BF-BOF` using 195 kg_PCI/t_HM (PCI = Pulverized Coal Injected; HM = Hot Metal) as substitute for coke, 24 MJ/kg as LHV for coal and 1 : 1.1 as HM-to-steel ratio.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "ore-input": { + "magnitude": 1.539, + "units": "dimensionless", + "carrier": "ore / steel", + "heating_value": null, + "provenance": null, + "note": "Based on process β€˜Avg BF-BOF`", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "scrap-input": { + "magnitude": 0.051, + "units": "dimensionless", + "carrier": "scrap / steel", + "heating_value": null, + "provenance": null, + "note": "Based on process β€˜Avg BF-BOF`", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "coal", + "detailed_technology": "coal", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 4575.69, + "units": "EUR_2023 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Higher costs include coal plants with CCS, but since using here for calculating the average nevertheless. Calculated based on average of listed range, i.e. (3200+6775) USD/kW_e/2 / (1.09 USD/EUR).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.31, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Calculated based on average of listed range, i.e. (39.5+91.25) USD/kW_e/a /2 / (1.09 USD/EUR) / investment cost * 100.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 3.899, + "units": "EUR_2023 / megawatt_hour", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Calculated based on average of listed range, i.e. (3+5.5)USD/MWh_e/2 / (1.09 USD/EUR).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 35.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Calculated based on average of listed range, i.e. 1 / ((8.75+12) MMbtu/MWh_th /2 / (3.4095 MMbtu/MWh_th)), rounded up.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "fuel": { + "magnitude": 8.4, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on IEA 2011 data, 99 USD/t.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower", + "detailed_technology": "csp-tower", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 159.96, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower TES", + "detailed_technology": "csp-tower TES", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 21.43, + "units": "EUR_2020 / kilowatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower power block", + "detailed_technology": "csp-tower power block", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1120.57, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "direct air capture", + "detailed_technology": "direct air capture", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.24, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "heat-input": { + "magnitude": 1.17, + "units": "megawatt_hour / metric_ton", + "carrier": "thermal / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "dry bulk carrier Capesize", + "detailed_technology": "dry bulk carrier Capesize", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "capacity": { + "magnitude": 180000.0, + "units": "metric_ton", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "DWT; corresponds to size of Capesize bulk carriers which have previously docked at the habour in Hamburg, Germany. Short of 200 kt limit for VLBCs.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 40000000.0, + "units": "EUR_2020", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "See figure for β€˜Dry Bulk Newbuild Prices’, Capesize at end of 2020. Exchange rate: 1.15 USD = 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "5000 USD/d OPEX, exchange rate: 1.15 USD = 1 EUR; absolute value calculate relative to investment cost.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Expected lifetime.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electric arc furnace", + "detailed_technology": "electric arc furnace", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1839600.0, + "units": "EUR_2020 * hour / metric_ton", + "carrier": "1 / steel", + "heating_value": null, + "provenance": null, + "note": "210 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜EAF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 30.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "EAF has high OPEX of 62.99 EUR/year/t_steel, presumably because of electrode corrosion.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "economic_lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.639, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / steel", + "heating_value": null, + "provenance": null, + "note": "Based on process β€˜EAF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hbi-input": { + "magnitude": 1.0, + "units": "dimensionless", + "carrier": "hot_briquetted_iron / steel", + "heating_value": null, + "provenance": null, + "note": "Assume HBI instead of scrap as input.Scrap would require higher input (in tonnes) as steel content is lower.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electric arc furnace with hbi and scrap", + "detailed_technology": "electric arc furnace with hbi and scrap", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 1839600.0, + "units": "EUR_2020 * hour / metric_ton", + "carrier": "1 / steel", + "heating_value": null, + "provenance": null, + "note": "210 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜EAF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 30.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "EAF has high OPEX of 62.99 EUR/year/t_steel, presumably because of electrode corrosion.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "economic_lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.639, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / steel", + "heating_value": null, + "provenance": null, + "note": "Based on process β€˜EAF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hbi-input": { + "magnitude": 0.37, + "units": "dimensionless", + "carrier": "hot_briquetted_iron / steel", + "heating_value": null, + "provenance": null, + "note": "Assume HBI instead of scrap as input.Scrap would require higher input (in tonnes) as steel content is lower.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "scrap-input": { + "magnitude": 0.71, + "units": "dimensionless", + "carrier": "scrap / steel", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electrolysis", + "detailed_technology": "electrolysis", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2000.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from starch crop", + "detailed_technology": "ethanol from starch crop", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 677090.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 13.8, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from sugar crops", + "detailed_technology": "ethanol from sugar crops", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 501090.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 16.43, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "fuelwood", + "detailed_technology": "fuelwood", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 14.067, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "gas", + "detailed_technology": "gas", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 21.6, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on IEA 2011 data.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "geothermal", + "detailed_technology": "geothermal", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "CO2 intensity": { + "magnitude": 0.12, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / electricity", + "heating_value": null, + "provenance": null, + "note": "Likely to be improved; Average of 85 percent of global egs power plant capacity; Result of fluid circulation through rock formations", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "district heat-input": { + "magnitude": 0.8, + "units": "dimensionless", + "carrier": "dimensionless", + "heating_value": null, + "provenance": null, + "note": "Heat-input, District Heat-output. This is an assessment of typical heat losses when heat is transmitted from the EGS plant to the DH network, This is a rough estimate, depends on local conditions", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "See Supplemental Material of source for details", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "district heat surcharge": { + "magnitude": 25.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "If capital cost of electric generation from EGS is 100%, district heating adds additional 25%. Costs incurred by piping.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen direct iron reduction furnace", + "detailed_technology": "hydrogen direct iron reduction furnace", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 4277858.0, + "units": "EUR_2020 * hour / metric_ton", + "carrier": "1 / hot_briquetted_iron", + "heating_value": null, + "provenance": null, + "note": "488.34 EUR/t_HBI output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜DRI-EAF_100% green H2’, substract β€˜EAF’ CAPEX here to estimate DRI furnace cost.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 11.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "55.28 EUR/t_HBI output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜DRI-EAF_100% green H2’, substract β€˜EAF’ OPEX here to estimate DRI furnace cost.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "economic_lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.03, + "units": "megawatt_hour / metric_ton", + "carrier": "electricity / hot_briquetted_iron", + "heating_value": null, + "provenance": null, + "note": "Based on process β€˜DRI-EAF_100% green H2’ reduced by electricity demand of process β€˜EAF’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 2.1, + "units": "megawatt_hour / metric_ton", + "carrier": "hydrogen / hot_briquetted_iron", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "63 kg H2/t steel for process β€˜DRI-EAF_100% green H2’ according to documentation (raw input files for MPP model list 73 kg H2 / t steel, which seems to high and is probably incorrect).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "ore-input": { + "magnitude": 1.59, + "units": "dimensionless", + "carrier": "ore / hot_briquetted_iron", + "heating_value": null, + "provenance": null, + "note": "Based on process β€˜DRI-EAF_100% green H2’.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen storage compressor", + "detailed_technology": "hydrogen storage compressor", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 2.28, + "units": "USD_2022 / kilowatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "compression-electricity-input": { + "magnitude": 0.05, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "1.707 kWh/kg.", + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen storage tank type 1", + "detailed_technology": "hydrogen storage tank type 1", + "case": "not_available", + "region": "USA", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 16.87, + "units": "USD_2022 / kilowatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "min_fill_level": { + "magnitude": 6.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron ore DRI-ready", + "detailed_technology": "iron ore DRI-ready", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "commodity": { + "magnitude": 97.73, + "units": "EUR_2020 / metric_ton", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "DRI ready assumes 65% iron content, requiring no additional benefication.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "lignite", + "detailed_technology": "lignite", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 4575.69, + "units": "EUR_2023 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Higher costs include coal plants with CCS, but since using here for calculating the average nevertheless. Calculated based on average of listed range, i.e. (3200+6775) USD/kW_e/2 / (1.09 USD/EUR). Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.31, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Calculated based on average of listed range, i.e. (39.5+91.25) USD/kW_e/a /2 / (1.09 USD/EUR) / investment cost * 100. Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . ", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 3.899, + "units": "EUR_2023 / megawatt_hour", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Calculated based on average of listed range, i.e. (3+5.5)USD/MWh_e/2 / (1.09 USD/EUR). Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . ", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . ", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 33.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Calculated based on average of listed range, i.e. 1 / ((8.75+12) MMbtu/MWh_th /2 / (3.4095 MMbtu/MWh_th)), rounded up. Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . ", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "fuel": { + "magnitude": 2.9, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on IEA 2011 data, 10 USD/t.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanation", + "detailed_technology": "methanation", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 748.0, + "units": "EUR_2017 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on lifetime for methanolisation, Fischer-Tropsch plants.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanol-to-kerosene", + "detailed_technology": "methanol-to-kerosene", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "methanol-input": { + "magnitude": 1.076, + "units": "dimensionless", + "carrier": "methanol / kerosene", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Assuming LHV 11.94 kWh/kg for kerosene, 5.54 kWh/kg for methanol, 33.3 kWh/kg for hydrogen.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 0.0279, + "units": "dimensionless", + "carrier": "hydrogen / kerosene", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Assuming LHV 11.94 kWh/kg for kerosene, 5.54 kWh/kg for methanol, 33.3 kWh/kg for hydrogen.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 307000.0, + "units": "EUR_2020 / megawatt", + "carrier": "1 / kerosene", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 1.35, + "units": "EUR_2020 / megawatt_hour", + "carrier": "1 / kerosene", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanolisation", + "detailed_technology": "methanolisation", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 788000.0, + "units": "EUR_2017 / megawatt", + "carrier": "1 / methanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Well developed technology, no significant learning expected.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "natural gas direct iron reduction furnace", + "detailed_technology": "natural gas direct iron reduction furnace", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 4277858.0, + "units": "EUR_2020 * hour / metric_ton", + "carrier": "1 / hot_briquetted_iron", + "heating_value": null, + "provenance": null, + "note": "488.34 EUR/t_HBI output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜DRI-EAF_100% green H2’, substract β€˜EAF’ CAPEX here to estimate DRI furnace cost.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 11.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "economic_lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "gas-input": { + "magnitude": 2.78, + "units": "megawatt_hour / metric_ton", + "carrier": "natural_gas / hot_briquetted_iron", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "Original value 10 GJ/t_DRI.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "ore-input": { + "magnitude": 1.59, + "units": "dimensionless", + "carrier": "ore / hot_briquetted_iron", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "nuclear", + "detailed_technology": "nuclear", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "investment": { + "magnitude": 10275.0, + "units": "EUR_2023 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "U.S. specific costs including newly commissioned Vogtle plant, average of range and currency converted, i.e. (8475+13925)/2 USD/kW_e / (1.09 USD/EUR) .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.27, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "U.S. specific costs including newly commissioned Vogtle plant, average of range and currency converted, i.e. (131.5+152.75)/2 USD/kW_e / (1.09 USD/EUR) relative to investment costs.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 4.24, + "units": "EUR_2023 / megawatt_hour", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "U.S. specific costs including newly commissioned Vogtle plant, average of range and currency converted, i.e. (4.25+5)/2 USD/kW_e / (1.09 USD/EUR) .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 32.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on heat rate of 10.45 MMBtu/MWh_e and 3.4095 MMBtu/MWh_th, i.e. 1/(10.45/3.4095) = 0.3260.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "fuel": { + "magnitude": 3.0, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on IEA 2011 data.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float", + "detailed_technology": "offwind-float", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "organic rankine cycle", + "detailed_technology": "organic rankine cycle", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.12, + "units": "dimensionless", + "carrier": "electricity / thermal", + "heating_value": null, + "provenance": null, + "note": "Heat-input, Electricity-output. This is a rough estimate, depends on input temperature, implies ~150 C.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Both for flash, binary and ORC plants. See Supplemental Material for details", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 1376.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Low rollout complicates the estimation, compounded by a dependence both on plant size and temperature, converted from 1500 USD/kW using currency conversion 1.09 USD = 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "shipping fuel methanol", + "detailed_technology": "shipping fuel methanol", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 72.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "400 EUR/t assuming range roughly in the long-term range for green methanol (source 1) and late 2020+beyond values for grey methanol (source 2).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "CO2 intensity": { + "magnitude": 0.248, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on stochiometric composition.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "uranium", + "detailed_technology": "uranium", + "case": "not_available", + "region": "other", + "year": 2020, + "parameters": { + "fuel": { + "magnitude": 3.0, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on IEA 2011 data.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery inverter", + "detailed_technology": "battery inverter", + "case": "not_available", + "region": "USA", + "year": 2022, + "parameters": { + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "battery storage", + "detailed_technology": "battery storage", + "case": "not_available", + "region": "USA", + "year": 2022, + "parameters": { + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "electricity-input": { + "magnitude": 1.38, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 377.2, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.21, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer medium size", + "detailed_technology": "Alkaline electrolyzer medium size", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "electricity-input": { + "magnitude": 1.416, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 18.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 497.7, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer small size", + "detailed_technology": "Alkaline electrolyzer small size", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "electricity-input": { + "magnitude": 1.41, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 18.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 512.5, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification", + "detailed_technology": "H2 production coal gasification", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "coal-input": { + "magnitude": 1.77, + "units": "dimensionless", + "carrier": "coal / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.07, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 462.5, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.587, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification CC", + "detailed_technology": "H2 production coal gasification CC", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "coal-input": { + "magnitude": 1.77, + "units": "dimensionless", + "carrier": "coal / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.111, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 7.9, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 520.4, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.2, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production natural gas steam reforming", + "detailed_technology": "H2 production natural gas steam reforming", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "gas-input": { + "magnitude": 1.32, + "units": "dimensionless", + "carrier": "natural_gas / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 201.2, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production natural gas steam reforming CC", + "detailed_technology": "H2 production natural gas steam reforming CC", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "gas-input": { + "magnitude": 1.52, + "units": "dimensionless", + "carrier": "natural_gas / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.05, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.2, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 272.8, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electrolysis", + "detailed_technology": "electrolysis", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "investment": { + "magnitude": 1800.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from starch crop", + "detailed_technology": "ethanol from starch crop", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "investment": { + "magnitude": 614720.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 15.2, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from sugar crops", + "detailed_technology": "ethanol from sugar crops", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "investment": { + "magnitude": 454930.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 18.09, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery", + "detailed_technology": "iron-air battery", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "FOM": { + "magnitude": 1.022, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 30.05, + "units": "EUR_2023 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery charge", + "detailed_technology": "iron-air battery charge", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "efficiency": { + "magnitude": 70.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery discharge", + "detailed_technology": "iron-air battery discharge", + "case": "not_available", + "region": "other", + "year": 2025, + "parameters": { + "efficiency": { + "magnitude": 59.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer large size", + "detailed_technology": "Alkaline electrolyzer large size", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 2.8, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 377.2, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 72 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer medium size", + "detailed_technology": "Alkaline electrolyzer medium size", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 2.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 444.9, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 33 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Alkaline electrolyzer small size", + "detailed_technology": "Alkaline electrolyzer small size", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 2.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 512.5, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.17, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 0.6 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Ammonia cracker", + "detailed_technology": "Ammonia cracker", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1062107.74, + "units": "EUR_2015 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Calculated. For a small (200 t_NH3/d input) facility. Base cost for facility: 51 MEUR at capacity 20 000m^3_NH3/h = 339 t_NH3/d input. Cost scaling exponent 0.67. Ammonia density 0.7069 kg/m^3. Conversion efficiency of cracker: 0.685. Ammonia LHV: 5.167 MWh/t_NH3.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Estimated based on Labour cost rate, Maintenance cost rate, Insurance rate, Admin. cost rate and Chemical & other consumables cost rate.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (l) transport ship", + "detailed_technology": "CH4 (l) transport ship", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 151000000.0, + "units": "EUR_2015", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capacity": { + "magnitude": 58300.0, + "units": "metric_ton", + "carrier": "methane", + "heating_value": null, + "provenance": null, + "note": "based on 138 000 m^3 capacity and LNG density of 0.4226 t/m^3 .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 evaporation", + "detailed_technology": "CH4 evaporation", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 71.86, + "units": "EUR_2005 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "based on 100 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 liquefaction", + "detailed_technology": "CH4 liquefaction", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 190.43, + "units": "EUR_2005 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "based on 265 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal integrated retrofit 90%-CCS", + "detailed_technology": "Coal integrated retrofit 90%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 38.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal integrated retrofit 95%-CCS", + "detailed_technology": "Coal integrated retrofit 95%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 38.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-95%-CCS", + "detailed_technology": "Coal-95%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 40.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-99%-CCS", + "detailed_technology": "Coal-99%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 40.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Coal-IGCC-90%-CCS", + "detailed_technology": "Coal-IGCC-90%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 40.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 677000.0, + "units": "EUR_2017 / megawatt", + "carrier": "1 / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Well developed technology, no significant learning expected.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.421, + "units": "dimensionless", + "carrier": "hydrogen / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.007, + "units": "dimensionless", + "carrier": "electricity / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.326, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) pipeline", + "detailed_technology": "H2 (g) pipeline", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "electricity-input": { + "magnitude": 1.9e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) pipeline repurposed", + "detailed_technology": "H2 (g) pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "electricity-input": { + "magnitude": 1.9e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline", + "detailed_technology": "H2 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "electricity-input": { + "magnitude": 1.9e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline repurposed", + "detailed_technology": "H2 (g) submarine pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "electricity-input": { + "magnitude": 1.9e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (l) transport ship", + "detailed_technology": "H2 (l) transport ship", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 391000000.0, + "units": "EUR_2019", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capacity": { + "magnitude": 11000.0, + "units": "metric_ton", + "carrier": "hydrogen", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 evaporation", + "detailed_technology": "H2 evaporation", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 165.0, + "units": "EUR_2022 / kilowatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Pessimistic assumption for large scale facility / near-term estimate for medium sized facility, in between low / mid estimate with e.g. DNV numbers (Fig. 3.15).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on lifetime of liquefaction plant.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 liquefaction", + "detailed_technology": "H2 liquefaction", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1000.0, + "units": "EUR_2022 / kilowatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 200t/d facility (Pessimistic long-term or optimistic short-term value).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification", + "detailed_technology": "H2 production coal gasification", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "coal-input": { + "magnitude": 1.62, + "units": "dimensionless", + "carrier": "coal / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.02, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 350.9, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.445, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification CC", + "detailed_technology": "H2 production coal gasification CC", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "coal-input": { + "magnitude": 1.62, + "units": "dimensionless", + "carrier": "coal / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.023, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 363.5, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.13, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production natural gas steam reforming", + "detailed_technology": "H2 production natural gas steam reforming", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "gas-input": { + "magnitude": 1.25, + "units": "dimensionless", + "carrier": "natural_gas / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 158.3, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.18, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production natural gas steam reforming CC", + "detailed_technology": "H2 production natural gas steam reforming CC", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "gas-input": { + "magnitude": 1.4, + "units": "dimensionless", + "carrier": "natural_gas / hydrogen", + "heating_value": "lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.039, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 6.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 191.3, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 0.07, + "units": "EUR_2010 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "HVAC overhead", + "detailed_technology": "HVAC overhead", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 400.0, + "units": "EUR_2011 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "HVDC inverter pair", + "detailed_technology": "HVDC inverter pair", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 150000.0, + "units": "EUR_2011 / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "HVDC overhead", + "detailed_technology": "HVDC overhead", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 400.0, + "units": "EUR_2011 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "HVDC submarine", + "detailed_technology": "HVDC submarine", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 970.0, + "units": "EUR_2017 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Table 1", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 0.35, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "HVDC underground", + "detailed_technology": "HVDC underground", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 970.0, + "units": "EUR_2017 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Table 1 (same as for HVDC submarine)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 0.35, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables. (same as for HVDC submarine)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 40.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables. (same as for HVDC submarine)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame)", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame)", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 57.3, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 52.7, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS", + "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 97.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 52.5, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG Combined Cycle F-Class integrated retrofit 90%-CCS", + "detailed_technology": "NG Combined Cycle F-Class integrated retrofit 90%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 53.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NG Combined Cycle F-Class integrated retrofit 95%-CCS", + "detailed_technology": "NG Combined Cycle F-Class integrated retrofit 95%-CCS", + "case": "not_available", + "region": "USA", + "year": 2030, + "parameters": { + "capture_rate": { + "magnitude": 95.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 53.6, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data for the US", + "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/US/manual_input_usa.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "NH3 (l) transport ship", + "detailed_technology": "NH3 (l) transport ship", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "capacity": { + "magnitude": 53000.0, + "units": "metric_ton", + "carrier": "ammonia", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 80600000.0, + "units": "EUR_2019", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 7.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Likely stack lifetime, rather than electrolyzer system lifetime", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.33, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 1 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 950.0, + "units": "EUR_2015 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Reference capacity 1 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "electricity-input": { + "magnitude": 1.19, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 2521.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "US-based assumptions for a Conservative cost scenario", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "allam", + "detailed_technology": "allam", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1500.0, + "units": "EUR_2020 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 2.0, + "units": "EUR_2020 / megawatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "efficiency": { + "magnitude": 60.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ammonia carbon capture retrofit", + "detailed_technology": "ammonia carbon capture retrofit", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 99.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "CO2 volume captured / (Stream flowrate * Max. capacity utilization * CO2 in exhaust * 8760)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.1, + "units": "megawatt_hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 923290.0, + "units": "USD_2019 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Capital cost 41 million USD, CO2 Volume captured 389000 t/year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biodiesel crops", + "detailed_technology": "biodiesel crops", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "fuel": { + "magnitude": 121.021, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "bioethanol crops", + "detailed_technology": "bioethanol crops", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "fuel": { + "magnitude": 72.478, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biogas manure", + "detailed_technology": "biogas manure", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "fuel": { + "magnitude": 17.467, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "cement carbon capture retrofit", + "detailed_technology": "cement carbon capture retrofit", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 7.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "CO2 volume captured / (Stream flowrate * Max. capacity utilization * CO2 in exhaust * 8760)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.16, + "units": "megawatt_hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "gas-input": { + "magnitude": 0.76, + "units": "megawatt_hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 2569739.0, + "units": "USD_2019 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Capital cost 247 million USD, CO2 Volume captured 842000 t/year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower", + "detailed_technology": "csp-tower", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 108.37, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower TES", + "detailed_technology": "csp-tower TES", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 14.52, + "units": "EUR_2020 / kilowatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower power block", + "detailed_technology": "csp-tower power block", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 759.17, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.1, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electrolysis", + "detailed_technology": "electrolysis", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1500.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol carbon capture retrofit", + "detailed_technology": "ethanol carbon capture retrofit", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 7.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 94.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.12, + "units": "megawatt_hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 922105.0, + "units": "USD_2019 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Capital cost 36 million USD, CO2 Volume captured 342000 t/year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from starch crop", + "detailed_technology": "ethanol from starch crop", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 570180.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 16.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "ethanol from sugar crops", + "detailed_technology": "ethanol from sugar crops", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 421970.0, + "units": "EUR_2015 / megawatt", + "carrier": "1 / ethanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Suited for USA and European production, original value INVCOST in MEUR/GW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 19.51, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "fuelwood", + "detailed_technology": "fuelwood", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "fuel": { + "magnitude": 12.768, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen storage compressor", + "detailed_technology": "hydrogen storage compressor", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 87.69, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "2923 EUR/kg_H2. For a 206 kg/h compressor. Base CAPEX 40 528 EUR/kW_el with scale factor 0.4603. kg_H2 converted to MWh using LHV. Pressure range: 30 bar in, 250 bar out.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "compression-electricity-input": { + "magnitude": 0.05, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "1.707 kWh/kg.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "hydrogen storage tank type 1", + "detailed_technology": "hydrogen storage tank type 1", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 13.5, + "units": "EUR_2020 / kilowatt_hour", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "450 EUR/kg_H2 converted with LHV to MWh. For a type 1 hydrogen storage tank (steel, 15-250 bar). Currency year assumed 2020 for initial publication of reference; observe note in SI.4.3 that no currency year is explicitly stated in the reference.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "min_fill_level": { + "magnitude": 6.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery", + "detailed_technology": "iron-air battery", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 20.0, + "units": "EUR_2023 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 17.5, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery charge", + "detailed_technology": "iron-air battery charge", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "efficiency": { + "magnitude": 71.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery discharge", + "detailed_technology": "iron-air battery discharge", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "efficiency": { + "magnitude": 60.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanation", + "detailed_technology": "methanation", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 654.0, + "units": "EUR_2017 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on lifetime for methanolisation, Fischer-Tropsch plants.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanol-to-kerosene", + "detailed_technology": "methanol-to-kerosene", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 269000.0, + "units": "EUR_2020 / megawatt", + "carrier": "1 / kerosene", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 1.35, + "units": "EUR_2020 / megawatt_hour", + "carrier": "1 / kerosene", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanolisation", + "detailed_technology": "methanolisation", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 677000.0, + "units": "EUR_2017 / megawatt", + "carrier": "1 / methanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Well developed technology, no significant learning expected.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float", + "detailed_technology": "offwind-float", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2350.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.15, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float-connection-submarine", + "detailed_technology": "offwind-float-connection-submarine", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 2000.0, + "units": "EUR_2014 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float-connection-underground", + "detailed_technology": "offwind-float-connection-underground", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 1000.0, + "units": "EUR_2017 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": " average + 13% learning reduction", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float-station", + "detailed_technology": "offwind-float-station", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "investment": { + "magnitude": 400.0, + "units": "EUR_2017 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": " assuming one onshore and one offshore node + 13% learning reduction", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "steel carbon capture retrofit", + "detailed_technology": "steel carbon capture retrofit", + "case": "not_available", + "region": "other", + "year": 2030, + "parameters": { + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capture_rate": { + "magnitude": 90.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "CO2 volume captured / (Stream flowrate * Max. capacity utilization * CO2 in exhaust * 8760)", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.16, + "units": "megawatt_hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "gas-input": { + "magnitude": 0.76, + "units": "megawatt_hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 3536679.0, + "units": "USD_2019 * hour / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Capital cost 1342 million USD, CO2 Volume captured 3324000 t/year", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "FT fuel transport ship", + "detailed_technology": "FT fuel transport ship", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "investment": { + "magnitude": 35000000.0, + "units": "EUR_2020", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capacity": { + "magnitude": 75000.0, + "units": "metric_ton", + "carrier": "fischer_tropsch", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC chemical", + "detailed_technology": "LOHC chemical", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "investment": { + "magnitude": 2500.0, + "units": "EUR_2020 / metric_ton", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC dehydrogenation (small scale)", + "detailed_technology": "LOHC dehydrogenation (small scale)", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "investment": { + "magnitude": 839000.0, + "units": "EUR_2020 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "MW of H2 LHV. For a small plant of 0.9 MW capacity.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "LOHC transport ship", + "detailed_technology": "LOHC transport ship", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "capacity": { + "magnitude": 75000.0, + "units": "metric_ton", + "carrier": "dehydrogenated_dibenzyltoluene", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 35000000.0, + "units": "EUR_2020", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "MeOH transport ship", + "detailed_technology": "MeOH transport ship", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "investment": { + "magnitude": 35000000.0, + "units": "EUR_2020", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capacity": { + "magnitude": 75000.0, + "units": "metric_ton", + "carrier": "methanol", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 15.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 5.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery", + "detailed_technology": "iron-air battery", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "FOM": { + "magnitude": 1.106, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 15.11, + "units": "EUR_2023 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery charge", + "detailed_technology": "iron-air battery charge", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "efficiency": { + "magnitude": 73.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery discharge", + "detailed_technology": "iron-air battery discharge", + "case": "not_available", + "region": "other", + "year": 2035, + "parameters": { + "efficiency": { + "magnitude": 62.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (g) fill compressor station", + "detailed_technology": "CH4 (g) fill compressor station", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1654.96, + "units": "EUR_2020 / megawatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assume same ratio as between H2 (g) pipeline and fill compressor station, i.e. 1:19 , due to a lack of reliable numbers.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.7, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (l) transport ship", + "detailed_technology": "CH4 (l) transport ship", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 151000000.0, + "units": "EUR_2015", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "capacity": { + "magnitude": 58300.0, + "units": "metric_ton", + "carrier": "methane", + "heating_value": null, + "provenance": null, + "note": "based on 138 000 m^3 capacity and LNG density of 0.4226 t/m^3 .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 evaporation", + "detailed_technology": "CH4 evaporation", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 71.86, + "units": "EUR_2005 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "based on 100 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 liquefaction", + "detailed_technology": "CH4 liquefaction", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 190.43, + "units": "EUR_2005 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "based on 265 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "hydrogen-input": { + "magnitude": 1.363, + "units": "dimensionless", + "carrier": "hydrogen / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.007, + "units": "dimensionless", + "carrier": "electricity / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.301, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "electricity-input": { + "magnitude": 1.15, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 2398.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "US-based assumptions for a Conservative cost scenario", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biodiesel crops", + "detailed_technology": "biodiesel crops", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "fuel": { + "magnitude": 120.926, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "bioethanol crops", + "detailed_technology": "bioethanol crops", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "fuel": { + "magnitude": 75.718, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biogas manure", + "detailed_technology": "biogas manure", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "fuel": { + "magnitude": 17.477, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower", + "detailed_technology": "csp-tower", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 99.97, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower TES", + "detailed_technology": "csp-tower TES", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 13.39, + "units": "EUR_2020 / kilowatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower power block", + "detailed_technology": "csp-tower power block", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 700.34, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electrolysis", + "detailed_technology": "electrolysis", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1200.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "fuelwood", + "detailed_technology": "fuelwood", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "fuel": { + "magnitude": 11.599, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery", + "detailed_technology": "iron-air battery", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "FOM": { + "magnitude": 1.181, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 13.33, + "units": "EUR_2023 / kilowatt_hour", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery charge", + "detailed_technology": "iron-air battery charge", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "efficiency": { + "magnitude": 74.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "iron-air battery discharge", + "detailed_technology": "iron-air battery discharge", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "efficiency": { + "magnitude": 63.0, + "units": "percent", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float", + "detailed_technology": "offwind-float", + "case": "not_available", + "region": "other", + "year": 2040, + "parameters": { + "investment": { + "magnitude": 1960.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.22, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Ammonia cracker", + "detailed_technology": "Ammonia cracker", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 527592.22, + "units": "EUR_2015 / megawatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Calculated. For a large (2500 t_NH3/d input) facility. Base cost for facility: 51 MEUR at capacity 20 000m^3_NH3/h = 339 t_NH3/d input. Cost scaling exponent 0.67. Ammonia density 0.7069 kg/m^3. Conversion efficiency of cracker: 0.685. Ammonia LHV: 5.167 MWh/t_NH3.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.3, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Estimated based on Labour cost rate, Maintenance cost rate, Insurance rate, Admin. cost rate and Chemical & other consumables cost rate.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CH4 (g) pipeline", + "detailed_technology": "CH4 (g) pipeline", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 87.22, + "units": "EUR_2020 / kilometer / megawatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on Arab Gas Pipeline: https://en.wikipedia.org/wiki/Arab_Gas_Pipeline: cost = 1.2e9 $-US (year = ?), capacity=10.3e9 m^3/a NG, l=1200km, NG-LHV=39MJ/m^3*90% (also Wikipedia estimate from here https://en.wikipedia.org/wiki/Heat_of_combustion). Presumed to include booster station cost.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 50.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Due to lack of numbers, use comparable H2 pipeline assumptions.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Due to lack of numbers, use comparable H2 pipeline assumptions.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "CO2 storage tank", + "detailed_technology": "CO2 storage tank", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 2430.0, + "units": "EUR_2013 / metric_ton", + "carrier": "1 / carbon_dioxide", + "heating_value": null, + "provenance": null, + "note": "Assuming a 3000m^3 pressurised steel cylinder tanks and a CO2 density of 1100 kg/m^3 (close to triple point at -56.6Β°C and 5.2 bar with max density of 1200kg/m^3 ). Lauri et al. report costs 3x higher per m^3 for steel tanks, which are consistent with other sources. The numbers reported are in rather difficult to pinpoint as systems can greatly vary.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assuming a 3000m^3 pressurised steel cylinder tanks and a CO2 density of 1100 kg/m^3 (close to triple point at -56.6Β°C and 5.2 bar with max density of 1200kg/m^3 ). Lauri et al. report costs 3x higher per m^3 for steel tanks, which are consistent with other sources. The numbers reported are in rather difficult to pinpoint as systems can greatly vary.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 25.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assuming a 3000m^3 pressurised steel cylinder tanks and a CO2 density of 1100 kg/m^3 (close to triple point at -56.6Β°C and 5.2 bar with max density of 1200kg/m^3 ). Lauri et al. report costs 3x higher per m^3 for steel tanks, which are consistent with other sources. The numbers reported are in rather difficult to pinpoint as systems can greatly vary.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "Fischer-Tropsch", + "detailed_technology": "Fischer-Tropsch", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 500000.0, + "units": "EUR_2017 / megawatt", + "carrier": "1 / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Well developed technology, no significant learning expected.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "hydrogen-input": { + "magnitude": 1.327, + "units": "dimensionless", + "carrier": "hydrogen / fischer_tropsch", + "heating_value": "lower_heating_value", + "provenance": null, + "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 0.007, + "units": "dimensionless", + "carrier": "electricity / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "carbondioxide-input": { + "magnitude": 0.276, + "units": "metric_ton / megawatt_hour", + "carrier": "carbon_dioxide / fischer_tropsch", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) pipeline", + "detailed_technology": "H2 (g) pipeline", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "FOM": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Assumption for a 140 bar, > 6000 MW_HHV single line pipeline, incl. booster station investments. Considering LHV by scaling with LHV/HHV=0.8462623413.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.7e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) pipeline repurposed", + "detailed_technology": "H2 (g) pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "FOM": { + "magnitude": 1.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Same as for new H2 (g) pipeline.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.7e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline", + "detailed_technology": "H2 (g) submarine pipeline", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "electricity-input": { + "magnitude": 1.7e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 (g) submarine pipeline repurposed", + "detailed_technology": "H2 (g) submarine pipeline repurposed", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "electricity-input": { + "magnitude": 1.7e-8, + "units": "1 / meter", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a 140 bar, 5-20 GW pipeline. Electric compression.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 evaporation", + "detailed_technology": "H2 evaporation", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 65.0, + "units": "EUR_2022 / kilowatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Optimistic assumption for large scale facility 2500 t/d, cf Fig. 3.15 .", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on lifetime of liquefaction plant.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 liquefaction", + "detailed_technology": "H2 liquefaction", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 600.0, + "units": "EUR_2022 / kilowatt", + "carrier": "1 / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Assumption for a large >300t/d, e.g. 2500 t/d facility (Optimistic long-term value without change in base technology mentioned in report).", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 2.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification", + "detailed_technology": "H2 production coal gasification", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "FOM": { + "magnitude": 6.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "H2 production coal gasification CC", + "detailed_technology": "H2 production coal gasification CC", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "FOM": { + "magnitude": 6.2, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "PEM electrolyzer small size", + "detailed_technology": "PEM electrolyzer small size", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "lifetime": { + "magnitude": 9.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Likely stack lifetime, rather than electrolyzer system lifetime", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "electricity-input": { + "magnitude": 1.25, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Reference capacity 1 MW", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "SOEC", + "detailed_technology": "SOEC", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "electricity-input": { + "magnitude": 1.11, + "units": "dimensionless", + "carrier": "electricity / hydrogen", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 2281.0, + "units": "USD_2022 / kilowatt", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "US-based assumptions for a Conservative cost scenario", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biodiesel crops", + "detailed_technology": "biodiesel crops", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "fuel": { + "magnitude": 115.905, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "bioethanol crops", + "detailed_technology": "bioethanol crops", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "fuel": { + "magnitude": 78.996, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "biogas manure", + "detailed_technology": "biogas manure", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "fuel": { + "magnitude": 17.54, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower", + "detailed_technology": "csp-tower", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 99.38, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower TES", + "detailed_technology": "csp-tower TES", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 13.32, + "units": "EUR_2020 / kilowatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "csp-tower power block", + "detailed_technology": "csp-tower power block", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 696.2, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": "Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.4, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "-", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "electrolysis", + "detailed_technology": "electrolysis", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1000.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "fuelwood", + "detailed_technology": "fuelwood", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "fuel": { + "magnitude": 10.547, + "units": "EUR_2010 / megawatt_hour", + "carrier": "1 / thermal", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanation", + "detailed_technology": "methanation", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 500.0, + "units": "EUR_2017 / kilowatt", + "carrier": "1 / methane", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": "Based on lifetime for methanolisation, Fischer-Tropsch plants.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanol-to-kerosene", + "detailed_technology": "methanol-to-kerosene", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "lifetime": { + "magnitude": 30.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "investment": { + "magnitude": 200000.0, + "units": "EUR_2020 / megawatt", + "carrier": "1 / kerosene", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 4.5, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "VOM": { + "magnitude": 1.35, + "units": "EUR_2020 / megawatt_hour", + "carrier": "1 / kerosene", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "methanolisation", + "detailed_technology": "methanolisation", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 500000.0, + "units": "EUR_2017 / megawatt", + "carrier": "1 / methanol", + "heating_value": "1 / lower_heating_value", + "provenance": null, + "note": "Well developed technology, no significant learning expected.", + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "lifetime": { + "magnitude": 20.0, + "units": "year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 3.0, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + }, + { + "name": "offwind-float", + "detailed_technology": "offwind-float", + "case": "not_available", + "region": "other", + "year": 2050, + "parameters": { + "investment": { + "magnitude": 1580.0, + "units": "EUR_2020 / kilowatt", + "carrier": "1 / electricity", + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + }, + "FOM": { + "magnitude": 1.39, + "units": "percent / year", + "carrier": null, + "heating_value": null, + "provenance": null, + "note": null, + "sources": { + "sources": [ + { + "title": "Energy system technology data", + "authors": "Contributors to technology-data. Data source: manual_input.csv", + "version": "v0.13.4", + "url": "https://github.com/PyPSA/technology-data/blob/master/inputs/manual_input.csv", + "url_archive": null, + "url_date": null, + "url_date_archive": null + } + ] + } + } + } + } + ] +} diff --git a/src/technologydata/parsers/manual_input_usa/parser_v0134.py b/src/technologydata/parsers/manual_input_usa/parser_v0134.py deleted file mode 100644 index 03da710e..00000000 --- a/src/technologydata/parsers/manual_input_usa/parser_v0134.py +++ /dev/null @@ -1,272 +0,0 @@ -# SPDX-FileCopyrightText: technologydata contributors -# -# SPDX-License-Identifier: MIT - -"""Parser for version 0.13.4 of the manual_input_usa.csv dataset.""" - -import logging -import pathlib -from typing import Any - -import pandas - -from technologydata.parameter import Parameter -from technologydata.parsers.data_parser_base import ParserBase -from technologydata.source import Source -from technologydata.source_collection import SourceCollection -from technologydata.technology import Technology -from technologydata.technology_collection import TechnologyCollection -from technologydata.utils.commons import Commons - -path_cwd = pathlib.Path.cwd() - -logger = logging.getLogger(__name__) - - -class ManualInputUSAV0134Parser(ParserBase): - """Parser for v0.13.4 of the manual_input_usa.csv dataset.""" - - @staticmethod - def _extract_units_carriers_heating_value( - input_unit: str, - ) -> tuple[str, str | None, str | None]: - """ - Extract standardized units and carriers from an input unit string. Add also heating_value. - - This function maps complex unit representations to simplified unit and carrier - combinations using a predefined dictionary of special patterns. - - Parameters - ---------- - input_unit : str - A specialized unit string to be converted. - - Returns - ------- - tuple[str, str | None, str | None] - A tuple containing two elements: - - The first element is the standardized unit - - The second element is the corresponding carrier (or None if not found) - - The third element is the corresponding heating value (or None if not found) - - """ - # Define conversion dictionary - special_patterns = { - "USD_2022/MW_FT": ("USD_2022/MW", "1/FT", "1/LHV"), - "MWh_H2/MWh_FT": ("MWh/MWh", "H2/FT", "LHV"), - "MWh_el/MWh_FT": ("MWh/MWh", "el/FT", "LHV"), - "t_CO2/MWh_FT": ("t/MWh", "CO2/FT", "LHV"), - "USD_2022/kWh_H2": ("USD_2022/kWh", "1/H2", "LHV"), - "MWh_el/MWh_H2": ("MWh/MWh", "el/H2", "LHV"), - "USD_2023/t_CO2/h": ("USD_2023/t/h", "1/CO2", None), - "MWh_el/t_CO2": ("MWh/t", "el/CO2", "LHV"), - "MWh_th/t_CO2": ("MWh/t", "thermal/CO2", "LHV"), - } - - if isinstance(input_unit, str) and input_unit in special_patterns.keys(): - return special_patterns[input_unit] - else: - return input_unit, None, None - - @staticmethod - def _build_technology_collection( - dataframe: pandas.DataFrame, - sources_path: pathlib.Path, - archive_source: bool = False, - output_schema: bool = False, - ) -> TechnologyCollection: - """ - Compute a collection of technologies from a grouped DataFrame. - - Processes input DataFrame by grouping technologies and extracting their parameters, - creating Technology instances for each unique group. - - Parameters - ---------- - dataframe : pandas.DataFrame - Input DataFrame containing technology parameters. - Expected columns include: - - 'scenario': Estimation or case identifier - - 'year': Year of the technology - - 'technology': Detailed technology name - - 'parameter': Parameter name - - 'value': Parameter value - - 'unit': Parameter units - - 'further_description': Extra information about the technology - - 'financial_case': Technology financial case - sources_path: pathlib.Path - Output path for storing the SourceCollection object - archive_source: Optional[bool] - Flag to decide whether to archive the source object on the Wayback Machine. Default False. - output_schema : Optional[bool] - Flag to decide whether to export the source collection schema. Default False. - - Returns - ------- - TechnologyCollection - A collection of Technology instances, each representing a unique - technology group with its associated parameters. - - Notes - ----- - - The function groups the DataFrame by ["scenario", "year", "technology"] - - For each group, it creates a dictionary of Parameters - - Each Technology is instantiated with group-specific attributes - - """ - list_techs = [] - - if archive_source: - source = Source( - title="Energy system technology data for the US", - authors="Contributors to technology-data. Data source: manual_input_usa.csv", - version="v0.13.4", - url="https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - ) - source.ensure_in_wayback() - sources = SourceCollection(sources=[source]) - sources.to_json(sources_path, output_schema=output_schema) - else: - sources = SourceCollection.from_json(sources_path) - - for (scenario, year, technology), group in dataframe.groupby( - ["scenario", "year", "technology"] - ): - parameters = {} - financial_case_for_tech = None - for _, row in group.iterrows(): - unit, carrier, heating_value = ( - ManualInputUSAV0134Parser._extract_units_carriers_heating_value( - row["unit"] - ) - ) - param_kwargs = { - "magnitude": row["value"], - "sources": sources, - } - if carrier is not None: - param_kwargs["carrier"] = carrier - if heating_value is not None: - param_kwargs["heating_value"] = heating_value - if unit is not None: - param_kwargs["units"] = unit - if row["further_description"] is not None and isinstance( - row["further_description"], str - ): - param_kwargs["note"] = row["further_description"] - if row["financial_case"] is not None and isinstance( - row["financial_case"], str - ): - financial_case_for_tech = str(row["financial_case"]) - parameters[row["parameter"]] = Parameter(**param_kwargs) - - # Combine scenario and financial_case for the case attribute - case_value = str(scenario) - if financial_case_for_tech is not None: - case_value = f"{scenario} - {financial_case_for_tech}" - - list_techs.append( - Technology( - name=technology, - region="USA", - year=year, - parameters=parameters, - case=case_value, - detailed_technology=technology, - ) - ) - - return TechnologyCollection(technologies=list_techs) - - def parse( - self, - input_path: pathlib.Path, - num_digits: int, - archive_source: bool, - **kwargs: Any, - ) -> None: - """ - Parse and process version 0.13.4 of the manual_input_usa.csv dataset. - - This method reads the raw data from an Excel file, cleans and transforms - it through a series of steps, and then builds a TechnologyCollection. - The processed data is saved to JSON files. - - Parameters - ---------- - input_path : pathlib.Path - Path to the raw input data file (Excel). - num_digits : int - Number of significant digits to round numerical values. - archive_source : bool - If True, archives the source object on the Wayback Machine. - **kwargs : bool - export_schema : bool - If True, exports the Pydantic schema for the data models. - - Returns - ------- - TechnologyCollection - A collection of parsed technology data. - - """ - export_schema = kwargs.get("export_schema", False) - - manual_input_usa_input_path = pathlib.Path(input_path) - - manual_input_usa_df = pandas.read_csv( - manual_input_usa_input_path, dtype=str, na_values="None" - ) - manual_input_usa_df["value"] = manual_input_usa_df["value"].astype(float) - manual_input_usa_df["scenario"] = manual_input_usa_df["scenario"].fillna( - "not_available" - ) - - # Replace "per unit" with "%" and multiply val by 100 - mask_per_unit = manual_input_usa_df["unit"].str.contains("per unit") - manual_input_usa_df.loc[mask_per_unit, "unit"] = manual_input_usa_df.loc[ - mask_per_unit, "unit" - ].str.replace("per unit", "%") - manual_input_usa_df.loc[mask_per_unit, "value"] = ( - manual_input_usa_df.loc[mask_per_unit, "value"] * 100.0 - ).round(num_digits) - logger.info( - "`per unit` replaced by `%`. Corresponding value multiplied by 100." - ) - - # Include currency_year in unit if applicable - manual_input_usa_df["unit"] = manual_input_usa_df.apply( - lambda row: Commons.update_unit_with_currency_year( - row["unit"], row["currency_year"] - ), - axis=1, - ) - logger.info("`currency_year` included in `unit` column.") - - # Build TechnologyCollection - manual_input_usa_base_path = pathlib.Path( - path_cwd, - "src", - "technologydata", - "parsers", - "manual_input_usa", - ) - output_technologies_path = pathlib.Path( - manual_input_usa_base_path, - "v0.13.4/technologies.json", - ) - output_sources_path = pathlib.Path( - manual_input_usa_base_path, - "v0.13.4/sources.json", - ) - - tech_col = ManualInputUSAV0134Parser._build_technology_collection( - manual_input_usa_df, - output_sources_path, - archive_source=archive_source, - output_schema=export_schema, - ) - - logger.info("TechnologyCollection object instantiated.") - tech_col.to_json(output_technologies_path, output_schema=export_schema) - logger.info("TechnologyCollection object exported to json.") diff --git a/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json b/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json deleted file mode 100644 index 9abc1c0f..00000000 --- a/src/technologydata/parsers/manual_input_usa/v0.13.4/sources.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "schema_version": 1, - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] -} diff --git a/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json b/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json deleted file mode 100644 index 63486e97..00000000 --- a/src/technologydata/parsers/manual_input_usa/v0.13.4/technologies.json +++ /dev/null @@ -1,4319 +0,0 @@ -{ - "schema_version": 1, - "technologies": [ - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Advanced - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 1671.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Advanced - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2599.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Advanced - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2851.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "direct air capture", - "detailed_technology": "direct air capture", - "case": "Advanced - Market", - "region": "USA", - "year": 2020, - "parameters": { - "FOM": { - "magnitude": 1.3, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "investment": { - "magnitude": 7103597.31, - "units": "USD_2023 / hour / metric_ton", - "carrier": "1 / carbon_dioxide", - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Advanced - Market", - "region": "USA", - "year": 2022, - "parameters": { - "investment": { - "magnitude": 480.1, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Advanced - Market", - "region": "USA", - "year": 2022, - "parameters": { - "investment": { - "magnitude": 405.4, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Advanced - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 1342.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Advanced - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 2062.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Advanced - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 2258.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Advanced - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 294.7, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Advanced - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 205.8, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Advanced - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1086.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Advanced - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1646.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Advanced - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1797.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Advanced - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 262.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Advanced - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 169.5, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Advanced - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 888.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Advanced - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1322.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Advanced - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1440.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Advanced - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 226.6, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Advanced - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 134.0, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Conservative - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 1671.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Conservative - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2599.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Conservative - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2851.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "direct air capture", - "detailed_technology": "direct air capture", - "case": "Conservative - Market", - "region": "USA", - "year": 2020, - "parameters": { - "FOM": { - "magnitude": 1.3, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "investment": { - "magnitude": 19180739.93, - "units": "USD_2023 / hour / metric_ton", - "carrier": "1 / carbon_dioxide", - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Conservative - Market", - "region": "USA", - "year": 2022, - "parameters": { - "investment": { - "magnitude": 480.1, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Conservative - Market", - "region": "USA", - "year": 2022, - "parameters": { - "investment": { - "magnitude": 405.4, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Conservative - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 1599.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Conservative - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 2160.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Conservative - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 2721.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Conservative - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 454.2, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Conservative - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 330.4, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Conservative - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1531.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Conservative - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1802.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Conservative - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 2598.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Conservative - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 430.3, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Conservative - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 307.8, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Conservative - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1466.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Conservative - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1509.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Conservative - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 2481.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Conservative - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 406.2, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Conservative - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 285.2, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Moderate - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 1671.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Moderate - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2599.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Moderate - Market", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2851.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "direct air capture", - "detailed_technology": "direct air capture", - "case": "Moderate - Market", - "region": "USA", - "year": 2020, - "parameters": { - "FOM": { - "magnitude": 1.3, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "investment": { - "magnitude": 12398844.91, - "units": "USD_2023 / hour / metric_ton", - "carrier": "1 / carbon_dioxide", - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Moderate - Market", - "region": "USA", - "year": 2022, - "parameters": { - "investment": { - "magnitude": 480.1, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Moderate - Market", - "region": "USA", - "year": 2022, - "parameters": { - "investment": { - "magnitude": 405.4, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Moderate - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 1402.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Moderate - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 2160.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Moderate - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 2366.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Moderate - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 432.8, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Moderate - Market", - "region": "USA", - "year": 2030, - "parameters": { - "investment": { - "magnitude": 254.8, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Moderate - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1182.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Moderate - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1802.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Moderate - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 1970.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Moderate - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 409.6, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Moderate - Market", - "region": "USA", - "year": 2040, - "parameters": { - "investment": { - "magnitude": 208.6, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "Moderate - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1002.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "Moderate - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1509.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "Moderate - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 1646.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "Moderate - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 384.0, - "units": "USD_2022 / kilowatt", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "Moderate - Market", - "region": "USA", - "year": 2050, - "parameters": { - "investment": { - "magnitude": 163.0, - "units": "USD_2022 / kilowatt_hour", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Includes grid connection and project financing costs; Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 2.5, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": "Meaning of scenario and financial case: https://atb.nrel.gov/electricity/2024/definitions#scenarios", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Alkaline electrolyzer large size", - "detailed_technology": "Alkaline electrolyzer large size", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Coal-IGCC", - "detailed_technology": "Coal-IGCC", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "lifetime": { - "magnitude": 40.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 50.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Fischer-Tropsch", - "detailed_technology": "Fischer-Tropsch", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "efficiency": { - "magnitude": 70.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "investment": { - "magnitude": 1696429.0, - "units": "USD_2022 / megawatt", - "carrier": "1 / fischer_tropsch", - "heating_value": "1 / lower_heating_value", - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "lifetime": { - "magnitude": 20.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "hydrogen-input": { - "magnitude": 1.43, - "units": "dimensionless", - "carrier": "hydrogen / fischer_tropsch", - "heating_value": "lower_heating_value", - "provenance": null, - "note": "0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "electricity-input": { - "magnitude": 0.04, - "units": "dimensionless", - "carrier": "electricity / fischer_tropsch", - "heating_value": "lower_heating_value", - "provenance": null, - "note": "0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output).", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "carbondioxide-input": { - "magnitude": 0.32, - "units": "metric_ton / megawatt_hour", - "carrier": "carbon_dioxide / fischer_tropsch", - "heating_value": "lower_heating_value", - "provenance": null, - "note": "Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT).", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "NG 2-on-1 Combined Cycle (F-Frame)", - "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame)", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "efficiency": { - "magnitude": 57.3, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "PEM electrolyzer small size", - "detailed_technology": "PEM electrolyzer small size", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "SOEC", - "detailed_technology": "SOEC", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "direct air capture", - "detailed_technology": "direct air capture", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "electricity-input": { - "magnitude": 0.24, - "units": "megawatt_hour / metric_ton", - "carrier": "electricity / carbon_dioxide", - "heating_value": "lower_heating_value", - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "heat-input": { - "magnitude": 1.17, - "units": "megawatt_hour / metric_ton", - "carrier": "thermal / carbon_dioxide", - "heating_value": "lower_heating_value", - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "hydrogen storage compressor", - "detailed_technology": "hydrogen storage compressor", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 2.28, - "units": "USD_2022 / kilowatt_hour", - "carrier": "1 / hydrogen", - "heating_value": "lower_heating_value", - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "compression-electricity-input": { - "magnitude": 0.05, - "units": "dimensionless", - "carrier": "electricity / hydrogen", - "heating_value": "lower_heating_value", - "provenance": null, - "note": "1.707 kWh/kg.", - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "hydrogen storage tank type 1", - "detailed_technology": "hydrogen storage tank type 1", - "case": "not_available", - "region": "USA", - "year": 2020, - "parameters": { - "investment": { - "magnitude": 16.87, - "units": "USD_2022 / kilowatt_hour", - "carrier": "1 / hydrogen", - "heating_value": "lower_heating_value", - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "FOM": { - "magnitude": 4.0, - "units": "percent / year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "min_fill_level": { - "magnitude": 6.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery inverter", - "detailed_technology": "battery inverter", - "case": "not_available", - "region": "USA", - "year": 2022, - "parameters": { - "lifetime": { - "magnitude": 15.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "battery storage", - "detailed_technology": "battery storage", - "case": "not_available", - "region": "USA", - "year": 2022, - "parameters": { - "lifetime": { - "magnitude": 15.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Coal integrated retrofit 90%-CCS", - "detailed_technology": "Coal integrated retrofit 90%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "capture_rate": { - "magnitude": 90.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 38.6, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Coal integrated retrofit 95%-CCS", - "detailed_technology": "Coal integrated retrofit 95%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "capture_rate": { - "magnitude": 95.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 38.6, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Coal-95%-CCS", - "detailed_technology": "Coal-95%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 40.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "capture_rate": { - "magnitude": 95.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 40.3, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Coal-99%-CCS", - "detailed_technology": "Coal-99%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 40.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "capture_rate": { - "magnitude": 99.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 40.3, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Coal-IGCC-90%-CCS", - "detailed_technology": "Coal-IGCC-90%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 40.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "capture_rate": { - "magnitude": 90.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 40.3, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "Fischer-Tropsch", - "detailed_technology": "Fischer-Tropsch", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "NG 2-on-1 Combined Cycle (F-Frame)", - "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame)", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 57.3, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", - "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame) 95% CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "capture_rate": { - "magnitude": 95.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 52.7, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS", - "detailed_technology": "NG 2-on-1 Combined Cycle (F-Frame) 97% CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "lifetime": { - "magnitude": 30.0, - "units": "year", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "capture_rate": { - "magnitude": 97.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 52.5, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "NG Combined Cycle F-Class integrated retrofit 90%-CCS", - "detailed_technology": "NG Combined Cycle F-Class integrated retrofit 90%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "capture_rate": { - "magnitude": 90.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 53.6, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - }, - { - "name": "NG Combined Cycle F-Class integrated retrofit 95%-CCS", - "detailed_technology": "NG Combined Cycle F-Class integrated retrofit 95%-CCS", - "case": "not_available", - "region": "USA", - "year": 2030, - "parameters": { - "capture_rate": { - "magnitude": 95.0, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - }, - "efficiency": { - "magnitude": 53.6, - "units": "percent", - "carrier": null, - "heating_value": null, - "provenance": null, - "note": null, - "sources": { - "sources": [ - { - "title": "Energy system technology data for the US", - "authors": "Contributors to technology-data. Data source: manual_input_usa.csv", - "version": "v0.13.4", - "url": "https://github.com/PyPSA/technology-data/blob/v0.13.4/inputs/US/manual_input_usa.csv", - "url_archive": null, - "url_date": "2025-10-20", - "url_date_archive": null - } - ] - } - } - } - } - ] -} diff --git a/src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx b/src/technologydata/parsers/raw/dea_energy_storage/Technology_datasheet_for_energy_storage.xlsx similarity index 100% rename from src/technologydata/parsers/raw/Technology_datasheet_for_energy_storage.xlsx rename to src/technologydata/parsers/raw/dea_energy_storage/Technology_datasheet_for_energy_storage.xlsx diff --git a/src/technologydata/parsers/raw/legacy_input_data/other.csv b/src/technologydata/parsers/raw/legacy_input_data/other.csv new file mode 100644 index 00000000..d5afd75d --- /dev/null +++ b/src/technologydata/parsers/raw/legacy_input_data/other.csv @@ -0,0 +1,622 @@ +technology,parameter,year,value,unit,currency_year,source,further_description +methanation,investment,2020,748,EUR/kW_CH4,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 6: β€œReference scenario”.", +methanation,lifetime,2020,20,years,2017,Guesstimate.,"Based on lifetime for methanolisation, Fischer-Tropsch plants." +methanation,FOM,2020,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.2.3.1", +methanation,hydrogen-input,0,1.282,MWh_H2/MWh_CH4,,,Based on ideal conversion process of stochiometric composition (1 t CH4 contains 750 kg of carbon). +methanation,carbondioxide-input,0,0.198,t_CO2/MWh_CH4,,"GΓΆtz et al. (2016): Renewable Power-to-Gas: A technological and economic review (https://doi.org/10.1016/j.renene.2015.07.066), Fig. 11 .",Additional H2 required for methanation process (2x H2 amount compared to stochiometric conversion). +methanation,investment,2030,654,EUR/kW_CH4,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 6: β€œReference scenario”.", +methanation,lifetime,2030,20,years,2017,Guesstimate.,"Based on lifetime for methanolisation, Fischer-Tropsch plants." +methanation,FOM,2030,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.2.3.1", +methanation,investment,2050,500,EUR/kW_CH4,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 6: β€œReference scenario”.", +methanation,lifetime,2050,20,years,2017,Guesstimate.,"Based on lifetime for methanolisation, Fischer-Tropsch plants." +methanation,FOM,2050,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.2.3.1", +H2 (g) pipeline,investment,2020,363.08,EUR/MW/km,2023,European Hydrogen Backbone Report (June 2021): https://gasforclimate2050.eu/wp-content/uploads/2021/06/EHB_Analysing-the-future-demand-supply-and-transport-of-hydrogen_June-2021.pdf Table 35. Implementation roadmap - Cross border projects and costs updates: https://ehb.eu/files/downloads/EHB-2023-20-Nov-FINAL-design.pdf Table 1,"Assumption for a 48 inch single line pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 4.4 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)" +H2 (g) pipeline,lifetime,2020,50,years,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, > 6000 MW_HHV single line pipeline, incl. booster station investments. Considering LHV by scaling with LHV/HHV=0.8462623413." +H2 (g) pipeline,FOM,2020,4,%/year,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, > 6000 MW_HHV single line pipeline, incl. booster station investments. Considering LHV by scaling with LHV/HHV=0.8462623413." +H2 (g) pipeline,FOM,2050,1.5,%/year,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, > 6000 MW_HHV single line pipeline, incl. booster station investments. Considering LHV by scaling with LHV/HHV=0.8462623413." +H2 (g) pipeline,electricity-input,2020,0.021,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) pipeline,electricity-input,2030,0.019,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) pipeline,electricity-input,2050,0.017,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) pipeline repurposed,investment,2020,154.79,EUR/MW/km,2023,European Hydrogen Backbone Report (June 2021): https://gasforclimate2050.eu/wp-content/uploads/2021/06/EHB_Analysing-the-future-demand-supply-and-transport-of-hydrogen_June-2021.pdf Table 35. Implementation roadmap - Cross border projects and costs updates: https://ehb.eu/files/downloads/EHB-2023-20-Nov-FINAL-design.pdf Table 1,"Assumption for a 48 inch single line repurposed pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 0.8 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)" +H2 (g) pipeline repurposed,lifetime,2020,50,years,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.",Same as for new H2 (g) pipeline. +H2 (g) pipeline repurposed,FOM,2020,4,%/year,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.",Same as for new H2 (g) pipeline. +H2 (g) pipeline repurposed,FOM,2050,1.5,%/year,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.",Same as for new H2 (g) pipeline. +H2 (g) pipeline repurposed,electricity-input,2020,0.021,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) pipeline repurposed,electricity-input,2030,0.019,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) pipeline repurposed,electricity-input,2050,0.017,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) fill compressor station,investment,2020,4478,EUR/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), pg. 164, Figure 14 (Fill compressor).","Assumption for staging 35β†’140bar, 6000 MW_HHV single line pipeline. Considering HHV/LHV ration for H2." +CO2 pipeline,investment,2020,2000,EUR/(tCO2/h)/km,2015,"Danish Energy Agency, Technology Data for Energy Transport (March 2021), Excel datasheet: 121 co2 pipeline.",Assuming the 120-500 t CO2/h range that is based on cost of a 12 inch onshore pipeline. +CO2 pipeline,lifetime,2020,50,years,2015,"Danish Energy Agency, Technology Data for Energy Transport (March 2021), Excel datasheet: 121 co2 pipeline.", +CO2 pipeline,FOM,2020,0.9,%/year,2015,"Danish Energy Agency, Technology Data for Energy Transport (March 2021), Excel datasheet: 121 co2 pipeline.", +CO2 submarine pipeline,investment,2020,4000,EUR/(tCO2/h)/km,2015,"Danish Energy Agency, Technology Data for Energy Transport (March 2021), Excel datasheet: 121 co2 pipeline.",Assuming the 120-500 t CO2/h range that is based on cost of a 12 inch offshore pipeline. +CO2 submarine pipeline,FOM,2020,0.5,%/year,2015,"Danish Energy Agency, Technology Data for Energy Transport (March 2021), Excel datasheet: 121 co2 pipeline.", +H2 (g) fill compressor station,lifetime,2020,20,years,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), pg. 168, Figure 24 (Fill compressor).", +H2 (g) fill compressor station,FOM,2020,1.7,%/year,2020,"Guidehouse 2020: European Hydrogen Backbone report, https://guidehouse.com/-/media/www/site/downloads/energy/2020/gh_european-hydrogen-backbone_report.pdf (table 3, table 5)","Pessimistic (highest) value chosen for 48'' pipeline w/ 13GW_H2 LHV @ 100bar pressure. Currency year: Not clearly specified, assuming year of publication. Forecast year: Not clearly specified, guessing based on text remarks." +CH4 (g) pipeline,investment,2050,87.22,EUR/MW/km,2020,Guesstimate.,"Based on Arab Gas Pipeline: https://en.wikipedia.org/wiki/Arab_Gas_Pipeline: cost = 1.2e9 $-US (year = ?), capacity=10.3e9 m^3/a NG, l=1200km, NG-LHV=39MJ/m^3*90% (also Wikipedia estimate from here https://en.wikipedia.org/wiki/Heat_of_combustion). Presumed to include booster station cost." +CH4 (g) pipeline,lifetime,2050,50,years,2020,Assume same as for H2 (g) pipeline in 2050 (CH4 pipeline as mature technology).,"Due to lack of numbers, use comparable H2 pipeline assumptions." +CH4 (g) pipeline,FOM,2050,1.5,%/year,2020,Assume same as for H2 (g) pipeline in 2050 (CH4 pipeline as mature technology).,"Due to lack of numbers, use comparable H2 pipeline assumptions." +CH4 (g) pipeline,electricity-input,2020,0.01,MW_e/1000km/MW_CH4,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: 112 6 gas Main distri line.","Assumption for gas pipeline >100MW, 0.1% per station and spacing of 100km yields 1%/1000km. Electric compression." +CH4 (g) fill compressor station,investment,2040,1654.96,EUR/MW_CH4,2020,"Guesstimate, based on H2 (g) pipeline and fill compressor station cost.","Assume same ratio as between H2 (g) pipeline and fill compressor station, i.e. 1:19 , due to a lack of reliable numbers." +CH4 (g) fill compressor station,lifetime,2040,20,years,2020,Assume same as for H2 (g) fill compressor station.,- +CH4 (g) fill compressor station,FOM,2040,1.7,%/year,2020,Assume same as for H2 (g) fill compressor station.,- +HVAC overhead,investment,2030,400,EUR/MW/km,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVAC overhead,lifetime,2030,40,years,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVAC overhead,FOM,2030,2,%/year,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVDC overhead,investment,2030,400,EUR/MW/km,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVDC overhead,lifetime,2030,40,years,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVDC overhead,FOM,2030,2,%/year,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVDC submarine,investment,2030,970,EUR/MW/km,2017,HΓ€rtel et al. (2017): https://doi.org/10.1016/j.epsr.2017.06.008 .,Table 1 +HVDC submarine,FOM,2030,0.35,%/year,2018,Purvins et al. (2018): https://doi.org/10.1016/j.jclepro.2018.03.095 .,"Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables." +HVDC submarine,lifetime,2030,40,years,2018,Purvins et al. (2018): https://doi.org/10.1016/j.jclepro.2018.03.095 .,"Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables." +HVDC underground,investment,2030,970,EUR/MW/km,2017,HΓ€rtel et al. (2017): https://doi.org/10.1016/j.epsr.2017.06.008 .,Table 1 (same as for HVDC submarine) +HVDC underground,FOM,2030,0.35,%/year,2018,Purvins et al. (2018): https://doi.org/10.1016/j.jclepro.2018.03.095 .,"Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables. (same as for HVDC submarine)" +HVDC underground,lifetime,2030,40,years,2018,Purvins et al. (2018): https://doi.org/10.1016/j.jclepro.2018.03.095 .,"Based on estimated costs for a NA-EU connector (bidirectional,4 GW, 3000km length and ca. 3000m depth). Costs in return based on existing/currently under construction undersea cables. (same as for HVDC submarine)" +HVDC inverter pair,investment,2030,150000,EUR/MW,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVDC inverter pair,lifetime,2030,40,years,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +HVDC inverter pair,FOM,2030,2,%/year,2011,"Hagspiel et al. (2014): doi:10.1016/j.energy.2014.01.025 , table A.2 .", +CH4 (g) submarine pipeline,investment,2002,112.64,EUR/MW/km,2014,Kaiser (2017): 10.1016/j.marpol.2017.05.003 .,"Based on Gulfstream pipeline costs (430 mi long pipeline for natural gas in deep/shallow waters) of 2.72e6 USD/mi and 1.31 bn ft^3/d capacity (36 in diameter), LHV of methane 13.8888 MWh/t and density of 0.657 kg/m^3 and 1.17 USD:1EUR conversion rate = 102.4 EUR/MW/km. Number is without booster station cost. Estimation of additional cost for booster stations based on H2 (g) pipeline numbers from Guidehouse (2020): European Hydrogen Backbone report and Danish Energy Agency (2021): Technology Data for Energy Transport, were booster stations make ca. 6% of pipeline cost; here add additional 10% for booster stations as they need to be constructed submerged or on plattforms. (102.4*1.1)." +CH4 (g) submarine pipeline,FOM,2015,3,%/year,2015,"d’Amore-Domenech et al (2021): 10.1016/j.apenergy.2021.116625 , supplementary material.",- +CH4 (g) submarine pipeline,lifetime,2015,30,years,2015,"d’Amore-Domenech et al (2021): 10.1016/j.apenergy.2021.116625 , supplementary material.",- +CH4 (g) submarine pipeline,electricity-input,2020,0.01,MW_e/1000km/MW_CH4,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: 112 6 gas Main distri line.","Assumption for gas pipeline >100MW, 0.1% per station and spacing of 100km yields 1%/1000km. Electric compression." +H2 (g) submarine pipeline,investment,2020,545.325,EUR/MW/km,2023,European Hydrogen Backbone Report (June 2021): https://gasforclimate2050.eu/wp-content/uploads/2021/06/EHB_Analysing-the-future-demand-supply-and-transport-of-hydrogen_June-2021.pdf Table 35. Implementation roadmap - Cross border projects and costs updates: https://ehb.eu/files/downloads/EHB-2023-20-Nov-FINAL-design.pdf Table 1,"Assumption for a 48 inch single line offshore pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 7.48 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)" +H2 (g) submarine pipeline,FOM,2015,3,%/year,2015,Assume same as for CH4 (g) submarine pipeline.,- +H2 (g) submarine pipeline,lifetime,2015,30,years,2015,Assume same as for CH4 (g) submarine pipeline.,- +H2 (g) submarine pipeline,electricity-input,2020,0.021,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) submarine pipeline,electricity-input,2030,0.019,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) submarine pipeline,electricity-input,2050,0.017,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) submarine pipeline repurposed,investment,2020,191.48,EUR/MW/km,2023,European Hydrogen Backbone Report (June 2021): https://gasforclimate2050.eu/wp-content/uploads/2021/06/EHB_Analysing-the-future-demand-supply-and-transport-of-hydrogen_June-2021.pdf Table 35. Implementation roadmap - Cross border projects and costs updates: https://ehb.eu/files/downloads/EHB-2023-20-Nov-FINAL-design.pdf Table 1,"Assumption for a 48 inch single line repurposed offshore pipeline, incl. compressor investments, 16.9 GW (LHV) peak capacity (source 2), 1.5 MEUR/km base cost with additional investment for compressors of capacity 434 MWe/1000 km (source 1), at 4 MEUR/MWe for compressor (source 2)" +H2 (g) submarine pipeline repurposed,FOM,2015,3,%/year,2015,Assume same as for CH4 (g) submarine pipeline.,- +H2 (g) submarine pipeline repurposed,lifetime,2015,30,years,2015,Assume same as for CH4 (g) submarine pipeline.,- +H2 (g) submarine pipeline repurposed,electricity-input,2020,0.021,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) submarine pipeline repurposed,electricity-input,2030,0.019,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (g) submarine pipeline repurposed,electricity-input,2050,0.017,MW_e/1000km/MW_H2,2015,"Danish Energy Agency, Technology Data for Energy Transport (2021), Excel datasheet: H2 140.","Assumption for a 140 bar, 5-20 GW pipeline. Electric compression." +H2 (l) storage tank,investment,2015,750.07500750075,EUR/MWh_H2,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 6.","Assuming currency year and technology year here (25 EUR/kg). Future target cost. Today’s cost potentially higher according to d’Amore-Domenech et al (2021): 10.1016/j.apenergy.2021.116625 , supplementary material pg. 16." +H2 (l) storage tank,lifetime,2015,20,years,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 6.",Assuming currency year and technology year here (25 EUR/kg). +H2 (l) storage tank,FOM,2015,2,%/year,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 6.",Assuming currency year and technology year here (25 EUR/kg). +H2 liquefaction,investment,2030,1000,EUR/kW_H2,2022,"IRENA (2022): Global Hydrogen Trade to Meet the 1.5Β° Climate Goal: Technology Review of Hydrogen Carriers, https://www.irena.org/publications/2022/Apr/Global-hydrogen-trade-Part-II , pg. 62f.",Assumption for a 200t/d facility (Pessimistic long-term or optimistic short-term value). +H2 liquefaction,lifetime,2030,20,years,2022,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.", +H2 liquefaction,FOM,2030,2.5,%/year,2020,"DNV GL (2020): Study on the Import of Liquid Renewable Energy: Technology Cost Assessment, https://www.gie.eu/wp-content/uploads/filr/2598/DNV-GL_Study-GLE-Technologies-and-costs-analysis-on-imports-of-liquid-renewable-energy.pdf .", +H2 liquefaction,investment,2050,600,EUR/kW_H2,2022,"IRENA (2022): Global Hydrogen Trade to Meet the 1.5Β° Climate Goal: Technology Review of Hydrogen Carriers, https://www.irena.org/publications/2022/Apr/Global-hydrogen-trade-Part-II , pg. 62f.","Assumption for a large >300t/d, e.g. 2500 t/d facility (Optimistic long-term value without change in base technology mentioned in report)." +H2 liquefaction,lifetime,2050,20,years,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.", +H2 liquefaction,FOM,2050,2.5,%/year,2020,"DNV GL (2020): Study on the Import of Liquid Renewable Energy: Technology Cost Assessment, https://www.gie.eu/wp-content/uploads/filr/2598/DNV-GL_Study-GLE-Technologies-and-costs-analysis-on-imports-of-liquid-renewable-energy.pdf .", +H2 liquefaction,hydrogen-input,0,1.017,MWh_H2/MWh_H2,-,"Heuser et al. (2019): Techno-economic analysis of a potential energy trading link between Patagonia and Japan based on CO2 free hydrogen (https://doi.org/10.1016/j.ijhydene.2018.12.156), table 1.",corresponding to 1.65% losses during liquefaction +H2 liquefaction,electricity-input,0,0.203,MWh_el/MWh_H2,-,"Heuser et al. (2019): Techno-economic analysis of a potential energy trading link between Patagonia and Japan based on CO2 free hydrogen (https://doi.org/10.1016/j.ijhydene.2018.12.156), table 1.","6.78 kWh/kg_H2, considering H2 with LHV of 33.3333 MWh/t" +H2 evaporation,investment,2030,165,EUR/kW_H2,2022,"IRENA (2022): Global Hydrogen Trade to Meet the 1.5Β° Climate Goal: Technology Review of Hydrogen Carriers, https://www.irena.org/publications/2022/Apr/Global-hydrogen-trade-Part-II , pg. 62f.","Pessimistic assumption for large scale facility / near-term estimate for medium sized facility, in between low / mid estimate with e.g. DNV numbers (Fig. 3.15)." +H2 evaporation,lifetime,2030,20,years,2015,Guesstimate.,Based on lifetime of liquefaction plant. +H2 evaporation,FOM,2030,2.5,%/year,2020,"DNV GL (2020): Study on the Import of Liquid Renewable Energy: Technology Cost Assessment, https://www.gie.eu/wp-content/uploads/filr/2598/DNV-GL_Study-GLE-Technologies-and-costs-analysis-on-imports-of-liquid-renewable-energy.pdf .", +H2 evaporation,investment,2050,65,EUR/kW_H2,2022,"IRENA (2022): Global Hydrogen Trade to Meet the 1.5Β° Climate Goal: Technology Review of Hydrogen Carriers, https://www.irena.org/publications/2022/Apr/Global-hydrogen-trade-Part-II , pg. 62f.","Optimistic assumption for large scale facility 2500 t/d, cf Fig. 3.15 ." +H2 evaporation,lifetime,2050,20,years,2015,Guesstimate.,Based on lifetime of liquefaction plant. +H2 evaporation,FOM,2050,2.5,%/year,2020,"DNV GL (2020): Study on the Import of Liquid Renewable Energy: Technology Cost Assessment, https://www.gie.eu/wp-content/uploads/filr/2598/DNV-GL_Study-GLE-Technologies-and-costs-analysis-on-imports-of-liquid-renewable-energy.pdf .", +H2 (l) transport ship,investment,2030,391000000,EUR,2019,"Cihlar et al 2020: http://op.europa.eu/en/publication-detail/-/publication/7e4afa7d-d077-11ea-adf7-01aa75ed71a1/language-en , Table 3-B, based on IEA 2019.", +H2 (l) transport ship,FOM,2030,4,%/year,2019,"Cihlar et al 2020: http://op.europa.eu/en/publication-detail/-/publication/7e4afa7d-d077-11ea-adf7-01aa75ed71a1/language-en , Table 3-B, based on IEA 2019.", +H2 (l) transport ship,lifetime,2030,20,years,2019,"Cihlar et al 2020: http://op.europa.eu/en/publication-detail/-/publication/7e4afa7d-d077-11ea-adf7-01aa75ed71a1/language-en , Table 3-B, based on IEA 2019.", +H2 (l) transport ship,capacity,2030,11000,t_H2,2019,"Cihlar et al 2020: http://op.europa.eu/en/publication-detail/-/publication/7e4afa7d-d077-11ea-adf7-01aa75ed71a1/language-en , Table 3-B, based on IEA 2019.", +CH4 (l) transport ship,investment,2030,151000000,EUR,2015,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,FOM,2030,3.5,%/year,2015,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,lifetime,2030,25,years,2015,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,capacity,2030,58300,t_CH4,2015,"Calculated, based on Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306",based on 138 000 m^3 capacity and LNG density of 0.4226 t/m^3 . +CH4 liquefaction,investment,2030,190.43,EUR/kW_CH4,2005,"Calculated, based on Lochner and Bothe (2009): https://doi.org/10.1016/j.enpol.2008.12.012 and Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306","based on 265 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR." +CH4 liquefaction,FOM,2030,3.5,%/year,2005,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 liquefaction,lifetime,2030,25,years,2005,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 liquefaction,methane-input,0,1,MWh_CH4/MWh_CH4,-,"PospΓ­Ε‘il et al. (2019): Energy demand of liquefaction and regasification of natural gas and the potential of LNG for operative thermal energy storage (https://doi.org/10.1016/j.rser.2018.09.027), Table 2 and Table 3. alternative source 2: https://encyclopedia.airliquide.com/methane (accessed 2021-02-10).","For refrigeration cycle, cleaning of gas presumed unnecessary as it should be nearly pure CH4 (=SNG). Assuming energy required is only electricity which is for Table 3 in the source provided with efficiencies of ~50% of LHV, making the numbers consistent with the numbers in Table 2." +CH4 liquefaction,electricity-input,0,0.036,MWh_el/MWh_CH4,-,"PospΓ­Ε‘il et al. (2019): Energy demand of liquefaction and regasification of natural gas and the potential of LNG for operative thermal energy storage (https://doi.org/10.1016/j.rser.2018.09.027), Table 2 and Table 3. alternative source 2: https://encyclopedia.airliquide.com/methane (accessed 2021-02-10).","Assuming 0.5 MWh/t_CH4 for refigeration cycle based on Table 2 of source; cleaning of gas presumed unnecessary as it should be nearly pure CH4 (=SNG). Assuming energy required is only electricity which is for Table 3 in the source provided with efficiencies of ~50% of LHV, making the numbers consistent with the numbers in Table 2." +CH4 evaporation,investment,2030,71.86,EUR/kW_CH4,2005,"Calculated, based on Lochner and Bothe (2009): https://doi.org/10.1016/j.enpol.2008.12.012 and Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306","based on 100 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR." +CH4 evaporation,FOM,2030,3.5,%/year,2005,"Lochner and Bothe (2009): https://doi.org/10.1016/j.enpol.2008.12.012 and Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 evaporation,lifetime,2030,30,years,2005,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,investment,2040,151000000,EUR,2015,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,FOM,2040,3.5,%/year,2015,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,lifetime,2040,25,years,2015,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 (l) transport ship,capacity,2040,58300,t_CH4,2015,"Calculated, based on Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306",based on 138 000 m^3 capacity and LNG density of 0.4226 t/m^3 . +CH4 liquefaction,investment,2040,190.43,EUR/kW_CH4,2005,"Calculated, based on Lochner and Bothe (2009): https://doi.org/10.1016/j.enpol.2008.12.012 and Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306","based on 265 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR." +CH4 liquefaction,FOM,2040,3.5,%/year,2005,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 liquefaction,lifetime,2040,25,years,2005,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 evaporation,investment,2040,71.86,EUR/kW_CH4,2005,"Calculated, based on Lochner and Bothe (2009): https://doi.org/10.1016/j.enpol.2008.12.012 and Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306","based on 100 MUSD-2005/(1 bcm/a), 1 bcm = 10.6 TWh, currency exchange rate: 1.15 USD=1 EUR." +CH4 evaporation,FOM,2040,3.5,%/year,2005,"Lochner and Bothe (2009): https://doi.org/10.1016/j.enpol.2008.12.012 and Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +CH4 evaporation,lifetime,2040,30,years,2005,"Fasihi et al 2017, table 1, https://www.mdpi.com/2071-1050/9/2/306", +LNG storage tank,investment,2019,662,EUR/m^3,2019,"Hurskainen 2019, https://cris.vtt.fi/en/publications/liquid-organic-hydrogen-carriers-lohc-concept-evaluation-and-tech pg. 46 (59).",Currency year and technology year assumed based on publication date. +LNG storage tank,FOM,2019,2,%/year,2019,"Guesstimate, based on H2 (l) storage tank with comparable requirements.",Currency year and technology year assumed based on publication date. +LNG storage tank,lifetime,2019,20,years,2019,"Guesstimate, based on H2 (l) storage tank with comparable requirements.",Currency year and technology year assumed based on publication date. +MeOH transport ship,investment,2035,35000000,EUR,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +MeOH transport ship,capacity,2035,75000,t_MeOH,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +MeOH transport ship,lifetime,2035,15,years,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +MeOH transport ship,FOM,2035,5,%/year,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +NH3 (l) transport ship,capacity,2030,53000,t_NH3,2019,"Cihlar et al 2020 based on IEA 2019, Table 3-B", +NH3 (l) transport ship,investment,2030,80600000,EUR,2019,"Cihlar et al 2020 based on IEA 2019, Table 3-B", +NH3 (l) transport ship,FOM,2030,4,%/year,2019,"Cihlar et al 2020 based on IEA 2019, Table 3-B", +NH3 (l) transport ship,lifetime,2030,20,years,2019,"Guess estimated based on H2 (l) tanker, but more mature technology", +LOHC transport ship,capacity,2035,75000,t_LOHC,2020,"Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514", +LOHC transport ship,investment,2035,35000000,EUR,2020,"Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514", +LOHC transport ship,FOM,2035,5,%/year,2020,"Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514", +LOHC transport ship,lifetime,2035,15,years,2020,"Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514", +LOHC chemical,investment,2035,2500,EUR/t,2020,"Runge et al 2020, pg.7, https://papers.ssrn.com/abstract=3623514", +LOHC chemical,lifetime,2035,20,years,2020,"Runge et al 2020, pg.7, https://papers.ssrn.com/abstract=3623514", +LOHC hydrogenation,investment,2015,51259.5439606197,EUR/MW_H2,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.",per MW H2 (LHV). For a large plant of 2000 MW capacity. Calculated based on base CAPEX of 40 MEUR for 300 t/day capacity and a scale factor of 0.6. +LOHC hydrogenation,FOM,2015,3,%/year,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.", +LOHC hydrogenation,lifetime,2015,20,years,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.", +LOHC hydrogenation,hydrogen-input,0,1.867,MWh_H2/t_HLOHC,-,"Runge et al 2020, pg. 7, https://papers.ssrn.com/abstract=3623514",Considering 5.6 wt-% H2 in loaded LOHC (HLOHC) and LHV of H2. +LOHC hydrogenation,electricity-input,0,0.004,MWh_el/t_HLOHC,-,Niermann et al. (2019): (https://doi.org/10.1039/C8EE02700E). 6A .,"Flow in figures shows 0.2 MW for 114 MW_HHV = 96.4326 MW_LHV = 2.89298 t hydrogen. At 5.6 wt-% effective H2 storage for loaded LOHC (H18-DBT, HLOHC), corresponds to 51.6604 t loaded LOHC ." +LOHC hydrogenation,lohc-input,0,0.944,t_LOHC/t_HLOHC,-,"Runge et al 2020, pg. 7, https://papers.ssrn.com/abstract=3623514","Loaded LOHC (H18-DBT, HLOHC) has loaded only 5.6%-wt H2 as rate of discharge is kept at ca. 90%." +LOHC dehydrogenation,investment,2015,50728.0303189864,EUR/MW_H2,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.",per MW H2 (LHV). For a large plant of 1000 MW capacity. Calculated based on base CAPEX of 30 MEUR for 300 t/day capacity and a scale factor of 0.6. +LOHC dehydrogenation,FOM,2015,3,%/year,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.", +LOHC dehydrogenation,lifetime,2015,20,years,2015,"Reuß et al 2017, https://doi.org/10.1016/j.apenergy.2017.05.050 , Table 9.", +LOHC dehydrogenation (small scale),investment,2035,839000,EUR/MW_H2,2020,"Runge et al 2020, pg.8, https://papers.ssrn.com/abstract=3623514",MW of H2 LHV. For a small plant of 0.9 MW capacity. +LOHC dehydrogenation (small scale),FOM,2035,3,%/year,2020,"Runge et al 2020, pg.8, https://papers.ssrn.com/abstract=3623514", +LOHC dehydrogenation (small scale),lifetime,2035,20,years,2020,"Runge et al 2020, pg.8, https://papers.ssrn.com/abstract=3623514", +NH3 (l) storage tank incl. liquefaction,investment,2020,146.66681333348,EUR/MWh_NH3,2010,"Calculated based on Morgan E. 2013: doi:10.7275/11KT-3F59 , Fig. 55, Fig 58.","Based on estimated for a double-wall liquid ammonia tank (~ambient pressure, -33Β°C), inner tank from stainless steel, outer tank from concrete including installations for liquefaction/condensation, boil-off gas recovery and safety installations; the necessary installations make only a small fraction of the total cost. The total cost are driven by material and working time on the tanks. +While the costs do not scale strictly linearly, we here assume they do (good approximation c.f. ref. Fig 55.) and take the costs for a 9 kt NH3 (l) tank = 8 M$2010, which is smaller 4-5x smaller than the largest deployed tanks today. +We assume an exchange rate of 1.17$ to 1 €. +The investment value is given per MWh NH3 store capacity, using the LHV of NH3 of 5.18 MWh/t." +NH3 (l) storage tank incl. liquefaction,FOM,2020,2,%/year,2010,"Guesstimate, based on H2 (l) storage tank.", +NH3 (l) storage tank incl. liquefaction,lifetime,2020,20,years,2010,"Morgan E. 2013: doi:10.7275/11KT-3F59 , pg. 290", +CO2 storage tank,investment,2050,2430,EUR/t_CO2,2013,"Lauri et al. 2014: doi: 10.1016/j.egypro.2014.11.297, Table 3.","Assuming a 3000m^3 pressurised steel cylinder tanks and a CO2 density of 1100 kg/m^3 (close to triple point at -56.6Β°C and 5.2 bar with max density of 1200kg/m^3 ). Lauri et al. report costs 3x higher per m^3 for steel tanks, which are consistent with other sources. The numbers reported are in rather difficult to pinpoint as systems can greatly vary." +CO2 storage tank,FOM,2050,1,%/year,2013,"Lauri et al. 2014: doi: 10.1016/j.egypro.2014.11.297, pg. 2746 .","Assuming a 3000m^3 pressurised steel cylinder tanks and a CO2 density of 1100 kg/m^3 (close to triple point at -56.6Β°C and 5.2 bar with max density of 1200kg/m^3 ). Lauri et al. report costs 3x higher per m^3 for steel tanks, which are consistent with other sources. The numbers reported are in rather difficult to pinpoint as systems can greatly vary." +CO2 storage tank,lifetime,2050,25,years,2013,"Lauri et al. 2014: doi: 10.1016/j.egypro.2014.11.297, pg. 2746 .","Assuming a 3000m^3 pressurised steel cylinder tanks and a CO2 density of 1100 kg/m^3 (close to triple point at -56.6Β°C and 5.2 bar with max density of 1200kg/m^3 ). Lauri et al. report costs 3x higher per m^3 for steel tanks, which are consistent with other sources. The numbers reported are in rather difficult to pinpoint as systems can greatly vary." +CO2 liquefaction,investment,2004,12.8928283642224,EUR/t_CO2/h,2004,Mitsubish Heavy Industries Ltd. and IEA (2004): https://ieaghg.org/docs/General_Docs/Reports/PH4-30%20Ship%20Transport.pdf .,"Plant capacity of 20 kt CO2 / d and an uptime of 85%. For a high purity, humid, low pressure input stream, includes drying and compression necessary for liquefaction." +CO2 liquefaction,FOM,2004,5,%/year,2004,Mitsubish Heavy Industries Ltd. and IEA (2004): https://ieaghg.org/docs/General_Docs/Reports/PH4-30%20Ship%20Transport.pdf ., +CO2 liquefaction,lifetime,2004,25,years,2004,"Guesstimate, based on CH4 liquefaction.", +CO2 liquefaction,carbondioxide-input,0,1,t_CO2/t_CO2,-,Mitsubish Heavy Industries Ltd. and IEA (2004): https://ieaghg.org/docs/General_Docs/Reports/PH4-30%20Ship%20Transport.pdf .,"Assuming a pure, humid, low-pressure input stream. Neglecting possible gross-effects of CO2 which might be cycled for the cooling process." +CO2 liquefaction,heat-input,0,0.0067,MWh_th/t_CO2,-,Mitsubish Heavy Industries Ltd. and IEA (2004): https://ieaghg.org/docs/General_Docs/Reports/PH4-30%20Ship%20Transport.pdf .,For drying purposes. +CO2 liquefaction,electricity-input,0,0.123,MWh_el/t_CO2,-,Mitsubish Heavy Industries Ltd. and IEA (2004): https://ieaghg.org/docs/General_Docs/Reports/PH4-30%20Ship%20Transport.pdf ., +General liquid hydrocarbon storage (product),investment,2012,160,EUR/m^3,2012,"Stelter and Nishida 2013: https://webstore.iea.org/insights-series-2013-focus-on-energy-security , pg. 8F .",Assumed at the higher end for addon facilities/mid-range for stand-alone facilities. Product storage usually smaller due to higher requirements on safety and different construction method. Reference size used here: 40 000 - 60 000 m^3 . +General liquid hydrocarbon storage (product),FOM,2012,6.25,%/year,2012,"Stelter and Nishida 2013: https://webstore.iea.org/insights-series-2013-focus-on-energy-security , figure 7 and pg. 12 .",Assuming ca. 10 EUR/m^3/a (center value between stand alone and addon facility). +General liquid hydrocarbon storage (product),lifetime,2012,30,years,2012,"Stelter and Nishida 2013: https://webstore.iea.org/insights-series-2013-focus-on-energy-security , pg. 11.", +General liquid hydrocarbon storage (crude),investment,2012,128,EUR/m^3,2012,"Stelter and Nishida 2013: https://webstore.iea.org/insights-series-2013-focus-on-energy-security , pg. 8F .",Assumed 20% lower than for product storage. Crude or middle distillate tanks are usually larger compared to product storage due to lower requirements on safety and different construction method. Reference size used here: 80 000 – 120 000 m^3 . +General liquid hydrocarbon storage (crude),FOM,2012,6.25,%/year,2012,"Stelter and Nishida 2013: https://webstore.iea.org/insights-series-2013-focus-on-energy-security , figure 7 and pg. 12 .",Assuming ca. 10 EUR/m^3/a (center value between stand alone and addon facility). +General liquid hydrocarbon storage (crude),lifetime,2012,30,years,2012,"Stelter and Nishida 2013: https://webstore.iea.org/insights-series-2013-focus-on-energy-security , pg. 11.", +methane storage tank incl. compressor,investment,2014,8460,EUR/m^3,2014,Storage costs per l: https://www.compositesworld.com/articles/pressure-vessels-for-alternative-fuels-2014-2023 (2021-02-10).,"Assume 5USD/l (= 4.23 EUR/l at 1.17 USD/EUR exchange rate) for type 1 pressure vessel for 200 bar storage and 100% surplus costs for including compressor costs with storage, based on similar assumptions by DEA for compressed hydrogen storage tanks." +methane storage tank incl. compressor,FOM,2014,1.9,%/year,2014,"Guesstimate, based on hydrogen storage tank type 1 including compressor by DEA.",Based on assumptions for hydrogen storage tank type 1 including compressor (by DEA). +methane storage tank incl. compressor,lifetime,2014,30,years,2014,"Guesstimate, based on hydrogen storage tank type 1 including compressor by DEA.",Based on assumptions for hydrogen storage tank 1 including compressor (by DEA). +LOHC loaded DBT storage,investment,2012,140.659340659341,EUR/t,2012,"Density via Wissenschaftliche Dienste des Deutschen Bundestages 2020, https://www.bundestag.de/resource/blob/816048/454e182d5956d45a664da9eb85486f76/WD-8-058-20-pdf-data.pdf , pg. 11.","Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared. Density of loaded LOHC H18-DBT is 0.91 t/m^3." +LOHC loaded DBT storage,FOM,2012,6.25,%/year,2012,,"Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared." +LOHC loaded DBT storage,lifetime,2012,30,years,2012,,"Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared." +LOHC unloaded DBT storage,investment,2012,124.634858812074,EUR/t,2012,"Density via Wissenschaftliche Dienste des Deutschen Bundestages 2020, https://www.bundestag.de/resource/blob/816048/454e182d5956d45a664da9eb85486f76/WD-8-058-20-pdf-data.pdf , pg. 11.","Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared. Density of loaded LOHC H18-DBT is 0.91 t/m^3, density of unloaded LOHC H0-DBT is 1.04 t/m^3 but unloading is only to 90% (depth-of-discharge), assume density via linearisation of 1.027 t/m^3." +LOHC unloaded DBT storage,FOM,2012,6.25,%/year,2012,,"Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared." +LOHC unloaded DBT storage,lifetime,2012,30,years,2012,,"Based on storage β€œGeneral liquid hydrocarbon storage (crude)”, as similar properties are shared." +FT fuel transport ship,investment,2035,35000000,EUR,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +FT fuel transport ship,capacity,2035,75000,t_FTfuel,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +FT fuel transport ship,lifetime,2035,15,years,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +FT fuel transport ship,FOM,2035,5,%/year,2020,"Assume comparable tanker as for LOHC transport above, c.f. Runge et al 2020, Table 10, https://papers.ssrn.com/abstract=3623514 .", +Ammonia cracker,investment,2030,1062107.74,EUR/MW_H2,2015,"Ishimoto et al. (2020): 10.1016/j.ijhydene.2020.09.017 , table 6.",Calculated. For a small (200 t_NH3/d input) facility. Base cost for facility: 51 MEUR at capacity 20 000m^3_NH3/h = 339 t_NH3/d input. Cost scaling exponent 0.67. Ammonia density 0.7069 kg/m^3. Conversion efficiency of cracker: 0.685. Ammonia LHV: 5.167 MWh/t_NH3. +Ammonia cracker,lifetime,2030,25,years,2015,"Ishimoto et al. (2020): 10.1016/j.ijhydene.2020.09.017 , table 7.", +Ammonia cracker,FOM,2030,4.3,%/year,2015,"Ishimoto et al. (2020): 10.1016/j.ijhydene.2020.09.017 , table 7.","Estimated based on Labour cost rate, Maintenance cost rate, Insurance rate, Admin. cost rate and Chemical & other consumables cost rate." +Ammonia cracker,investment,2050,527592.22,EUR/MW_H2,2015,"Ishimoto et al. (2020): 10.1016/j.ijhydene.2020.09.017 , table 6.",Calculated. For a large (2500 t_NH3/d input) facility. Base cost for facility: 51 MEUR at capacity 20 000m^3_NH3/h = 339 t_NH3/d input. Cost scaling exponent 0.67. Ammonia density 0.7069 kg/m^3. Conversion efficiency of cracker: 0.685. Ammonia LHV: 5.167 MWh/t_NH3. +Ammonia cracker,lifetime,2050,25,years,2015,"Ishimoto et al. (2020): 10.1016/j.ijhydene.2020.09.017 , table 7.", +Ammonia cracker,FOM,2050,4.3,%/year,2015,"Ishimoto et al. (2020): 10.1016/j.ijhydene.2020.09.017 , table 7.","Estimated based on Labour cost rate, Maintenance cost rate, Insurance rate, Admin. cost rate and Chemical & other consumables cost rate." +Ammonia cracker,ammonia-input,0,1.46,MWh_NH3/MWh_H2,,"ENGIE et al (2020): Ammonia to Green Hydrogen Feasibility Study (https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/880826/HS420_-_Ecuity_-_Ammonia_to_Green_Hydrogen.pdf), Fig. 10.",Assuming a integrated 200t/d cracking and purification facility. Electricity demand (316 MWh per 2186 MWh_LHV H2 output) is assumed to also be ammonia LHV input which seems a fair assumption as the facility has options for a higher degree of integration according to the report). +methanol-to-olefins/aromatics,investment,2015,2628000,EUR/(t_HVC/h),2015,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), Table 35",Assuming CAPEX of 1200 €/t actually given in €/(t/a). +methanol-to-olefins/aromatics,lifetime,2015,30,years,-,Guesstimate,same as steam cracker +methanol-to-olefins/aromatics,FOM,2015,3,%/year,2015,Guesstimate,same as steam cracker +methanol-to-olefins/aromatics,VOM,2015,30,EUR/t_HVC,2015,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), Table 35", +methanol-to-olefins/aromatics,electricity-input,2015,1.3889,MWh_el/t_HVC,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), page 69",5 GJ/t_HVC +methanol-to-olefins/aromatics,methanol-input,2015,18.03,MWh_MeOH/t_HVC,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), Sections 4.5 (for ethylene and propylene) and 4.6 (for BTX)","Weighted average: 2.83 t_MeOH/t_ethylene+propylene for 21.7 Mt of ethylene and 17 Mt of propylene, 4.2 t_MeOH/t_BTX for 15.7 Mt of BTX. Assuming 5.54 MWh_MeOH/t_MeOH. " +methanol-to-olefins/aromatics,carbondioxide-output,2015,0.6107,t_CO2/t_HVC,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), Sections 4.5 (for ethylene and propylene) and 4.6 (for BTX)","Weighted average: 0.4 t_MeOH/t_ethylene+propylene for 21.7 Mt of ethylene and 17 Mt of propylene, 1.13 t_CO2/t_BTX for 15.7 Mt of BTX. The report also references process emissions of 0.55 t_MeOH/t_ethylene+propylene elsewhere. " +electric steam cracker,investment,2015,10512000,EUR/(t_HVC/h),2015,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), Table 35",Assuming CAPEX of 1200 €/t actually given in €/(t/a). +electric steam cracker,lifetime,2015,30,years,-,Guesstimate, +electric steam cracker,FOM,2015,3,%/year,2015,Guesstimate, +electric steam cracker,VOM,2015,180,EUR/t_HVC,2015,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), Table 35", +electric steam cracker,naphtha-input,2015,14.8,MWh_naphtha/t_HVC,-,"LechtenbΓΆhmer et al. (2016): 10.1016/j.energy.2016.07.110, Section 4.3, page 6.", +electric steam cracker,electricity-input,2015,2.7,MWh_el/t_HVC,-,"LechtenbΓΆhmer et al. (2016): 10.1016/j.energy.2016.07.110, Section 4.3, page 6.",Assuming electrified processing. +electric steam cracker,carbondioxide-output,2015,0.55,t_CO2/t_HVC,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), ",The report also references another source with 0.76 t_CO2/t_HVC +Steam methane reforming,investment,2015,470085.47008547,EUR/MW_H2,2015,"International Energy Agency (2015): Technology Roadmap Hydrogen and Fuel Cells , table 15.",Large scale SMR facility (150-300 MW). Currency conversion 1.17 USD = 1 EUR. +Steam methane reforming,lifetime,2015,30,years,2015,"International Energy Agency (2015): Technology Roadmap Hydrogen and Fuel Cells , table 15.",Large scale SMR facility (150-300 MW). +Steam methane reforming,FOM,2015,3,%/year,2015,"International Energy Agency (2015): Technology Roadmap Hydrogen and Fuel Cells , table 15.",Large scale SMR facility (150-300 MW). +Steam methane reforming,methane-input,0,1.483,MWh_CH4/MWh_H2,-,"Keipi et al (2018): Economic analysis of hydrogen production by methane thermal decomposition (https://doi.org/10.1016/j.enconman.2017.12.063), table 2.","Large scale SMR plant producing 2.5 kg/s H2 output (assuming 33.3333 MWh/t H2 LHV), with 6.9 kg/s CH4 input (feedstock) and 2 kg/s CH4 input (energy). Neglecting water consumption." +Methanol steam reforming,investment,2020,18016.8665097215,EUR/MW_H2,2020,"Niermann et al. (2021): Liquid Organic Hydrogen Carriers and alternatives for international transport of renewable hydrogen (https://doi.org/10.1016/j.rser.2020.110171), table 4.","For high temperature steam reforming plant with a capacity of 200 MW_H2 output (6t/h). Reference plant of 1 MW (30kg_H2/h) costs 150kEUR, scale factor of 0.6 assumed." +Methanol steam reforming,lifetime,2020,20,years,2020,"Niermann et al. (2021): Liquid Organic Hydrogen Carriers and alternatives for international transport of renewable hydrogen (https://doi.org/10.1016/j.rser.2020.110171), table 4.", +Methanol steam reforming,FOM,2020,4,%/year,2020,"Niermann et al. (2021): Liquid Organic Hydrogen Carriers and alternatives for international transport of renewable hydrogen (https://doi.org/10.1016/j.rser.2020.110171), table 4.", +Methanol steam reforming,methanol-input,0,1.201,MWh_MeOH/MWh_H2,-,"Niermann et al. (2021): Liquid Organic Hydrogen Carriers and alternatives for international transport of renewable hydrogen (https://doi.org/10.1016/j.rser.2020.110171), table 4.",Assuming per 1 t_H2 (with LHV 33.3333 MWh/t): 4.5 MWh_th and 3.2 MWh_el are required. We assume electricity can be substituted / provided with 1:1 as heat energy. +methanol-to-kerosene,methanol-input,2020,1.0764,MWh_MeOH/MWh_kerosene,-,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 6.","Assuming LHV 11.94 kWh/kg for kerosene, 5.54 kWh/kg for methanol, 33.3 kWh/kg for hydrogen." +methanol-to-kerosene,hydrogen-input,2020,0.0279,MWh_H2/MWh_kerosene,-,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 6.","Assuming LHV 11.94 kWh/kg for kerosene, 5.54 kWh/kg for methanol, 33.3 kWh/kg for hydrogen." +methanol-to-kerosene,lifetime,2020,30,years,-,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,investment,2020,307000,EUR/MW_kerosene,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,FOM,2020,4.5,%/year,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,VOM,2020,1.35,EUR/MWh_kerosene,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,lifetime,2030,30,years,-,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,investment,2030,269000,EUR/MW_kerosene,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,FOM,2030,4.5,%/year,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,VOM,2030,1.35,EUR/MWh_kerosene,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,lifetime,2050,30,years,-,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,investment,2050,200000,EUR/MW_kerosene,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,FOM,2050,4.5,%/year,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +methanol-to-kerosene,VOM,2050,1.35,EUR/MWh_kerosene,2020,"Concawe (2022): E-Fuels: A technoeconomic assessment of European domestic production and imports towards 2050 (https://www.concawe.eu/wp-content/uploads/Rpt_22-17.pdf), table 94.", +Fischer-Tropsch,efficiency,2020,0.799,per unit,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.2.", +Fischer-Tropsch,investment,2020,788000,EUR/MW_FT,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 8: β€œReference scenario”.","Well developed technology, no significant learning expected." +Fischer-Tropsch,lifetime,2020,20,years,2017,"Danish Energy Agency, Technology Data for Renewable Fuels (04/2022), Data sheet β€œMethanol to Power”.", +Fischer-Tropsch,FOM,2020,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.1.", +Fischer-Tropsch,investment,2030,677000,EUR/MW_FT,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 8: β€œReference scenario”.","Well developed technology, no significant learning expected." +Fischer-Tropsch,lifetime,2030,20,years,2017,"Danish Energy Agency, Technology Data for Renewable Fuels (04/2022), Data sheet β€œMethanol to Power”.", +Fischer-Tropsch,FOM,2030,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.1.", +Fischer-Tropsch,investment,2050,500000,EUR/MW_FT,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 8: β€œReference scenario”.","Well developed technology, no significant learning expected." +Fischer-Tropsch,lifetime,2050,20,years,2017,"Danish Energy Agency, Technology Data for Renewable Fuels (04/2022), Data sheet β€œMethanol to Power”.", +Fischer-Tropsch,FOM,2050,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.1.", +Fischer-Tropsch,hydrogen-input,2020,1.531,MWh_H2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,hydrogen-input,2030,1.421,MWh_H2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,hydrogen-input,2040,1.363,MWh_H2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,hydrogen-input,2050,1.327,MWh_H2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.995 MWh_H2 per output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,electricity-input,2020,0.008,MWh_el/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,electricity-input,2030,0.007,MWh_el/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,electricity-input,2040,0.007,MWh_el/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,electricity-input,2050,0.007,MWh_el/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","0.005 MWh_el input per FT output, output increasing from 2020 to 2050 (0.65, 0.7, 0.73, 0.75 MWh liquid FT output)." +Fischer-Tropsch,carbondioxide-input,2020,0.36,t_CO2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT)." +Fischer-Tropsch,carbondioxide-input,2030,0.326,t_CO2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT)." +Fischer-Tropsch,carbondioxide-input,2040,0.301,t_CO2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT)." +Fischer-Tropsch,carbondioxide-input,2050,0.276,t_CO2/MWh_FT,,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), Hydrogen to Jet Fuel, Table 10 / pg. 267.","Input per 1t FT liquid fuels output, carbon efficiency increases with years (4.3, 3.9, 3.6, 3.3 t_CO2/t_FT from 2020-2050 with LHV 11.95 MWh_th/t_FT)." +methanolisation,investment,2020,788000,EUR/MW_MeOH,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 8: β€œReference scenario”.","Well developed technology, no significant learning expected." +methanolisation,lifetime,2020,20,years,2017,"Danish Energy Agency, Technology Data for Renewable Fuels (04/2022), Data sheet β€œMethanol to Power”.", +methanolisation,FOM,2020,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.1.", +methanolisation,investment,2030,677000,EUR/MW_MeOH,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 8: β€œReference scenario”.","Well developed technology, no significant learning expected." +methanolisation,lifetime,2030,20,years,2017,"Danish Energy Agency, Technology Data for Renewable Fuels (04/2022), Data sheet β€œMethanol to Power”.", +methanolisation,FOM,2030,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.1.", +methanolisation,investment,2050,500000,EUR/MW_MeOH,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), table 8: β€œReference scenario”.","Well developed technology, no significant learning expected." +methanolisation,lifetime,2050,20,years,2017,"Danish Energy Agency, Technology Data for Renewable Fuels (04/2022), Data sheet β€œMethanol to Power”.", +methanolisation,FOM,2050,3,%/year,2017,"Agora Energiewende (2018): The Future Cost of Electricity-Based Synthetic Fuels (https://www.agora-energiewende.de/en/publications/the-future-cost-of-electricity-based-synthetic-fuels-1/), section 6.3.2.1.", +methanolisation,electricity-input,0,0.271,MWh_e/MWh_MeOH,,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf) , pg. 65.", +methanolisation,hydrogen-input,0,1.138,MWh_H2/MWh_MeOH,,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf) , pg. 64.",189 kg_H2 per t_MeOH +methanolisation,carbondioxide-input,0,0.248,t_CO2/MWh_MeOH,,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf) , pg. 66.", +methanolisation,heat-output,0,0.1,MWh_th/MWh_MeOH,,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf) , pg. 65.",steam generation of 2 GJ/t_MeOH +csp-tower,investment,2020,159.96,"EUR/kW_th,dp",2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower,investment,2030,108.37,"EUR/kW_th,dp",2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower,investment,2040,99.97,"EUR/kW_th,dp",2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower,investment,2050,99.38,"EUR/kW_th,dp",2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include solar field and solar tower as well as EPC cost for the default installation size (104 MWe plant). Total costs (223,708,924 USD) are divided by active area (heliostat reflective area, 1,269,054 m2) and multiplied by design point DNI (0.95 kW/m2) to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower,FOM,2020,1,%/year,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario. +csp-tower,FOM,2030,1.1,%/year,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario. +csp-tower,FOM,2040,1.3,%/year,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario. +csp-tower,FOM,2050,1.4,%/year,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),Ratio between CAPEX and FOM from ATB database for β€œmoderate” scenario. +csp-tower,lifetime,2020,30,years,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),- +csp-tower,lifetime,2030,30,years,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),- +csp-tower,lifetime,2040,30,years,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),- +csp-tower,lifetime,2050,30,years,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power),- +csp-tower TES,investment,2020,21.43,EUR/kWh_th,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower TES,investment,2030,14.52,EUR/kWh_th,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower TES,investment,2040,13.39,EUR/kWh_th,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower TES,investment,2050,13.32,EUR/kWh_th,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the TES incl. EPC cost for the default installation size (104 MWe plant, 2.791 MW_th TES). Total costs (69390776.7 USD) are divided by TES size to obtain EUR/kW_th. Exchange rate: 1.16 USD to 1 EUR." +csp-tower TES,FOM,2020,1,%/year,2020,see solar-tower.,- +csp-tower TES,FOM,2030,1.1,%/year,2020,see solar-tower.,- +csp-tower TES,FOM,2040,1.3,%/year,2020,see solar-tower.,- +csp-tower TES,FOM,2050,1.4,%/year,2020,see solar-tower.,- +csp-tower TES,lifetime,2020,30,years,2020,see solar-tower.,- +csp-tower TES,lifetime,2030,30,years,2020,see solar-tower.,- +csp-tower TES,lifetime,2040,30,years,2020,see solar-tower.,- +csp-tower TES,lifetime,2050,30,years,2020,see solar-tower.,- +csp-tower power block,investment,2020,1120.57,EUR/kW_e,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR." +csp-tower power block,investment,2030,759.17,EUR/kW_e,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR." +csp-tower power block,investment,2040,700.34,EUR/kW_e,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR." +csp-tower power block,investment,2050,696.2,EUR/kW_e,2020,ATB CSP data (https://atb.nrel.gov/electricity/2021/concentrating_solar_power) and NREL SAM v2021.12.2 (https://sam.nrel.gov/).,"Based on NREL’s SAM (v2021.12.2) numbers for a CSP power plant, 2020 numbers. CAPEX degression (=learning) taken from ATB database (β€œmoderate”) scenario. Costs include the power cycle incl. BOP and EPC cost for the default installation size (104 MWe plant). Total costs (135185685.5 USD) are divided by power block nameplate capacity size to obtain EUR/kW_e. Exchange rate: 1.16 USD to 1 EUR." +csp-tower power block,FOM,2020,1,%/year,2020,see solar-tower.,- +csp-tower power block,FOM,2030,1.1,%/year,2020,see solar-tower.,- +csp-tower power block,FOM,2040,1.3,%/year,2020,see solar-tower.,- +csp-tower power block,FOM,2050,1.4,%/year,2020,see solar-tower.,- +csp-tower power block,lifetime,2020,30,years,2020,see solar-tower.,- +csp-tower power block,lifetime,2030,30,years,2020,see solar-tower.,- +csp-tower power block,lifetime,2040,30,years,2020,see solar-tower.,- +csp-tower power block,lifetime,2050,30,years,2020,see solar-tower.,- +hydrogen storage tank type 1,investment,2030,13.5,EUR/kWh_H2,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.9.","450 EUR/kg_H2 converted with LHV to MWh. For a type 1 hydrogen storage tank (steel, 15-250 bar). Currency year assumed 2020 for initial publication of reference; observe note in SI.4.3 that no currency year is explicitly stated in the reference." +hydrogen storage tank type 1,FOM,2030,2,%/year,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.9.",- +hydrogen storage tank type 1,lifetime,2030,20,years,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.9.",- +hydrogen storage tank type 1,min_fill_level,2030,6,%,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.9.",- +hydrogen storage compressor,investment,2030,87.69,EUR/kW_H2,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.4.","2923 EUR/kg_H2. For a 206 kg/h compressor. Base CAPEX 40 528 EUR/kW_el with scale factor 0.4603. kg_H2 converted to MWh using LHV. Pressure range: 30 bar in, 250 bar out." +hydrogen storage compressor,FOM,2030,4,%/year,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.4.",- +hydrogen storage compressor,lifetime,2030,15,years,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.4.",- +hydrogen storage compressor,compression-electricity-input,2030,0.05,MWh_el/MWh_H2,2020,"Based on StΓΆckl et al (2021): https://doi.org/10.48550/arXiv.2005.03464, table SI.4.",1.707 kWh/kg. +seawater RO desalination,electricity-input,0,0.003,MWHh_el/t_H2O,,"Caldera et al. (2016): Local cost of seawater RO desalination based on solar PV and windenergy: A global estimate. (https://doi.org/10.1016/j.desal.2016.02.004), Fig. 4.",Desalination using SWRO. Assume medium salinity of 35 Practical Salinity Units (PSUs) = 35 kg/m^3. +Haber-Bosch,electricity-input,0,0.2473,MWh_el/MWh_NH3,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), table 11.",Assume 5 GJ/t_NH3 for compressors and NH3 LHV = 5.16666 MWh/t_NH3. +Haber-Bosch,nitrogen-input,0,0.1597,t_N2/MWh_NH3,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), pg. 57.",".33 MWh electricity are required for ASU per t_NH3, considering 0.4 MWh are required per t_N2 and LHV of NH3 of 5.1666 Mwh." +Haber-Bosch,hydrogen-input,0,1.1484,MWh_H2/MWh_NH3,-,"DECHEMA 2017: DECHEMA: Low carbon energy and feedstock for the European chemical industry (https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry.pdf), pg. 57.","178 kg_H2 per t_NH3, LHV for both assumed." +air separation unit,electricity-input,0,0.25,MWh_el/t_N2,-,"DEA (2022): Technology Data for Renewable Fuels (https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels), p.288.","For consistency reasons use value from Danish Energy Agency. DEA also reports range of values (0.2-0.4 MWh/t_N2) on pg. 288. Other efficienices reported are even higher, e.g. 0.11 Mwh/t_N2 from Morgan (2013): Techno-Economic Feasibility Study of Ammonia Plants Powered by Offshore Wind ." +direct air capture,electricity-input,0,0.4,MWh_el/t_CO2,-,"Beuttler et al (2019): The Role of Direct Air Capture in Mitigation of Antropogenic Greenhouse Gas emissions (https://doi.org/10.3389/fclim.2019.00010), alternative: Breyer et al (2019).","0.4 MWh based on Beuttler et al (2019) for Climeworks LT DAC, alternative value: 0.182 MWh based on Breyer et al (2019). Should already include electricity for water scrubbing and compression (high quality CO2 output)." +direct air capture,heat-input,0,1.6,MWh_th/t_CO2,-,"Beuttler et al (2019): The Role of Direct Air Capture in Mitigation of Antropogenic Greenhouse Gas emissions (https://doi.org/10.3389/fclim.2019.00010), alternative: Breyer et al (2019).","Thermal energy demand. Provided via air-sourced heat pumps. 1.6 MWh based on Beuttler et al (2019) for Climeworks LT DAC, alternative value: 1.102 MWh based on Breyer et al (2019)." +dry bulk carrier Capesize,capacity,2020,180000,t,2020,-,"DWT; corresponds to size of Capesize bulk carriers which have previously docked at the habour in Hamburg, Germany. Short of 200 kt limit for VLBCs." +dry bulk carrier Capesize,investment,2020,40000000,EUR,2020,"Based on https://www.hellenicshippingnews.com/dry-bulk-carriers-in-high-demand-as-rates-keep-rallying/, accessed: 2022-12-03.","See figure for β€˜Dry Bulk Newbuild Prices’, Capesize at end of 2020. Exchange rate: 1.15 USD = 1 EUR." +dry bulk carrier Capesize,FOM,2020,4,%/year,2020,"Based on https://www.hellenicshippingnews.com/capesize-freight-returns-below-operating-expense-levels-but-shipowners-reject-lay-ups/, accessed: 2022-12-03.","5000 USD/d OPEX, exchange rate: 1.15 USD = 1 EUR; absolute value calculate relative to investment cost." +dry bulk carrier Capesize,lifetime,2020,25,years,2020,"Based on https://mfame.guru/fall-life-expectancy-bulk-carriers/, accessed: 2022-12-03.",Expected lifetime. +hydrogen direct iron reduction furnace,investment,2020,4277858,EUR/t_HBI/h,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.","488.34 EUR/t_HBI output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜DRI-EAF_100% green H2’, substract β€˜EAF’ CAPEX here to estimate DRI furnace cost." +hydrogen direct iron reduction furnace,FOM,2020,11.3,%/year,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.","55.28 EUR/t_HBI output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜DRI-EAF_100% green H2’, substract β€˜EAF’ OPEX here to estimate DRI furnace cost." +hydrogen direct iron reduction furnace,lifetime,2020,40,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.",MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime. +hydrogen direct iron reduction furnace,economic_lifetime,2020,20,years,2020,"Mission Possible Partnership (2022): Steel Model Documentation (https://mpp.gitbook.io/mpp-steel-model/model-overview/model-components/technologies, accessed: 2025-04-15).", +hydrogen direct iron reduction furnace,electricity-input,2020,1.03,MWh_el/t_hbi,2020,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2022-12-03).",Based on process β€˜DRI-EAF_100% green H2’ reduced by electricity demand of process β€˜EAF’. +hydrogen direct iron reduction furnace,hydrogen-input,2020,2.1,MWh_H2/t_hbi,2020,"Mission Possible Partnership (2022): Steel Model Documentation (https://mpp.gitbook.io/mpp-steel-model/model-overview/model-components/technologies, accessed: 2022-12-05). ","63 kg H2/t steel for process β€˜DRI-EAF_100% green H2’ according to documentation (raw input files for MPP model list 73 kg H2 / t steel, which seems to high and is probably incorrect)." +hydrogen direct iron reduction furnace,ore-input,2020,1.59,t_ore/t_hbi,2020,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2022-12-03). ",Based on process β€˜DRI-EAF_100% green H2’. +natural gas direct iron reduction furnace,investment,2020,4277858,EUR/t_HBI/h,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2025-04-15.","488.34 EUR/t_HBI output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜DRI-EAF_100% green H2’, substract β€˜EAF’ CAPEX here to estimate DRI furnace cost." +natural gas direct iron reduction furnace,FOM,2020,11.3,%/year,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2025-04-15.", +natural gas direct iron reduction furnace,lifetime,2020,40,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2025-04-15.", +natural gas direct iron reduction furnace,economic_lifetime,2020,20,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.",MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime. +natural gas direct iron reduction furnace,gas-input,2020,2.78,MWh_NG/t_hbi,2020,"Mission Possible Partnership (2022): Steel Model Documentation (https://mpp.gitbook.io/mpp-steel-model/model-overview/model-components/technologies, accessed: 2025-04-15). ",Original value 10 GJ/t_DRI. +natural gas direct iron reduction furnace,ore-input,2020,1.59,t_ore/t_hbi,,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2025-04-15). ", +electric arc furnace,investment,2020,1839600,EUR/t_steel/h,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.",210 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜EAF’. +electric arc furnace,FOM,2020,30,%/year,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.","EAF has high OPEX of 62.99 EUR/year/t_steel, presumably because of electrode corrosion." +electric arc furnace,lifetime,2020,40,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.",MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime. +electric arc furnace,economic_lifetime,2020,20,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.", +electric arc furnace,electricity-input,2020,0.6395,MWh_el/t_steel,2020,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2022-12-03).",Based on process β€˜EAF’. +electric arc furnace,hbi-input,2020,1,t_hbi/t_steel,2020,-,Assume HBI instead of scrap as input.Scrap would require higher input (in tonnes) as steel content is lower. +electric arc furnace with hbi and scrap,investment,2020,1839600,EUR/t_steel/h,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.",210 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜EAF’. +electric arc furnace with hbi and scrap,FOM,2020,30,%/year,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.","EAF has high OPEX of 62.99 EUR/year/t_steel, presumably because of electrode corrosion." +electric arc furnace with hbi and scrap,lifetime,2020,40,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.",MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime. +electric arc furnace with hbi and scrap,economic_lifetime,2020,20,years,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2022-12-05.", +electric arc furnace with hbi and scrap,electricity-input,2020,0.6395,MWh_el/t_steel,2020,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2022-12-03).",Based on process β€˜EAF’. +electric arc furnace with hbi and scrap,hbi-input,2020,0.37,t_hbi/t_steel,2020,"World Steel Association, Fact Sheet – Steel and raw materials: https://worldsteel.org/wp-content/uploads/Fact-sheet-raw-materials-2023-1.pdf, Accessed 2024-04-17.",Assume HBI instead of scrap as input.Scrap would require higher input (in tonnes) as steel content is lower. +electric arc furnace with hbi and scrap,scrap-input,2020,0.71,t_scrap/t_steel,2020,"World Steel Association, Fact Sheet – Steel and raw materials: https://worldsteel.org/wp-content/uploads/Fact-sheet-raw-materials-2023-1.pdf, Accessed 2024-04-17.", +shipping fuel methanol,fuel,2020,72,EUR/MWh_th,2020,"Based on (source 1) Hampp et al (2022), https://arxiv.org/abs/2107.01092, and (source 2): https://www.methanol.org/methanol-price-supply-demand/; both accessed: 2022-12-03.",400 EUR/t assuming range roughly in the long-term range for green methanol (source 1) and late 2020+beyond values for grey methanol (source 2). +shipping fuel methanol,CO2 intensity,2020,0.2482,t_CO2/MWh_th,2020,-,Based on stochiometric composition. +iron ore DRI-ready,commodity,2020,97.73,EUR/t,2020,"Model assumptions from MPP Steel Transition Tool: https://missionpossiblepartnership.org/action-sectors/steel/, accessed: 2022-12-03.","DRI ready assumes 65% iron content, requiring no additional benefication." +offwind-float,investment,2030,2350,EUR/kWel,2020,https://doi.org/10.1016/j.adapen.2021.100067, +offwind-float,FOM,2030,1.15,%/year,2020,https://doi.org/10.1016/j.adapen.2021.100067, +offwind-float,lifetime,2020,20,years,2020,C. Maienza 2020 A life cycle cost model for floating offshore wind farms, +offwind-float,investment,2040,1960,EUR/kWel,2020,https://doi.org/10.1016/j.adapen.2021.100067, +offwind-float,FOM,2040,1.22,%/year,2020,https://doi.org/10.1016/j.adapen.2021.100067, +offwind-float,investment,2050,1580,EUR/kWel,2020,https://doi.org/10.1016/j.adapen.2021.100067, +offwind-float,FOM,2050,1.39,%/year,2020,https://doi.org/10.1016/j.adapen.2021.100067, +offwind-float-station,investment,2030,400,EUR/kWel,2017,Haertel 2017, assuming one onshore and one offshore node + 13% learning reduction +offwind-float-connection-submarine,investment,2030,2000,EUR/MW/km,2014,DTU report based on Fig 34 of https://ec.europa.eu/energy/sites/ener/files/documents/2014_nsog_report.pdf, +offwind-float-connection-underground,investment,2030,1000,EUR/MW/km,2017,Haertel 2017, average + 13% learning reduction +nuclear,investment,2020,10275,EUR/kW_e,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","U.S. specific costs including newly commissioned Vogtle plant, average of range and currency converted, i.e. (8475+13925)/2 USD/kW_e / (1.09 USD/EUR) ." +nuclear,FOM,2020,1.27,%/year,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","U.S. specific costs including newly commissioned Vogtle plant, average of range and currency converted, i.e. (131.5+152.75)/2 USD/kW_e / (1.09 USD/EUR) relative to investment costs." +nuclear,VOM,2020,4.24,EUR/MWh_e,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","U.S. specific costs including newly commissioned Vogtle plant, average of range and currency converted, i.e. (4.25+5)/2 USD/kW_e / (1.09 USD/EUR) ." +nuclear,lifetime,2020,40,years,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.", +nuclear,efficiency,2020,0.326,p.u.,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Based on heat rate of 10.45 MMBtu/MWh_e and 3.4095 MMBtu/MWh_th, i.e. 1/(10.45/3.4095) = 0.3260." +nuclear,fuel,2020,3,EUR/MWh_th,2010,"DIW (2013): Current and propsective costs of electricity generation until 2050, http://hdl.handle.net/10419/80348 , pg. 80 text below figure 10, accessed: 2023-12-14.",Based on IEA 2011 data. +uranium,fuel,2020,3,EUR/MWh_th,2010,"DIW (2013): Current and propsective costs of electricity generation until 2050, http://hdl.handle.net/10419/80348 , pg. 80 text below figure 10, accessed: 2023-12-14.",Based on IEA 2011 data. +coal,investment,2020,4575.69,EUR/kW_e,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Higher costs include coal plants with CCS, but since using here for calculating the average nevertheless. Calculated based on average of listed range, i.e. (3200+6775) USD/kW_e/2 / (1.09 USD/EUR)." +coal,FOM,2020,1.31,%/year,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Calculated based on average of listed range, i.e. (39.5+91.25) USD/kW_e/a /2 / (1.09 USD/EUR) / investment cost * 100." +coal,VOM,2020,3.89908256880734,EUR/MWh_e,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Calculated based on average of listed range, i.e. (3+5.5)USD/MWh_e/2 / (1.09 USD/EUR)." +coal,lifetime,2020,40,years,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.", +coal,efficiency,2020,0.356,p.u.,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Calculated based on average of listed range, i.e. 1 / ((8.75+12) MMbtu/MWh_th /2 / (3.4095 MMbtu/MWh_th)), rounded up." +coal,fuel,2020,8.4,EUR/MWh_th,2010,"DIW (2013): Current and propsective costs of electricity generation until 2050, http://hdl.handle.net/10419/80348 , pg. 80 text below figure 10, accessed: 2023-12-14.","Based on IEA 2011 data, 99 USD/t." +lignite,investment,2020,4575.69,EUR/kW_e,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Higher costs include coal plants with CCS, but since using here for calculating the average nevertheless. Calculated based on average of listed range, i.e. (3200+6775) USD/kW_e/2 / (1.09 USD/EUR). Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf ." +lignite,FOM,2020,1.31,%/year,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Calculated based on average of listed range, i.e. (39.5+91.25) USD/kW_e/a /2 / (1.09 USD/EUR) / investment cost * 100. Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . " +lignite,VOM,2020,3.89908256880734,EUR/MWh_e,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Calculated based on average of listed range, i.e. (3+5.5)USD/MWh_e/2 / (1.09 USD/EUR). Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . " +lignite,lifetime,2020,40,years,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . " +lignite,efficiency,2020,0.33,p.u.,2023,"Lazard's levelized cost of energy analysis - version 16.0 (2023): https://www.lazard.com/media/typdgxmm/lazards-lcoeplus-april-2023.pdf , pg. 49 (Levelized Cost of Energy - Key Assumptions), accessed: 2023-12-14.","Calculated based on average of listed range, i.e. 1 / ((8.75+12) MMbtu/MWh_th /2 / (3.4095 MMbtu/MWh_th)), rounded up. Note: Assume same costs as for hard coal, as cost structure is apparently comparable, see https://diglib.tugraz.at/download.php?id=6093e88b63f93&location=browse and https://iea.blob.core.windows.net/assets/ae17da3d-e8a5-4163-a3ec-2e6fb0b5677d/Projected-Costs-of-Generating-Electricity-2020.pdf . " +lignite,fuel,2020,2.9,EUR/MWh_th,2010,"DIW (2013): Current and propsective costs of electricity generation until 2050, http://hdl.handle.net/10419/80348 , pg. 80 text below figure 10, accessed: 2023-12-14.","Based on IEA 2011 data, 10 USD/t." +gas,fuel,2020,21.6,EUR/MWh_th,2010,"DIW (2013): Current and propsective costs of electricity generation until 2050, http://hdl.handle.net/10419/80348 , pg. 80 text below figure 10, accessed: 2023-12-14.",Based on IEA 2011 data. +organic rankine cycle,lifetime,2020,30,years,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551", +organic rankine cycle,electricity-input,2020,0.12,MWh_el/MWh_th,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551; Breede et al. 2015: Overcoming challenges in the classification of deep geothermal potential, https://eprints.gla.ac.uk/169585/","Heat-input, Electricity-output. This is a rough estimate, depends on input temperature, implies ~150 C." +organic rankine cycle,FOM,2020,2,%/year,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551","Both for flash, binary and ORC plants. See Supplemental Material for details" +organic rankine cycle,investment,2020,1376,EUR/kW_el,2020,Tartiere and Astolfi 2017: A world overview of the organic Rankine cycle market,"Low rollout complicates the estimation, compounded by a dependence both on plant size and temperature, converted from 1500 USD/kW using currency conversion 1.09 USD = 1 EUR." +geothermal,CO2 intensity,2020,0.12,tCO2/MWh_el,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551",Likely to be improved; Average of 85 percent of global egs power plant capacity; Result of fluid circulation through rock formations +geothermal,lifetime,2020,30,years,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551", +geothermal,district heat-input,2020,0.8,MWh_thdh/MWh_th,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551; Breede et al. 2015: Overcoming challenges in the classification of deep geothermal potential, https://eprints.gla.ac.uk/169585/","Heat-input, District Heat-output. This is an assessment of typical heat losses when heat is transmitted from the EGS plant to the DH network, This is a rough estimate, depends on local conditions" +geothermal,FOM,2020,2,%/year,2020,"Aghahosseini, Breyer 2020: From hot rock to useful energy: A global estimate of enhanced geothermal systems potential, https://www.sciencedirect.com/science/article/pii/S0306261920312551",See Supplemental Material of source for details +geothermal,district heat surcharge,2020,25,%,2020,Frey et al. 2022: Techno-Economic Assessment of Geothermal Resources in the Variscan Basement of the Northern Upper Rhine Graben,"If capital cost of electric generation from EGS is 100%, district heating adds additional 25%. Costs incurred by piping." +electrolysis,investment,2020,2000,EUR/kW_e,2020,private communications; IEA https://iea.blob.core.windows.net/assets/9e0c82d4-06d2-496b-9542-f184ba803645/TheRoleofE-fuelsinDecarbonisingTransport.pdf, +electrolysis,investment,2025,1800,EUR/kW_e,2020,private communications; IEA https://iea.blob.core.windows.net/assets/9e0c82d4-06d2-496b-9542-f184ba803645/TheRoleofE-fuelsinDecarbonisingTransport.pdf, +electrolysis,investment,2030,1500,EUR/kW_e,2020,private communications; IEA https://iea.blob.core.windows.net/assets/9e0c82d4-06d2-496b-9542-f184ba803645/TheRoleofE-fuelsinDecarbonisingTransport.pdf, +electrolysis,investment,2040,1200,EUR/kW_e,2020,private communications; IEA https://iea.blob.core.windows.net/assets/9e0c82d4-06d2-496b-9542-f184ba803645/TheRoleofE-fuelsinDecarbonisingTransport.pdf, +electrolysis,investment,2050,1000,EUR/kW_e,2020,private communications; IEA https://iea.blob.core.windows.net/assets/9e0c82d4-06d2-496b-9542-f184ba803645/TheRoleofE-fuelsinDecarbonisingTransport.pdf, +bioethanol crops,fuel,2020,54.6434100368518,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOCRP11 (Bioethanol barley, wheat, grain maize, oats, other cereals and rye), ENS_BaU_GFTM", +bioethanol crops,fuel,2030,72.477665790641,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOCRP11 (Bioethanol barley, wheat, grain maize, oats, other cereals and rye), ENS_BaU_GFTM", +bioethanol crops,fuel,2040,75.7178710725453,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOCRP11 (Bioethanol barley, wheat, grain maize, oats, other cereals and rye), ENS_BaU_GFTM", +bioethanol crops,fuel,2050,78.995541440487,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOCRP11 (Bioethanol barley, wheat, grain maize, oats, other cereals and rye), ENS_BaU_GFTM", +bioethanol crops,CO2 intensity,2020,0.12894,tCO2/MWh_th,,,"CO2 released during fermentation of bioethanol crops, based on stochiometric composition: C6H12O6 -> 2 C2H5OH + 2 CO2 , i.e. 1 kg ethanol β†’ ~0.956 kg COβ‚‚ (from fermentation) β†’ 0.1289 tCOβ‚‚/MWh (with LHV = 26.7 MJ/kg)." +biodiesel crops,fuel,2020,84.585016773297,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIORPS1 (rape seed), ENS_BaU_GFTM", +biodiesel crops,fuel,2030,121.021431275337,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIORPS1 (rape seed), ENS_BaU_GFTM", +biodiesel crops,fuel,2040,120.926387801857,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIORPS1 (rape seed), ENS_BaU_GFTM", +biodiesel crops,fuel,2050,115.905289026151,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIORPS1 (rape seed), ENS_BaU_GFTM", +biogas manure,fuel,2020,17.3705908155502,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOGAS1 (manure), ENS_BaU_GFTM", +biogas manure,fuel,2030,17.4674555553638,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOGAS1 (manure), ENS_BaU_GFTM", +biogas manure,fuel,2040,17.4767827669554,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOGAS1 (manure), ENS_BaU_GFTM", +biogas manure,fuel,2050,17.5404377813252,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOGAS1 (manure), ENS_BaU_GFTM", +fuelwood,fuel,2020,14.066770723441,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOWOO (FuelwoodRW), ENS_BaU_GFTM", +fuelwood,fuel,2030,12.767964974663,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOWOO (FuelwoodRW), ENS_BaU_GFTM", +fuelwood,fuel,2040,11.5992033141145,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOWOO (FuelwoodRW), ENS_BaU_GFTM", +fuelwood,fuel,2050,10.5474097062402,EUR/MWhth,2010,"JRC ENSPRESO ca avg for MINBIOWOO (FuelwoodRW), ENS_BaU_GFTM", +allam,investment,2030,1500,EUR/kW,2020,Own assumption. TODO: Find better technology data and cost assumptions, +allam,VOM,2030,2,EUR/MWh,2020,Own assumption. TODO: Find better technology data and cost assumptions, +allam,efficiency,2030,0.6,p.u.,2020,Own assumption. TODO: Find better technology data and cost assumptions, +allam,lifetime,2030,30,years,2020,Own assumption. TODO: Find better technology data and cost assumptions, +iron-air battery,FOM,2025,1.02185373078457,%/year,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,FOM,2030,1,%/year,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,FOM,2035,1.10628646943421,%/year,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,FOM,2040,1.1807773334732,%/year,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,investment,2025,30.05,EUR/kWh,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,investment,2030,20,EUR/kWh,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,investment,2035,15.11,EUR/kWh,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,investment,2040,13.33,EUR/kWh,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery charge,efficiency,2025,0.7,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery charge,efficiency,2030,0.71,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery charge,efficiency,2035,0.73,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery charge,efficiency,2040,0.74,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery discharge,efficiency,2025,0.59,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery discharge,efficiency,2030,0.6,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery discharge,efficiency,2035,0.62,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery discharge,efficiency,2040,0.63,per unit,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +iron-air battery,lifetime,2030,17.5,years,2023,"Form Energy, docu/FormEnergy_Europe_modeling_recommendations_2023.03.pdf, p4", +blast furnace-basic oxygen furnace,investment,2020,7637406,EUR/t_steel/h,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2025-04-15.",871.85 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜Avg BF-BOF’. +blast furnace-basic oxygen furnace,FOM,2020,14.18,%/year,2020,"Model assumptions from MPP Steel Transition Tool: https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/CAPEX%20OPEX%20Per%20Technology.xlsx, accessed: 2025-04-15.",123.67 EUR/t_steel output/a. MPP steel tool uses CAPEX/OPEX for technology β€˜BF-BOF’. +blast furnace-basic oxygen furnace,lifetime,2020,40,years,2020,"Mission Possible Partnership (2022): Steel Model Documentation (https://mpp.gitbook.io/mpp-steel-model/model-overview/model-components/technologies, accessed: 2025-04-15).",MPP steel model distinguishes between plant lifetime (40 years) and investment cycle (20 years). Choose plant lifetime. +blast furnace-basic oxygen furnace,economic_lifetime,2020,20,years,2020,"Mission Possible Partnership (2022): Steel Model Documentation (https://mpp.gitbook.io/mpp-steel-model/model-overview/model-components/technologies, accessed: 2025-04-15).", +blast furnace-basic oxygen furnace,coal-input,2020,1.43,MWh_coal/t_steel,2020,"Mission Possible Partnership (2022): Steel Model Documentation (https://mpp.gitbook.io/mpp-steel-model/model-overview/model-components/technologies, accessed: 2025-04-15). ","Based on process β€˜Avg BF-BOF` using 195 kg_PCI/t_HM (PCI = Pulverized Coal Injected; HM = Hot Metal) as substitute for coke, 24 MJ/kg as LHV for coal and 1 : 1.1 as HM-to-steel ratio." +blast furnace-basic oxygen furnace,ore-input,2020,1.539,t_ore/t_steel,2020,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2025-04-15). ",Based on process β€˜Avg BF-BOF` +blast furnace-basic oxygen furnace,scrap-input,2020,0.051,t_scrap/t_steel,2020,"Mission Possible Partnership (2022): Steel Model (https://github.com/missionpossiblepartnership/mpp-steel-model/blob/9eca52db92bd2d9715f30e98ccaaf36677fdb516/mppsteel/data/import_data/Technology%20Business%20Cases.csv, accessed: 2025-04-15). ",Based on process β€˜Avg BF-BOF` +cement dry clinker,investment,2006,1095000,EUR/t_clinker/h,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Original value 125 EUR/t/year +cement dry clinker,FOM,2006,4,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.", +cement dry clinker,VOM,2006,5,EUR/t_clinker,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.", +cement dry clinker,lifetime,2006,30,years,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.", +cement dry clinker,gas-input,2006,0.00016,MWh_NG/t_clinker,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Original values 0.0058 PJ per Mt clinker +cement dry clinker,electricity-input,2006,0.0694,MWh_el/t_clinker,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Original values 0.25 PJ per Mt clinker +cement dry clinker,heat-input,2006,0.9444,MWh_th/t_CO2,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `IND` (ICMDRYPRD01, ICM.Dry Process Production.01) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Original values 3.4 PJ per Mt clinker +cement finishing,investment,2006,87600,EUR/t_cement/h,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Original value 10 EUR/t/year +cement finishing,FOM,2006,30,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.", +cement finishing,VOM,2006,3,EUR/t_cement,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.", +cement finishing,electricity-input,2006,0.1736,MWh_el/t_cement,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND_Trans.xlsx`, Sheet `IND_Trans` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Based on inputs for DE (major EU producer) with original value 0.6251 PJ per Mt cement. +cement finishing,clinker-input,2006,0.656,t_cl/t_cement,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND_Trans.xlsx`, Sheet `IND_Trans` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Based on inputs for DE (major EU producer) +cement finishing,slag-input,2006,0.194,t_slag/t_cement,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND_Trans.xlsx`, Sheet `IND_Trans` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Based on inputs for DE (major EU producer) +cement finishing,lifetime,2006,25,years,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx` (ICMFINPRO01, Cement finishing) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Based on inputs for DE (major EU producer) +ethanol from starch crop,investment,2010,819630,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from starch crop,investment,2020,677090,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from starch crop,investment,2025,614720,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from starch crop,investment,2030,570180,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from starch crop,FOM,2010,11.4,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from starch crop,FOM,2020,13.8,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from starch crop,FOM,2025,15.2,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from starch crop,FOM,2030,16.4,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from starch crop,VOM,2010,24.9,EUR/MWh_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value 6.93 MEUR/PJ VAROM" +ethanol from starch crop,lifetime,2010,20,years,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Suited for USA and European production +ethanol from starch crop,efficiency,2010,0.58,p.u.,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH101, Ethanol production from starch crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production. Converted from 0.35 t_crop/t_eth, LHV_crop = 16.1 GJ/t, LHV_ethanol = 26.7 GJ/t" +ethanol from sugar crops,investment,2010,659330,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from sugar crops,investment,2020,501090,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from sugar crops,investment,2025,454930,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from sugar crops,investment,2030,421970,EUR/MW_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original value INVCOST in MEUR/GW" +ethanol from sugar crops,FOM,2010,13.57,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from sugar crops,FOM,2020,16.43,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from sugar crops,FOM,2025,18.09,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from sugar crops,FOM,2030,19.51,%/year,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for USA and European production, original values FIXOM in MEUR/GW divided by INVCOST for the corresponding year" +ethanol from sugar crops,VOM,2010,21.9,EUR/MWh_eth,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for Brazilian production, original value 6.09 MEUR/PJ VAROM" +ethanol from sugar crops,lifetime,2010,20,years,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.",Suited for Brazilian production +ethanol from sugar crops,efficiency,2010,0.45,p.u.,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_10_TECHS_CHP_SUP_IND.xlsx`, Sheet `SUP` (BCRPETH201, Ethanol production from sugar crops ) and currency year from file `SysSettings.xls`, sheet `Constants`, Attribute `G_Dyear` = 2015.","Suited for Brazilian production. Converted from 0.292 t_crop/t_eth, LHV_crop = 16.1 GJ/t, LHV_ethanol = 26.7 GJ/t" +ethanol carbon capture retrofit,FOM,2030,7,%/year,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +ethanol carbon capture retrofit,capture_rate,2030,0.94,per unit,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-16, accessed 2025-04-16", +ethanol carbon capture retrofit,electricity-input,2030,0.12,MWh/tCO2,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-20, accessed 2025-04-16", +ethanol carbon capture retrofit,investment,2030,922105,USD/(tCO2/h),2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-18, accessed 2025-04-16","Capital cost 36 million USD, CO2 Volume captured 342000 t/year" +ethanol carbon capture retrofit,lifetime,2030,20,years,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +ammonia carbon capture retrofit,FOM,2030,5,%/year,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +ammonia carbon capture retrofit,capture_rate,2030,0.99,per unit,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-16, accessed 2025-04-16",CO2 volume captured / (Stream flowrate * Max. capacity utilization * CO2 in exhaust * 8760) +ammonia carbon capture retrofit,electricity-input,2030,0.1,MWh/tCO2,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-20, accessed 2025-04-16", +ammonia carbon capture retrofit,investment,2030,923290,USD/(tCO2/h),2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-18, accessed 2025-04-16","Capital cost 41 million USD, CO2 Volume captured 389000 t/year" +ammonia carbon capture retrofit,lifetime,2030,20,years,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +cement carbon capture retrofit,FOM,2030,7,%/year,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +cement carbon capture retrofit,capture_rate,2030,0.9,per unit,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-16, accessed 2025-04-16",CO2 volume captured / (Stream flowrate * Max. capacity utilization * CO2 in exhaust * 8760) +cement carbon capture retrofit,electricity-input,2030,0.16,MWh/tCO2,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-20, accessed 2025-04-16", +cement carbon capture retrofit,gas-input,2030,0.76,MWh/tCO2,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-20, accessed 2025-04-16", +cement carbon capture retrofit,investment,2030,2569739,USD/(tCO2/h),2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-18, accessed 2025-04-16","Capital cost 247 million USD, CO2 Volume captured 842000 t/year" +cement carbon capture retrofit,lifetime,2030,20,years,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +steel carbon capture retrofit,FOM,2030,5,%/year,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +steel carbon capture retrofit,capture_rate,2030,0.9,per unit,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-16, accessed 2025-04-16",CO2 volume captured / (Stream flowrate * Max. capacity utilization * CO2 in exhaust * 8760) +steel carbon capture retrofit,electricity-input,2030,0.16,MWh/tCO2,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-20, accessed 2025-04-16", +steel carbon capture retrofit,gas-input,2030,0.76,MWh/tCO2,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-20, accessed 2025-04-16", +steel carbon capture retrofit,investment,2030,3536679,USD/(tCO2/h),2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-18, accessed 2025-04-16","Capital cost 1342 million USD, CO2 Volume captured 3324000 t/year" +steel carbon capture retrofit,lifetime,2030,20,years,2019,"National Petroleum Council, Meeting the Dual Challenge - A Roadmap to At-Scale Deployment of Carbon Capture, Use, and Storage: https://dualchallenge.npc.org/files/CCUS-Chap_2-030521.pdf, p2-21, accessed 2025-04-16", +Alkaline electrolyzer large size,lifetime,2020,40,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,electricity-input,2020,1.5,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,electricity-input,2025,1.38,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,FOM,2020,6.4,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,FOM,2030,2.8,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,investment,2020,625.9,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,investment,2025,377.2,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,investment,2030,377.2,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,VOM,2020,0.54,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer large size,VOM,2025,0.21,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC01, H2 Production-Alkaline Electrolyser, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 72 MW +Alkaline electrolyzer medium size,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,electricity-input,2020,1.633,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,electricity-input,2025,1.633,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,electricity-input,2025,1.416,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,FOM,2020,18.1,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,FOM,2025,18.1,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,FOM,2030,2.3,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,investment,2020,497.7,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,investment,2025,497.7,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,investment,2030,444.9,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer medium size,VOM,2020,0.21,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2EC02, H2 Production-Alkaline Electrolyser, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 33 MW +Alkaline electrolyzer small size,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,electricity-input,2020,1.62,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,electricity-input,2025,1.62,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,electricity-input,2025,1.41,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,FOM,2020,18.1,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,FOM,2025,18.1,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,FOM,2030,2.3,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,investment,2020,865.9,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,investment,2025,865.9,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,investment,2030,512.5,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,VOM,2020,0.96,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,investment,2025,512.5,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +Alkaline electrolyzer small size,VOM,2030,0.17,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2ED01, H2 Production-Alkaline Electrolyser, small size, decentralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 0.6 MW +PEM electrolyzer small size,lifetime,2020,6,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`","Likely stack lifetime, rather than electrolyzer system lifetime" +PEM electrolyzer small size,lifetime,2030,7,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`","Likely stack lifetime, rather than electrolyzer system lifetime" +PEM electrolyzer small size,lifetime,2050,9,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`","Likely stack lifetime, rather than electrolyzer system lifetime" +PEM electrolyzer small size,electricity-input,2020,1.43,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 1 MW +PEM electrolyzer small size,electricity-input,2030,1.33,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 1 MW +PEM electrolyzer small size,electricity-input,2050,1.25,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 1 MW +PEM electrolyzer small size,FOM,2020,3,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 1 MW +PEM electrolyzer small size,investment,2020,1200,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 1 MW +PEM electrolyzer small size,investment,2030,950,EUR/kW,2015,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SELCH2PEM01, H2 Production-Proton Exchange Membrane) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`",Reference capacity 1 MW +SOEC,lifetime,2020,30,years,-,ICCT IRA e-fuels assumptions , +SOEC,electricity-input,2020,1.22,MWh_el/MWh_H2,-,ICCT IRA e-fuels assumptions , +SOEC,electricity-input,2030,1.19,MWh_el/MWh_H2,-,ICCT IRA e-fuels assumptions , +SOEC,electricity-input,2040,1.15,MWh_el/MWh_H2,-,ICCT IRA e-fuels assumptions , +SOEC,electricity-input,2050,1.11,MWh_el/MWh_H2,-,ICCT IRA e-fuels assumptions , +SOEC,investment,2020,2651,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",US-based assumptions for a Conservative cost scenario +SOEC,investment,2030,2521,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",US-based assumptions for a Conservative cost scenario +SOEC,investment,2040,2398,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",US-based assumptions for a Conservative cost scenario +SOEC,investment,2050,2281,USD/kW,2022,"ICCT IRA e-fuels assumptions, https://theicct.org/wp-content/uploads/2022/02/fuels-eu-cost-renew-H-produced-onsite-H-refueling-stations-europe-feb22.pdf adjusted according to DOE observations https://www.hydrogen.energy.gov/docs/hydrogenprogramlibraries/pdfs/24005-clean-hydrogen-production-cost-pem-electrolyzer.pdf?sfvrsn=8cb10889_1#:~:text=This%20Record%20shows%20that%20the,factors%20of%2050%2D75%25",US-based assumptions for a Conservative cost scenario +SOEC,FOM,2020,4,%/year,2022,ICCT IRA e-fuels assumptions ,US-based assumptions for a Conservative cost scenario +H2 production natural gas steam reforming,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,gas-input,2020,1.32,MWh_NG/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,gas-input,2025,1.32,MWh_NG/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,gas-input,2030,1.25,MWh_NG/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,electricity-input,2020,0.02,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,FOM,2020,4.9,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,investment,2020,201.2,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,investment,2025,201.2,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,investment,2030,158.3,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,VOM,2020,0.29,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming,VOM,2030,0.18,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RC01, H2 Production-Methane Steam Reforming, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,coal-input,2020,1.77,MWh_coal/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,coal-input,2025,1.77,MWh_coal/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,coal-input,2030,1.62,MWh_coal/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,electricity-input,2020,0.07,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,electricity-input,2025,0.07,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,electricity-input,2030,0.02,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,FOM,2020,5.9,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,FOM,2025,5.9,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,FOM,2050,6.4,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,investment,2020,462.5,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,investment,2025,462.5,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,investment,2030,350.9,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,VOM,2020,0.587,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,VOM,2025,0.587,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification,VOM,2030,0.445,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GC01, H2 Production-Coal Gasification, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production heavy oil partial oxidation,lifetime,2020,25,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SHFOH2POC01, H2 Production-Central PO of Heavy Oil (CPO3)) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production heavy oil partial oxidation,oil-input,2020,1.3,MWh_oil/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SHFOH2POC01, H2 Production-Central PO of Heavy Oil (CPO3)) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production heavy oil partial oxidation,electricity-input,2020,0.063,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SHFOH2POC01, H2 Production-Central PO of Heavy Oil (CPO3)) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production heavy oil partial oxidation,FOM,2020,5,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SHFOH2POC01, H2 Production-Central PO of Heavy Oil (CPO3)) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production heavy oil partial oxidation,investment,2020,431.8,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SHFOH2POC01, H2 Production-Central PO of Heavy Oil (CPO3)) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production heavy oil partial oxidation,VOM,2020,0.14,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SHFOH2POC01, H2 Production-Central PO of Heavy Oil (CPO3)) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production solid biomass steam reforming,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2RC01, H2 Production-Biomass Steam Reforming, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production solid biomass steam reforming,wood-input,2020,1.36,MWh_wood/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2RC01, H2 Production-Biomass Steam Reforming, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production solid biomass steam reforming,electricity-input,2020,0.044,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2RC01, H2 Production-Biomass Steam Reforming, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production solid biomass steam reforming,FOM,2020,4,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2RC01, H2 Production-Biomass Steam Reforming, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production solid biomass steam reforming,investment,2020,519.3,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2RC01, H2 Production-Biomass Steam Reforming, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production solid biomass steam reforming,VOM,2020,0.65,EUR/MWh,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2RC01, H2 Production-Biomass Steam Reforming, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GC01, H2 Production-Biomass Gasification, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification,wood-input,2020,1.804,MWh_wood/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GC01, H2 Production-Biomass Gasification, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification,electricity-input,2020,0.097,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GC01, H2 Production-Biomass Gasification, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification,FOM,2020,5,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GC01, H2 Production-Biomass Gasification, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification,investment,2020,1290.6,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GC01, H2 Production-Biomass Gasification, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification,VOM,2020,0.45,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GC01, H2 Production-Biomass Gasification, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,gas-input,2020,1.52,MWh_NG/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,gas-input,2025,1.52,MWh_NG/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,gas-input,2030,1.4,MWh_NG/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,electricity-input,2020,0.05,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,electricity-input,2025,0.05,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,electricity-input,2030,0.039,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,FOM,2020,5.2,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,FOM,2025,5.2,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,FOM,2030,6,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,investment,2020,272.8,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,investment,2025,272.8,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,investment,2030,191.3,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,VOM,2020,0.53,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production natural gas steam reforming CC,VOM,2030,0.07,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SGASH2RCC01, H2 Production-Methane Steam Reforming + Carbon Capture, large size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,coal-input,2020,1.77,MWh_coal/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,coal-input,2025,1.77,MWh_coal/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,coal-input,2030,1.62,MWh_coal/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,electricity-input,2020,0.111,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,electricity-input,2025,0.111,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,electricity-input,2030,0.023,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,FOM,2020,7.9,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,FOM,2025,7.9,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,FOM,2050,6.2,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,investment,2020,520.4,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,investment,2025,520.4,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,investment,2030,363.5,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,VOM,2020,0.2,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,VOM,2025,0.2,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production coal gasification CC,VOM,2030,0.13,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SCOAH2GCC01, H2 Production-Coal Gasification + Carbon Capture, big size, centralized and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification CC,lifetime,2020,20,years,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GCC01, H2 Production-Biomass Gasification + Carbon Capture, medium size, centralized, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification CC,wood-input,2020,1.804,MWh_wood/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GCC01, H2 Production-Biomass Gasification + Carbon Capture, medium size, centralized, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification CC,electricity-input,2020,0.143,MWh_el/MWh_H2,-,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GCC01, H2 Production-Biomass Gasification + Carbon Capture, medium size, centralized, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification CC,FOM,2020,5,%/year,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GCC01, H2 Production-Biomass Gasification + Carbon Capture, medium size, centralized, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification CC,investment,2020,1309.2,EUR/kW,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GCC01, H2 Production-Biomass Gasification + Carbon Capture, medium size, centralized, medium size, centralized) and currency year from file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", +H2 production biomass gasification CC,VOM,2020,0.46,EUR/MWh_H2,2010,"JRC, 01_JRC-EU-TIMES Full model, https://zenodo.org/records/3544900, file `SubRES_15_TECHS_HYDROGEN.xlsx` (SBIOH2GCC01, H2 Production-Biomass Gasification + Carbon Capture, medium size, centralized, medium size, centralized) and currency year from file file `SubRES_15_TECHS_HYDROGEN.xlsx`, Sheet `INPUT-Data(HP)`", diff --git a/src/technologydata/parsers/raw/manual_input_usa.csv b/src/technologydata/parsers/raw/legacy_input_data/usa.csv similarity index 100% rename from src/technologydata/parsers/raw/manual_input_usa.csv rename to src/technologydata/parsers/raw/legacy_input_data/usa.csv diff --git a/src/technologydata/utils/carriers.txt b/src/technologydata/utils/carriers.txt index ce376cb1..3cc02194 100644 --- a/src/technologydata/utils/carriers.txt +++ b/src/technologydata/utils/carriers.txt @@ -17,19 +17,33 @@ ammonia = [ammonia] = NH3 carbon = [carbon] = C carbon_dioxide = [carbon_dioxide] = CO2 carbon_monoxide = [carbon_monoxide] = CO +cement = [portland_cement] +clinker = [clinker] coal = [coal] = anthracite = hard_coal = black_coal +dehydrogenated_dibenzyltoluene = [dehydrogenated_dibenzyltoluene]= H0DBT diesel = [diesel] +electricity = [electricity] = e = el +ethanol = [ethanol] = eth = C2H5OH fischer_tropsch = [fischer_tropsch] = FT = FTF = fischer_tropsch_fuel gasoline = [gasoline] = petrol jet_fuel_a1 = [jet_fuel_a1] = JETA1 -electricity = [electricity] = e = el +kerosene = [kerosene] hydrogen = [hydrogen] = H2 +hydrogenated_dibenzyltoluene = [hydrogenated_dibenzyltoluene] = H18DBT +hot_briquetted_iron = [hot_briquetted_iron] = HBI +high_value_chemicals = [high_value_chemicals] = HVC lignite = [lignite] methane = [methane] = CH4 methanol = [methanol] = CH3OH = MeOH +naphtha = [naphtha] natural_gas = [natural_gas] = NG nitrogen = [nitrogen] = N2 +oil = [oil] +ore = [ore] oxygen = [oxygen] = O2 +scrap = [scrap] +steel = [steel] +slag = [slag] thermal = [thermal] = th water = [water] = H2O wood = [wood] diff --git a/test/test_docs.py b/test/test_docs.py index 2a588369..db98edc0 100644 --- a/test/test_docs.py +++ b/test/test_docs.py @@ -22,7 +22,7 @@ DOCS_DIR = Path(__file__).parent.parent / "docs" # Every dataset fact sheet is tested, so their tables stay in sync with the data. -DOCS = [DOCS_DIR / "tutorial" / "index.md"] + sorted( +DOCS = [DOCS_DIR / "overview.md", DOCS_DIR / "tutorial" / "index.md"] + sorted( p for p in (DOCS_DIR / "datasets").glob("*.md") if p.name != "index.md" ) diff --git a/test/test_legacy_parser_v0134.py b/test/test_legacy_parser_v0134.py new file mode 100644 index 00000000..c763fb09 --- /dev/null +++ b/test/test_legacy_parser_v0134.py @@ -0,0 +1,103 @@ +# SPDX-FileCopyrightText: technologydata contributors +# +# SPDX-License-Identifier: MIT + +"""Test the functions of the legacy data parser.""" + +import pytest + +from technologydata.parsers.legacy_input_data import LegacyInputDataV0134Parser + + +class TestLegacyDataParserV0134: + """Test suite for the functions of the legacy data parser.""" + + @pytest.mark.parametrize( + ("input_unit", "expected_unit", "expected_carrier", "expected_heating"), + [ + ("USD_2022/MW_FT", "USD_2022/MW", "1/FT", "1/LHV"), + ("MWh_H2/MWh_FT", "MWh/MWh", "H2/FT", "LHV"), + ("MWh_el/MWh_FT", "MWh/MWh", "el/FT", "1/LHV"), + ("t_CO2/MWh_FT", "t/MWh", "CO2/FT", "1/LHV"), + ("USD_2022/kWh_H2", "USD_2022/kWh", "1/H2", "1/LHV"), + ("MWh_el/MWh_H2", "MWh/MWh", "el/H2", "1/LHV"), + ("USD_2023/t_CO2/h", "USD_2023/(t/h)", "1/CO2", None), + ("MWh_el/t_CO2", "MWh/t", "el/CO2", None), + ("MWh_th/t_CO2", "MWh/t", "thermal/CO2", None), + ("EUR/MW_FT", "EUR/MW", "1/FT", "1/LHV"), + ("EUR/MW_CH4", "EUR/MW", "1/CH4", "1/LHV"), + ("EUR/MW_H2", "EUR/MW", "1/H2", "1/LHV"), + ("EUR/MW_MeOH", "EUR/MW", "1/MeOH", "1/LHV"), + ("EUR/kW_CH4", "EUR/kW", "1/CH4", "1/LHV"), + ("EUR/kW_H2", "EUR/kW", "1/H2", "1/LHV"), + ("EUR/kWh_H2", "EUR/kWh", "1/H2", "1/LHV"), + ("EUR/MWh_H2", "EUR/MWh", "1/H2", "1/LHV"), + ("EUR/MWh_NH3", "EUR/MWh", "1/NH3", "1/LHV"), + ("EUR/MWh_kerosene", "EUR/MWh", "1/kerosene", "1/LHV"), + ("MWh_H2/MWh_CH4", "MWh/MWh", "H2/CH4", "LHV"), + ("MWh_H2/MWh_MeOH", "MWh/MWh", "H2/MeOH", "LHV"), + ("MWh_H2/MWh_NH3", "MWh/MWh", "H2/NH3", "LHV"), + ("MWh_H2/MWh_kerosene", "MWh/MWh", "H2/kerosene", "LHV"), + ("MWh_NH3/MWh_H2", "MWh/MWh", "NH3/H2", "LHV"), + ("MWh_el/MWh_CH4", "MWh/MWh", "el/CH4", "1/LHV"), + ("MWh_el/MWh_MeOH", "MWh/MWh", "el/MeOH", "1/LHV"), + ("MWh_el/MWh_NH3", "MWh/MWh", "el/NH3", "1/LHV"), + ("MWh_th/MWh_MeOH", "MWh/MWh", "thermal/MeOH", "1/LHV"), + ("t_CO2/MWh_CH4", "t/MWh", "CO2/CH4", "1/LHV"), + ("t_CO2/MWh_MeOH", "t/MWh", "CO2/MeOH", "1/LHV"), + ("EUR/t_CO2/h", "EUR/(t/h)", "1/CO2", None), + ("EUR/(tCO2/h)/km", "EUR/(t/h)/km", "1/CO2", None), + ("MWh_H2/t_HLOHC", "MWh/t", "H2/HLOHC", "LHV"), + ("MWh_el/t_HLOHC", "MWh/t", "el/HLOHC", None), + ("t_LOHC/t_HLOHC", "t/t", "LOHC/HLOHC", None), + ("EUR/(t_HVC/h)", "EUR/(t/h)", "1/HVC", None), + ("MWh_el/t_HVC", "MWh/t", "el/HVC", None), + ("MWh_MeOH/t_HVC", "MWh/t", "MeOH/HVC", "LHV"), + ("t_CO2/t_HVC", "t/t", "CO2/HVC", None), + ("MWh_naphtha/t_HVC", "MWh/t", "naphtha/HVC", "LHV"), + ("EUR/t_cement/h", "EUR/(t/h)", "1/cement", None), + ("MWh_el/t_cement", "MWh/t", "el/cement", None), + ("MWh_el/t_clinker", "MWh/t", "el/clinker", None), + ("EUR/t_steel/h", "EUR/(t/h)", "1/steel", None), + ("MWh_el/t_steel", "MWh/t", "el/steel", None), + ("MWh_NG/MWh_H2", "MWh/MWh", "NG/H2", "LHV"), + ("MWh_coal/MWh_H2", "MWh/MWh", "coal/H2", "LHV"), + ("MWh_oil/MWh_H2", "MWh/MWh", "oil/H2", "LHV"), + ("MWh_wood/MWh_H2", "MWh/MWh", "wood/H2", "LHV"), + ("MWh_H2/t_HLOHC", "MWh/t", "H2/HLOHC", "LHV"), + ("t_LOHC/t_HLOHC", "t/t", "LOHC/HLOHC", None), + ("MWh_NG/t_clinker", "MWh/t", "NG/clinker", "LHV"), + ("EUR/t_clinker", "EUR/t", "1/clinker", None), + ("EUR/t_cement", "EUR/t", "1/cement", None), + ("EUR/t_HVC", "EUR/t", "1/HVC", None), + ("t_clinker/t_cement", "t/t", "clinker/cement", None), + ("MW_e/km/MW_H2", "MW/km/MW", "e/H2", "1/LHV"), + ("MW_e/m/MW_H2", "MW/m/MW", "e/H2", "1/LHV"), + ], + ) # type: ignore + def test_extract_units_carriers_heating_value( + self, + input_unit: str, + expected_unit: str, + expected_carrier: str | None, + expected_heating: str | None, + ) -> None: + """Test extraction of units, carriers, and heating values.""" + result = LegacyInputDataV0134Parser._extract_units_carriers_heating_value( + input_unit + ) + assert result == (expected_unit, expected_carrier, expected_heating) + + @pytest.mark.parametrize( + ("value", "expected"), + [ + (51259.5439606197, 51259.544), + (1.94321e-08, 1.94e-08), + (0.2473, 0.247), + (32.6, 32.6), + (0.0, 0.0), + ], + ) # type: ignore + def test_round_value(self, value: float, expected: float) -> None: + """Test rounding to decimals while keeping significant digits of small values.""" + assert LegacyInputDataV0134Parser._round_value(value, 3) == expected diff --git a/test/test_parameter.py b/test/test_parameter.py index 1ad4260c..115c71a6 100644 --- a/test/test_parameter.py +++ b/test/test_parameter.py @@ -658,6 +658,13 @@ def test_parameter_mul_scalar(self) -> None: assert result.magnitude == param.magnitude * factor assert result.units == param.units + def test_parameter_to_does_not_modify_original(self) -> None: + """Test that unit conversion leaves the original Parameter unchanged.""" + param = technologydata.Parameter(magnitude=250_000, units="EUR_2020/MWh") + param.to("EUR_2020/kWh") + assert param._pint_quantity.magnitude == 250_000 + assert str(param._pint_quantity.units) == "EUR_2020 / megawatt_hour" + def test_parameter_mul_without_carrier_and_heating_value(self) -> None: """Test multiplication of two Parameters that have no carrier or heating value.""" specific_investment = technologydata.Parameter( @@ -670,13 +677,6 @@ def test_parameter_mul_without_carrier_and_heating_value(self) -> None: assert result.carrier is None assert result.heating_value is None - def test_parameter_to_does_not_modify_original(self) -> None: - """Test that unit conversion leaves the original Parameter unchanged.""" - param = technologydata.Parameter(magnitude=250_000, units="EUR_2020/MWh") - param.to("EUR_2020/kWh") - assert param._pint_quantity.magnitude == 250_000 - assert str(param._pint_quantity.units) == "EUR_2020 / megawatt_hour" - def test_parameter_div_scalar(self) -> None: """Test division of a Parameter by a scalar.""" # Test division by an float diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index c758d8ae..14e76f34 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -82,7 +82,9 @@ def test_parse_and_access_data_dea_energy_storage(self) -> None: """Test parse and load data for dea_energy_storage.""" data_accessor = DataAccessor(data_source="dea_energy_storage", version="v10") file_name = "Technology_datasheet_for_energy_storage.xlsx" - data_accessor.parse(file_name, num_digits=3, filter_params=True) + data_accessor.parse( + input_file_names=[file_name], num_digits=3, filter_params=True + ) data_package = data_accessor.load() assert data_accessor.data_source == DataSourceName.DEA_ENERGY_STORAGE @@ -94,21 +96,23 @@ def test_parse_and_access_data_dea_energy_storage(self) -> None: assert data_package.version == "v10" assert len(data_package.technologies) == 136 - def test_parse_and_access_data_manual_input_usa(self) -> None: - """Test parse and load data for manual_input_usa.csv.""" - data_accessor = DataAccessor(data_source="manual_input_usa", version="v0.13.4") - file_name = "manual_input_usa.csv" - data_accessor.parse(file_name, num_digits=3) + def test_parse_and_access_data_legacy_data(self) -> None: + """Test parse and load data for legacy_input_data (usa.csv and other.csv).""" + data_accessor = DataAccessor(data_source="legacy_input_data", version="v0.13.4") + data_accessor.parse( + input_file_names=["usa.csv", "other.csv"], + num_digits=3, + ) data_package = data_accessor.load() - assert data_accessor.data_source == DataSourceName.MANUAL_INPUT_USA + assert data_accessor.data_source == DataSourceName.LEGACY_INPUT_DATA assert data_accessor.version == "v0.13.4" assert data_package is not None assert data_package.technologies is not None assert data_package.sources is not None - assert data_package.name == "manual_input_usa" + assert data_package.name == "legacy_input_data" assert data_package.version == "v0.13.4" - assert len(data_package.technologies) == 85 + assert len(data_package.technologies) == 292 def test_load_falls_back_to_latest_for_invalid_version(self) -> None: """Test if load raises ValueError when an invalid version is provided.""" @@ -135,22 +139,22 @@ def test_download( "https://raw.githubusercontent.com/open-energy-transition/technology-data/" ) # Use specific commit SHA instead of branch name for test stability - commit_sha = "83bf906f714dac438a212ed871ad078e96c83a06/" - data_source = DataSourceName.MANUAL_INPUT_USA + commit_sha = "1813eb18a421ebbde785fecad32ea1b6ced05fa7/" + data_source = DataSourceName.LEGACY_INPUT_DATA version = "v0.13.4" target_url = f"src/technologydata/parsers/{data_source}/{version}/" url = base_url + commit_sha + target_url data_accessor = DataAccessor( - data_source="manual_input_usa", version="v0.13.4", data_path=tmp_path + data_source="legacy_input_data", version="v0.13.4", data_path=tmp_path ) dp = data_accessor.download(url) assert dp is not None assert dp.sources is not None assert dp.technologies is not None - assert dp.name == "manual_input_usa" + assert dp.name == "legacy_input_data" assert dp.version == "v0.13.4" - assert len(dp.sources) == 1 - assert len(dp.technologies) == 85 + assert len(dp.sources) == 2 + assert len(dp.technologies) == 292 sources_reference_path = pathlib.Path(path_cwd, target_url, "sources.json") technologies_reference_path = pathlib.Path( path_cwd, target_url, "technologies.json" From f4509be4f8376ff18c53ed3a99a5276b30ecf706 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Sat, 26 Sep 2026 16:31:55 +0200 Subject: [PATCH 78/81] code: update hash (#156) --- test/test_parser_data_accessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_parser_data_accessor.py b/test/test_parser_data_accessor.py index 14e76f34..cd6525a5 100644 --- a/test/test_parser_data_accessor.py +++ b/test/test_parser_data_accessor.py @@ -139,7 +139,7 @@ def test_download( "https://raw.githubusercontent.com/open-energy-transition/technology-data/" ) # Use specific commit SHA instead of branch name for test stability - commit_sha = "1813eb18a421ebbde785fecad32ea1b6ced05fa7/" + commit_sha = "4bba5670923a7c9e49cef8fa61674c76f516e1a8/" data_source = DataSourceName.LEGACY_INPUT_DATA version = "v0.13.4" target_url = f"src/technologydata/parsers/{data_source}/{version}/" From 828a454fccc5b46a2e20cbd0a572051778369333 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Sat, 26 Sep 2026 17:25:53 +0200 Subject: [PATCH 79/81] Documentation for package release and update of the improvement backlog (#157) * doc: documentation for package release * doc: doc updates * doc: update doc --- CITATIONS.cff | 2 +- docs/contributing/improvement_backlog.md | 45 +-------- docs/contributing/release_process.md | 123 +++++++++++++++++++++++ mkdocs.yaml | 1 + 4 files changed, 127 insertions(+), 44 deletions(-) create mode 100644 docs/contributing/release_process.md diff --git a/CITATIONS.cff b/CITATIONS.cff index 02720fe6..4447a684 100644 --- a/CITATIONS.cff +++ b/CITATIONS.cff @@ -6,7 +6,7 @@ cff-version: 1.2.0 message: "If you use this package, we suggest the following way of citing it." title: "technologydata: Data for Energy Systems Models" repository: https://github.com/open-energy-transition/technology-data -version: 0.2.2 # Don't touch, will be updated by the release script +version: 0.2.2 license: MIT authors: - family-names: Hampp diff --git a/docs/contributing/improvement_backlog.md b/docs/contributing/improvement_backlog.md index 44ade191..ca83da3a 100644 --- a/docs/contributing/improvement_backlog.md +++ b/docs/contributing/improvement_backlog.md @@ -10,23 +10,6 @@ rationale, so it can be picked up as an independent piece of work later. These are used or promised in the documentation today, so users following the docs hit errors. -### `TechnologyCollection.__getitem__` - -```python -def __getitem__(self, index: int | slice) -> Technology | Self: ... -``` - -`docs/user_guide/design.md` shows `tech = techs[0]` (twice), but indexing a collection currently -raises `TypeError` even though `__iter__` and `__len__` exist. Integer indices should return the -`Technology`, slices a new `TechnologyCollection`. - -### Optional filter arguments on `TechnologyCollection.get` - -All five arguments (`name`, `region`, `year`, `case`, `detailed_technology`) are currently -required, although the method body already handles `None` and `design.md` shows partial -filtering (`techs.get(technology="Solar PV", region="EUR")`). Give every argument a `= None` -default. - ### Public equation removal and lookup on `EquationRegistry` ```python @@ -38,16 +21,6 @@ def get(self, name: str) -> Equation: ... # KeyError on unknown name single-equation lookup currently require the private `_remove_equation` / `_equations_by_name`. -### `TechnologyCollection.get_parameter` - -```python -def get_parameter(self, name: str) -> list[Parameter | None]: ... -``` - -`design.md` shows cross-collection parameter access (`techs["lifetime"].values`). A method -returning one entry per technology (with `None` or a skip-policy for technologies lacking the -parameter) covers the use case without overloading `__getitem__` semantics. - ## 2. Custom registry plumbing - `Technology.calculate_parameters` (and the `TechnologyCollection` mirror) should accept @@ -72,15 +45,8 @@ parameter) covers the use case without overloading `__getitem__` semantics. ## 4. Collection and technology conveniences -- `TechnologyCollection.append(tech)` and `__add__(other) -> Self`: merge primitive for - combining harmonized datasets (design.md UC-002); currently requires - `TechnologyCollection(technologies=a.technologies + b.technologies)` by hand. -- `Technology.__contains__(key)`: `"eac" in tech` is natural given `__getitem__`/`__setitem__` - exist. `__delitem__` would complete the mapping protocol (the documented way to drop a +- `Technology.__delitem__` would complete the mapping protocol (the documented way to drop a parameter is `del tech.parameters[name]`). -- Compact `__str__` for `Technology` and `TechnologyCollection`: the pydantic repr dumps full - nested parameters, which is unreadable in a REPL. A summary (name/region/year/case + parameter - names) matches the `__str__` methods recently added to `Parameter` and `Equation`. ## 5. Deferred code simplifications (behavior-preserving) @@ -128,13 +94,6 @@ Proposal: treat a missing heating value as compatible and let the result take th set. The rule for two set heating values also needs a decision: multiplying LHV by LHV currently yields `lower_heating_value ** 2`. This is a design decision and a behavior change. -### Derived parameters drop the sources and provenance of their inputs - -`Technology.calculate_parameters` (via `EquationRegistry`) returns a parameter whose -`provenance` contains only the formula entry and whose `sources` are empty, although the -inputs carry both. The derived parameter should merge the inputs' sources and keep their -provenance before the formula entry, as the arithmetic operators already do. - ### Wrong units for `eac` `calculate_parameters("eac")` from `specific_investment`, `wacc` and `lifetime` returns @@ -182,7 +141,7 @@ The docstring says both files are exported "together with the corresponding data Since `data_path` defaults to the package's `parsers` directory (so that `load()` works from any working directory), `download()` writes there too. In a non-editable install this is inside -`site-packages` and may not be writable. Related to #92, #95 and #113. +`site-packages` and may not be writable. ## Considered and rejected diff --git a/docs/contributing/release_process.md b/docs/contributing/release_process.md new file mode 100644 index 00000000..8b98675f --- /dev/null +++ b/docs/contributing/release_process.md @@ -0,0 +1,123 @@ + + +# Release Process + +This guide describes how to create a new release of `technologydata`. + +## Overview + +The project uses [`setuptools_scm`](https://github.com/pypa/setuptools-scm) for automatic version management based on git tags. The release process is automated through a GitHub Actions workflow that: + +- Builds the package +- Creates a GitHub release with auto-generated notes +- Publishes the package to PyPI + +## Prerequisites + +Before starting a release, ensure: + +- All intended changes are merged into the branch you want to release from (the current default branch is `prototype-2`) +- CI/CD tests are passing on that branch +- You have push permissions to the repository + +## Release Checklist + +Follow these steps to create a new release: + +### 1. Update CITATION.cff + +!!! warning "Manual Step Required" + Due to a current limitation in the release workflow, you must manually update the version number in `CITATION.cff`. + +Edit `CITATION.cff` and update the version number on line 9: + +```yaml +version: X.Y.Z +``` + +Replace `X.Y.Z` with your new version number (e.g., `0.3.0`). + +### 2. Run Pre-commit Checks + +Ensure all pre-commit hooks pass: + +```bash +uv run pre-commit run --all-files +``` + +Fix any issues before proceeding. + +### 3. Verify CI is Green + +Check that all GitHub Actions workflows are passing: + +- Navigate to the [Actions tab](https://github.com/open-energy-transition/technology-data/actions) +- Confirm the latest commit on your release branch has all checks passing + +### 4. Create and Push the Tag + +Create a git tag following semantic versioning (`vMAJOR.MINOR.PATCH`): + +```bash +# Ensure you're on the correct branch +git checkout + +# Create the tag +git tag v0.3.0 + +# Push the tag to trigger the release workflow +git push origin v0.3.0 +``` + +!!! tip "Tag Format" + Tags must follow the pattern `v*.*.*` (e.g., `v0.3.0`, `v1.0.0`) to trigger the release workflow. + +### 5. Monitor the Release Workflow + +Once you push the tag: + +1. Go to the [Actions tab](https://github.com/open-energy-transition/technology-data/actions) +2. Find the "Release" workflow run triggered by your tag +3. Monitor the progress through the following jobs: + - **Build and verify package**: Builds the distribution files + - **Create GitHub release**: Creates a release with auto-generated notes + - **Publish to PyPI**: Uploads the package to PyPI + +### 6. Verify the Release + +After the workflow completes successfully: + +- **GitHub Release**: Check the [Releases page](https://github.com/open-energy-transition/technology-data/releases) for your new release +- **PyPI**: Verify the new version appears on [PyPI](https://pypi.org/project/technologydata/) +- **Installation**: Test installing the new version: + + Using pip: + + ```bash + pip install --upgrade technologydata + python -c "import technologydata; print(technologydata.__version__)" + ``` + + Or using uv: + + ```bash + uv pip install --upgrade technologydata + python -c "import technologydata; print(technologydata.__version__)" + ``` + +## Version Numbering + +The project follows [Semantic Versioning](https://semver.org/): + +- **MAJOR** (X.0.0): Incompatible API changes +- **MINOR** (0.X.0): New functionality in a backwards-compatible manner +- **PATCH** (0.0.X): Backwards-compatible bug fixes + +## Related Documentation + +- [Contributing Instructions](instructions.md) +- [Release Notes](../home/release-notes.md) diff --git a/mkdocs.yaml b/mkdocs.yaml index 12510564..956ba7e7 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -52,6 +52,7 @@ nav: - Contributing: - Instructions: contributing/instructions.md + - Release Process: contributing/release_process.md - Code of Conduct: contributing/CODE_OF_CONDUCT.md - Contributors: contributing/contributors.md - Adding a Dataset: contributing/adding_a_dataset.md From abfea3693e9c2605f14971b8f4291a6d54e9ab09 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi Date: Sat, 26 Sep 2026 17:27:30 +0200 Subject: [PATCH 80/81] code: update release v0.3.0 --- CITATIONS.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATIONS.cff b/CITATIONS.cff index 4447a684..97991543 100644 --- a/CITATIONS.cff +++ b/CITATIONS.cff @@ -6,7 +6,7 @@ cff-version: 1.2.0 message: "If you use this package, we suggest the following way of citing it." title: "technologydata: Data for Energy Systems Models" repository: https://github.com/open-energy-transition/technology-data -version: 0.2.2 +version: 0.3.0 license: MIT authors: - family-names: Hampp From 3dad8b1d68947110a8b7bb87823129199e00ec85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 16:09:23 +0200 Subject: [PATCH 81/81] build(deps): bump the github-actions group with 3 updates (#158) Bumps the github-actions group with 3 updates: [github/codeql-action/init](https://github.com/github/codeql-action), [github/codeql-action/analyze](https://github.com/github/codeql-action) and [github/codeql-action/upload-sarif](https://github.com/github/codeql-action). Updates `github/codeql-action/init` from 4.38.1 to 4.38.2 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/1c5b675653bb5c22dbe9b12b556ec555138e09fd...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2) Updates `github/codeql-action/analyze` from 4.38.1 to 4.38.2 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/1c5b675653bb5c22dbe9b12b556ec555138e09fd...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2) Updates `github/codeql-action/upload-sarif` from 4.38.1 to 4.38.2 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/1c5b675653bb5c22dbe9b12b556ec555138e09fd...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2) --- updated-dependencies: - dependency-name: github/codeql-action/init dependency-version: 4.38.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action/analyze dependency-version: 4.38.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.38.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 4 ++-- .github/workflows/scorecard.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d40ac0f0..0fcabe32 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -39,12 +39,12 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 + uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 + uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index a1647a46..cc79d4a6 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -55,6 +55,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 + uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: sarif_file: results.sarif